From 344dae154308cd230f3eeca2a129c4a7128e72cd Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Mon, 19 Jun 2017 11:25:19 +0200 Subject: [PATCH] import from la bonne adresse and first refactoring for ouidade.com --- .gitignore | 5 + .htaccess | 63 + CHANGELOG.md | 892 ++ LICENSE | 21 + README.md | 5 + assets/.gitkeep | 0 backup/.gitkeep | 0 bin/composer.phar | Bin 0 -> 1147592 bytes bin/gpm | 56 + bin/grav | 46 + composer.json | 36 + composer.lock | 1012 ++ fixperms.sh | 8 + htaccess.txt | 63 + index.php | 42 + nginx.conf | 87 + robots.txt | 2 + screenshot.png | Bin 0 -> 1028675 bytes system/assets/debugger.css | 54 + system/assets/grav.png | Bin 0 -> 548 bytes system/assets/jquery/jquery-2.1.4.min.js | 4 + system/assets/responsive-overlays/1x.png | Bin 0 -> 3238 bytes system/assets/responsive-overlays/2x.png | Bin 0 -> 7593 bytes system/assets/responsive-overlays/3x.png | Bin 0 -> 13002 bytes system/assets/responsive-overlays/4x.png | Bin 0 -> 15545 bytes system/assets/responsive-overlays/unknown.png | Bin 0 -> 5241 bytes system/assets/whoops.css | 110 + system/blueprints/config/media.yaml | 5 + system/blueprints/config/site.yaml | 116 + system/blueprints/config/streams.yaml | 7 + system/blueprints/config/system.yaml | 793 ++ system/blueprints/pages/default.yaml | 276 + system/blueprints/pages/modular.yaml | 47 + system/blueprints/pages/modular_new.yaml | 56 + system/blueprints/pages/modular_raw.yaml | 97 + system/blueprints/pages/move.yaml | 17 + system/blueprints/pages/new.yaml | 66 + system/blueprints/pages/raw.yaml | 96 + system/blueprints/user/account.yaml | 56 + system/blueprints/user/account_new.yaml | 16 + system/config/media.yaml | 190 + system/config/site.yaml | 34 + system/config/streams.yaml | 21 + system/config/system.yaml | 112 + system/defines.php | 42 + system/languages/cs.yaml | 37 + system/languages/de.yaml | 43 + system/languages/en.yaml | 94 + system/languages/fr.yaml | 60 + system/languages/it.yaml | 21 + system/languages/nl.yaml | 43 + system/languages/ru.yaml | 43 + system/src/Grav/Common/Assets.php | 1143 ++ system/src/Grav/Common/Backup/ZipBackup.php | 130 + system/src/Grav/Common/Browser.php | 58 + system/src/Grav/Common/Cache.php | 314 + system/src/Grav/Common/Composer.php | 55 + system/src/Grav/Common/Config/Blueprints.php | 207 + system/src/Grav/Common/Config/Config.php | 479 + .../src/Grav/Common/Config/ConfigFinder.php | 186 + system/src/Grav/Common/Config/Languages.php | 27 + system/src/Grav/Common/Data/Blueprint.php | 456 + system/src/Grav/Common/Data/Blueprints.php | 145 + system/src/Grav/Common/Data/Data.php | 240 + system/src/Grav/Common/Data/DataInterface.php | 68 + .../src/Grav/Common/Data/DataMutatorTrait.php | 68 + system/src/Grav/Common/Data/Validation.php | 672 ++ system/src/Grav/Common/Debugger.php | 121 + system/src/Grav/Common/Errors/Errors.php | 52 + .../Grav/Common/Errors/Resources/error.css | 52 + .../Common/Errors/Resources/layout.html.php | 30 + .../Grav/Common/Errors/SimplePageHandler.php | 96 + system/src/Grav/Common/File/CompiledFile.php | 73 + .../Grav/Common/File/CompiledMarkdownFile.php | 9 + .../src/Grav/Common/File/CompiledYamlFile.php | 9 + system/src/Grav/Common/Filesystem/Folder.php | 353 + .../RecursiveFolderFilterIterator.php | 31 + .../Grav/Common/GPM/AbstractCollection.php | 32 + .../GPM/Common/AbstractPackageCollection.php | 34 + .../Common/GPM/Common/CachedCollection.php | 21 + system/src/Grav/Common/GPM/Common/Package.php | 42 + system/src/Grav/Common/GPM/GPM.php | 398 + system/src/Grav/Common/GPM/Installer.php | 343 + .../GPM/Local/AbstractPackageCollection.php | 17 + system/src/Grav/Common/GPM/Local/Package.php | 32 + system/src/Grav/Common/GPM/Local/Packages.php | 17 + system/src/Grav/Common/GPM/Local/Plugins.php | 22 + system/src/Grav/Common/GPM/Local/Themes.php | 22 + .../src/Grav/Common/GPM/PackageInterface.php | 58 + .../GPM/Remote/AbstractPackageCollection.php | 55 + system/src/Grav/Common/GPM/Remote/Grav.php | 95 + system/src/Grav/Common/GPM/Remote/Package.php | 12 + .../src/Grav/Common/GPM/Remote/Packages.php | 17 + system/src/Grav/Common/GPM/Remote/Plugins.php | 24 + system/src/Grav/Common/GPM/Remote/Themes.php | 24 + system/src/Grav/Common/GPM/Response.php | 221 + system/src/Grav/Common/GPM/Upgrader.php | 93 + system/src/Grav/Common/Getters.php | 150 + system/src/Grav/Common/Grav.php | 510 + system/src/Grav/Common/GravTrait.php | 29 + system/src/Grav/Common/Helpers/Truncator.php | 194 + system/src/Grav/Common/Inflector.php | 310 + system/src/Grav/Common/Iterator.php | 218 + system/src/Grav/Common/Language/Language.php | 467 + .../Grav/Common/Language/LanguageCodes.php | 774 ++ system/src/Grav/Common/Markdown/Parsedown.php | 13 + .../Grav/Common/Markdown/ParsedownExtra.php | 13 + .../Common/Markdown/ParsedownGravTrait.php | 220 + system/src/Grav/Common/Page/Collection.php | 458 + system/src/Grav/Common/Page/Header.php | 11 + system/src/Grav/Common/Page/Media.php | 260 + .../Grav/Common/Page/Medium/AudioMedium.php | 45 + .../src/Grav/Common/Page/Medium/ImageFile.php | 84 + .../Grav/Common/Page/Medium/ImageMedium.php | 473 + system/src/Grav/Common/Page/Medium/Link.php | 65 + system/src/Grav/Common/Page/Medium/Medium.php | 443 + .../Grav/Common/Page/Medium/MediumFactory.php | 148 + .../Common/Page/Medium/ParsedownHtmlTrait.php | 31 + .../Page/Medium/RenderableInterface.php | 34 + .../Common/Page/Medium/StaticImageMedium.php | 28 + .../Common/Page/Medium/StaticResizeTrait.php | 20 + .../Page/Medium/ThumbnailImageMedium.php | 121 + .../Grav/Common/Page/Medium/VideoMedium.php | 45 + system/src/Grav/Common/Page/Page.php | 2208 ++++ system/src/Grav/Common/Page/Pages.php | 915 ++ system/src/Grav/Common/Page/Types.php | 110 + system/src/Grav/Common/Plugin.php | 185 + system/src/Grav/Common/Plugins.php | 137 + .../Common/Service/ConfigServiceProvider.php | 64 + .../Common/Service/ErrorServiceProvider.php | 44 + .../Common/Service/LoggerServiceProvider.php | 20 + .../Common/Service/StreamsServiceProvider.php | 40 + system/src/Grav/Common/Session.php | 53 + system/src/Grav/Common/Taxonomy.php | 120 + system/src/Grav/Common/Theme.php | 23 + system/src/Grav/Common/Themes.php | 296 + system/src/Grav/Common/Twig/Twig.php | 357 + .../src/Grav/Common/Twig/TwigEnvironment.php | 16 + system/src/Grav/Common/Twig/TwigExtension.php | 598 ++ .../Grav/Common/Twig/WriteCacheFileTrait.php | 39 + system/src/Grav/Common/Uri.php | 575 + .../src/Grav/Common/User/Authentication.php | 51 + system/src/Grav/Common/User/User.php | 157 + system/src/Grav/Common/Utils.php | 390 + system/src/Grav/Console/Cli/BackupCommand.php | 97 + system/src/Grav/Console/Cli/CleanCommand.php | 212 + .../Grav/Console/Cli/ClearCacheCommand.php | 73 + .../src/Grav/Console/Cli/ComposerCommand.php | 82 + .../src/Grav/Console/Cli/InstallCommand.php | 173 + .../Grav/Console/Cli/NewProjectCommand.php | 71 + .../src/Grav/Console/Cli/NewUserCommand.php | 160 + .../src/Grav/Console/Cli/SandboxCommand.php | 313 + system/src/Grav/Console/ConsoleTrait.php | 127 + system/src/Grav/Console/Gpm/IndexCommand.php | 119 + system/src/Grav/Console/Gpm/InfoCommand.php | 125 + .../src/Grav/Console/Gpm/InstallCommand.php | 533 + .../Grav/Console/Gpm/SelfupgradeCommand.php | 234 + .../src/Grav/Console/Gpm/UninstallCommand.php | 206 + system/src/Grav/Console/Gpm/UpdateCommand.php | 224 + .../src/Grav/Console/Gpm/VersionCommand.php | 102 + system/tests/Grav/Test/.gitkeep | 0 system/tests/Grav/TestCase.php | 8 + system/tests/bootstrap.php | 6 + system/tests/phpunit.xml | 18 + user/accounts/.gitkeep | 0 user/accounts/root.yaml | 10 + user/config/site.yaml | 41 + user/config/system.yaml | 41 + user/data/.gitkeep | 0 user/plugins/.gitkeep | 0 user/plugins/admin/CHANGELOG.md | 261 + user/plugins/admin/LICENSE | 21 + user/plugins/admin/README.md | 110 + user/plugins/admin/admin.php | 414 + user/plugins/admin/admin.yaml | 20 + user/plugins/admin/assets/admin-dashboard.png | Bin 0 -> 180920 bytes user/plugins/admin/blueprints.yaml | 166 + user/plugins/admin/classes/admin.php | 867 ++ user/plugins/admin/classes/controller.php | 1453 +++ user/plugins/admin/classes/gpm.php | 199 + user/plugins/admin/classes/popularity.php | 262 + user/plugins/admin/languages.yaml | 2583 +++++ user/plugins/admin/pages/admin/backup.md | 8 + user/plugins/admin/pages/admin/cache.md | 7 + user/plugins/admin/pages/admin/dashboard.md | 91 + user/plugins/admin/pages/admin/denied.md | 4 + user/plugins/admin/pages/admin/forgot.md | 11 + user/plugins/admin/pages/admin/info.md | 7 + user/plugins/admin/pages/admin/installer.md | 7 + user/plugins/admin/pages/admin/login.md | 15 + user/plugins/admin/pages/admin/logout.md | 14 + user/plugins/admin/pages/admin/logs.md | 7 + user/plugins/admin/pages/admin/media.md | 7 + .../plugins/admin/pages/admin/pages-filter.md | 7 + user/plugins/admin/pages/admin/pages.md | 7 + user/plugins/admin/pages/admin/plugins.md | 7 + user/plugins/admin/pages/admin/reset.md | 17 + user/plugins/admin/pages/admin/site.md | 7 + user/plugins/admin/pages/admin/statistics.md | 7 + user/plugins/admin/pages/admin/system.md | 7 + user/plugins/admin/pages/admin/themes.md | 7 + user/plugins/admin/pages/admin/update.md | 7 + user/plugins/admin/pages/admin/users.md | 7 + .../themes/grav/css-compiled/nucleus.css | 626 ++ .../themes/grav/css-compiled/nucleus.css.map | 7 + .../themes/grav/css-compiled/template.css | 2 + .../themes/grav/css-compiled/template.css.map | 7 + .../admin/themes/grav/css/chartist.min.css | 1 + .../grav/css/codemirror/base16-light.css | 36 + .../themes/grav/css/codemirror/codemirror.css | 332 + .../themes/grav/css/codemirror/paper.css | 39 + .../grav/css/datepicker/Flat/editor.png | Bin 0 -> 2873 bytes .../grav/css/datepicker/Flat/imagebrowser.png | Bin 0 -> 6215 bytes .../css/datepicker/Flat/indeterminate.gif | Bin 0 -> 799 bytes .../css/datepicker/Flat/loading-image.gif | Bin 0 -> 1611 bytes .../grav/css/datepicker/Flat/loading.gif | Bin 0 -> 567 bytes .../grav/css/datepicker/Flat/loading_2x.gif | Bin 0 -> 1110 bytes .../grav/css/datepicker/Flat/slider-h.gif | Bin 0 -> 73 bytes .../grav/css/datepicker/Flat/slider-v.gif | Bin 0 -> 73 bytes .../grav/css/datepicker/Flat/sprite.png | Bin 0 -> 12313 bytes .../grav/css/datepicker/Flat/sprite_2x.png | Bin 0 -> 29105 bytes .../grav/css/datepicker/Flat/sprite_kpi.png | Bin 0 -> 787 bytes .../css/datepicker/Flat/sprite_kpi_2x.png | Bin 0 -> 1472 bytes .../themes/grav/css/datepicker/README.md | 55 + .../grav/css/datepicker/grav.overrides.css | 3 + .../css/datepicker/kendo.common.core.min.css | 2515 +++++ .../grav/css/datepicker/kendo.flat.min.css | 1 + .../themes/grav/css/featherlight.min.css | 8 + .../themes/grav/css/font-awesome.min.css | 4 + .../admin/themes/grav/css/hint.base.min.css | 5 + .../admin/themes/grav/css/nucleus-ie10.css | 24 + .../admin/themes/grav/css/nucleus-ie9.css | 62 + user/plugins/admin/themes/grav/css/prism.css | 121 + .../themes/grav/css/pure-0.5.0/grids-min.css | 15 + .../admin/themes/grav/css/selectize.min.css | 1 + user/plugins/admin/themes/grav/css/uikit.css | 6986 +++++++++++++ .../admin/themes/grav/fonts/FontAwesome.otf | Bin 0 -> 106260 bytes .../themes/grav/fonts/fontawesome-webfont.eot | Bin 0 -> 68875 bytes .../themes/grav/fonts/fontawesome-webfont.svg | 640 ++ .../themes/grav/fonts/fontawesome-webfont.ttf | Bin 0 -> 138204 bytes .../grav/fonts/fontawesome-webfont.woff | Bin 0 -> 81284 bytes .../grav/fonts/fontawesome-webfont.woff2 | Bin 0 -> 64464 bytes .../plugins/admin/themes/grav/js/admin-all.js | 527 + user/plugins/admin/themes/grav/js/ajax.js | 96 + .../admin/themes/grav/js/chartist.min.js | 9 + .../themes/grav/js/codemirror-compressed.js | 23 + .../admin/themes/grav/js/datepicker/README.md | 11 + .../admin/themes/grav/js/datepicker/init.js | 50 + .../grav/js/datepicker/kendo.custom.min.js | 19 + user/plugins/admin/themes/grav/js/dropdown.js | 165 + .../admin/themes/grav/js/dropzone.min.js | 1 + .../admin/themes/grav/js/featherlight.min.js | 8 + .../themes/grav/js/form-attr.polyfill.js | 78 + user/plugins/admin/themes/grav/js/forms.js | 20 + .../themes/grav/js/forms/fields/array.js | 210 + .../themes/grav/js/forms/fields/checkboxes.js | 100 + .../themes/grav/js/forms/fields/input.js | 73 + .../themes/grav/js/forms/fields/selectize.js | 71 + .../themes/grav/js/forms/fields/toggle.js | 59 + .../admin/themes/grav/js/forms/form.js | 335 + .../themes/grav/js/html5shiv-printshiv.min.js | 4 + .../admin/themes/grav/js/jquery-2.1.1.min.js | 4 + .../themes/grav/js/jquery.remodal.min.js | 9 + user/plugins/admin/themes/grav/js/mdeditor.js | 541 + user/plugins/admin/themes/grav/js/mobile.js | 82 + .../themes/grav/js/modernizr.custom.71422.js | 4 + .../plugins/admin/themes/grav/js/pages-all.js | 336 + .../admin/themes/grav/js/selectize.min.js | 3 + .../admin/themes/grav/js/slugify.min.js | 3 + .../admin/themes/grav/js/sortable.min.js | 2 + .../admin/themes/grav/js/speakingurl.min.js | 7 + .../admin/themes/grav/js/toastr.min.js | 1 + user/plugins/admin/themes/grav/scss.sh | 2 + .../scss/configuration/nucleus/_base.scss | 14 + .../configuration/nucleus/_breakpoints.scss | 16 + .../scss/configuration/nucleus/_core.scss | 2 + .../scss/configuration/nucleus/_layout.scss | 8 + .../grav/scss/configuration/nucleus/_nav.scss | 3 + .../configuration/nucleus/_typography.scss | 14 + .../scss/configuration/template/_base.scss | 11 + .../scss/configuration/template/_bullets.scss | 5 + .../scss/configuration/template/_colors.scss | 78 + .../configuration/template/_typography.scss | 7 + .../configuration/template/_variables.scss | 14 + .../admin/themes/grav/scss/nucleus.scss | 27 + .../admin/themes/grav/scss/nucleus/_core.scss | 217 + .../admin/themes/grav/scss/nucleus/_flex.scss | 195 + .../themes/grav/scss/nucleus/_forms.scss | 62 + .../themes/grav/scss/nucleus/_typography.scss | 86 + .../grav/scss/nucleus/functions/_base.scss | 2 + .../scss/nucleus/functions/_direction.scss | 37 + .../grav/scss/nucleus/functions/_range.scss | 13 + .../grav/scss/nucleus/mixins/_base.scss | 2 + .../scss/nucleus/mixins/_breakpoints.scss | 30 + .../grav/scss/nucleus/mixins/_utilities.scss | 30 + .../scss/nucleus/particles/_align-text.scss | 46 + .../scss/nucleus/particles/_visibility.scss | 0 .../grav/scss/platform/joomla/_core.scss | 0 .../admin/themes/grav/scss/template.scss | 80 + .../themes/grav/scss/template/_admin.scss | 679 ++ .../themes/grav/scss/template/_buttons.scss | 135 + .../themes/grav/scss/template/_core.scss | 113 + .../themes/grav/scss/template/_custom.scss | 2 + .../themes/grav/scss/template/_dropzone.scss | 234 + .../themes/grav/scss/template/_editor.scss | 239 + .../themes/grav/scss/template/_errors.scss | 17 + .../grav/scss/template/_extensions.scss | 34 + .../themes/grav/scss/template/_fonts.scss | 3 + .../themes/grav/scss/template/_forms.scss | 535 + .../admin/themes/grav/scss/template/_gpm.scss | 143 + .../themes/grav/scss/template/_header.scss | 3 + .../themes/grav/scss/template/_login.scss | 60 + .../themes/grav/scss/template/_pages.scss | 307 + .../themes/grav/scss/template/_phpinfo.scss | 42 + .../themes/grav/scss/template/_remodal.scss | 156 + .../themes/grav/scss/template/_tables.scss | 124 + .../themes/grav/scss/template/_tabs.scss | 134 + .../themes/grav/scss/template/_toastr.scss | 195 + .../grav/scss/template/_typography.scss | 181 + .../grav/scss/template/modules/_base.scss | 2 + .../grav/scss/template/modules/_buttons.scss | 46 + .../scss/template/modules/_toggle-switch.scss | 308 + .../bourbon/_bourbon-deprecated-upcoming.scss | 8 + .../grav/scss/vendor/bourbon/_bourbon.scss | 77 + .../scss/vendor/bourbon/addons/_button.scss | 374 + .../scss/vendor/bourbon/addons/_clearfix.scss | 23 + .../bourbon/addons/_directional-values.scss | 111 + .../scss/vendor/bourbon/addons/_ellipsis.scss | 7 + .../vendor/bourbon/addons/_font-family.scss | 5 + .../vendor/bourbon/addons/_hide-text.scss | 10 + .../bourbon/addons/_html5-input-types.scss | 86 + .../scss/vendor/bourbon/addons/_position.scss | 32 + .../scss/vendor/bourbon/addons/_prefixer.scss | 45 + .../grav/scss/vendor/bourbon/addons/_rem.scss | 33 + .../vendor/bourbon/addons/_retina-image.scss | 31 + .../scss/vendor/bourbon/addons/_size.scss | 16 + .../bourbon/addons/_timing-functions.scss | 32 + .../scss/vendor/bourbon/addons/_triangle.scss | 83 + .../vendor/bourbon/addons/_word-wrap.scss | 8 + .../scss/vendor/bourbon/css3/_animation.scss | 52 + .../scss/vendor/bourbon/css3/_appearance.scss | 3 + .../bourbon/css3/_backface-visibility.scss | 6 + .../bourbon/css3/_background-image.scss | 42 + .../scss/vendor/bourbon/css3/_background.scss | 55 + .../vendor/bourbon/css3/_border-image.scss | 59 + .../vendor/bourbon/css3/_border-radius.scss | 22 + .../scss/vendor/bourbon/css3/_box-sizing.scss | 4 + .../grav/scss/vendor/bourbon/css3/_calc.scss | 4 + .../scss/vendor/bourbon/css3/_columns.scss | 47 + .../scss/vendor/bourbon/css3/_filter.scss | 5 + .../scss/vendor/bourbon/css3/_flex-box.scss | 321 + .../scss/vendor/bourbon/css3/_font-face.scss | 23 + .../bourbon/css3/_font-feature-settings.scss | 10 + .../bourbon/css3/_hidpi-media-query.scss | 10 + .../scss/vendor/bourbon/css3/_hyphens.scss | 4 + .../vendor/bourbon/css3/_image-rendering.scss | 14 + .../scss/vendor/bourbon/css3/_keyframes.scss | 35 + .../vendor/bourbon/css3/_linear-gradient.scss | 38 + .../vendor/bourbon/css3/_perspective.scss | 8 + .../vendor/bourbon/css3/_placeholder.scss | 8 + .../vendor/bourbon/css3/_radial-gradient.scss | 39 + .../scss/vendor/bourbon/css3/_transform.scss | 15 + .../scss/vendor/bourbon/css3/_transition.scss | 77 + .../vendor/bourbon/css3/_user-select.scss | 3 + .../vendor/bourbon/functions/_assign.scss | 11 + .../bourbon/functions/_color-lightness.scss | 13 + .../vendor/bourbon/functions/_flex-grid.scss | 39 + .../bourbon/functions/_golden-ratio.scss | 3 + .../vendor/bourbon/functions/_grid-width.scss | 13 + .../bourbon/functions/_modular-scale.scss | 66 + .../vendor/bourbon/functions/_px-to-em.scss | 13 + .../vendor/bourbon/functions/_px-to-rem.scss | 15 + .../bourbon/functions/_strip-units.scss | 5 + .../vendor/bourbon/functions/_tint-shade.scss | 9 + .../functions/_transition-property-name.scss | 22 + .../vendor/bourbon/functions/_unpack.scss | 17 + .../bourbon/helpers/_convert-units.scss | 15 + .../helpers/_gradient-positions-parser.scss | 13 + .../scss/vendor/bourbon/helpers/_is-num.scss | 8 + .../bourbon/helpers/_linear-angle-parser.scss | 25 + .../helpers/_linear-gradient-parser.scss | 41 + .../helpers/_linear-positions-parser.scss | 61 + .../helpers/_linear-side-corner-parser.scss | 31 + .../bourbon/helpers/_radial-arg-parser.scss | 69 + .../helpers/_radial-gradient-parser.scss | 50 + .../helpers/_radial-positions-parser.scss | 18 + .../bourbon/helpers/_render-gradients.scss | 26 + .../bourbon/helpers/_shape-size-stripper.scss | 10 + .../vendor/bourbon/helpers/_str-to-num.scss | 50 + .../vendor/bourbon/settings/_prefixer.scss | 6 + .../vendor/bourbon/settings/_px-to-em.scss | 1 + .../vendor/color-schemer/_color-schemer.scss | 31 + .../color-schemer/color-schemer/_cmyk.scss | 14 + .../color-schemer/_color-adjustments.scss | 30 + .../color-schemer/_color-schemer.scss | 208 + .../color-schemer/_colorblind.scss | 29 + .../color-schemer/_comparison.scss | 15 + .../color-schemer/_equalize.scss | 5 + .../color-schemer/_harmonize.scss | 59 + .../color-schemer/_interpolation.scss | 34 + .../color-schemer/color-schemer/_mix.scss | 40 + .../color-schemer/color-schemer/_mixins.scss | 29 + .../color-schemer/color-schemer/_ryb.scss | 76 + .../color-schemer/_tint-shade.scss | 9 + .../themes/grav/templates/ajax.json.twig | 5 + .../themes/grav/templates/cache.json.twig | 5 + .../themes/grav/templates/dashboard.html.twig | 151 + .../themes/grav/templates/denied.html.twig | 17 + .../grav/templates/email/base.html.twig | 194 + .../grav/templates/email/reset.html.twig | 12 + .../themes/grav/templates/error.html.twig | 12 + .../themes/grav/templates/error.json.twig | 1 + .../themes/grav/templates/forgot.html.twig | 17 + .../grav/templates/forms/field.html.twig | 72 + .../forms/fields/array/array.html.twig | 60 + .../fields/blueprint/blueprint.html.twig | 1 + .../forms/fields/column/column.html.twig | 10 + .../forms/fields/columns/columns.html.twig | 9 + .../fields/dateformat/dateformat.html.twig | 23 + .../forms/fields/fieldset/fieldset.html.twig | 67 + .../fields/frontmatter/frontmatter.html.twig | 46 + .../forms/fields/ignore/ignore.html.twig | 0 .../forms/fields/list/list.html.twig | 110 + .../forms/fields/markdown/markdown.html.twig | 7 + .../forms/fields/order/order.html.twig | 49 + .../fields/pagemedia/pagemedia.html.twig | 160 + .../forms/fields/pages/pages.html.twig | 51 + .../forms/fields/section/section.html.twig | 18 + .../fields/selectize/selectize.html.twig | 11 + .../templates/forms/fields/tab/tab.html.twig | 10 + .../forms/fields/tabs/tabs.html.twig | 23 + .../forms/fields/taxonomy/taxonomy.html.twig | 23 + .../fields/themeselect/themeselect.html.twig | 31 + .../forms/fields/toggle/toggle.html.twig | 43 + .../themes/grav/templates/info.html.twig | 23 + .../themes/grav/templates/installer.html.twig | 12 + .../themes/grav/templates/login.html.twig | 27 + .../themes/grav/templates/logout.html.twig | 16 + .../themes/grav/templates/logs.html.twig | 23 + .../themes/grav/templates/media.json.twig | 5 + .../grav/templates/pages-filter.json.twig | 5 + .../themes/grav/templates/pages.html.twig | 329 + .../grav/templates/partials/base.html.twig | 109 + .../partials/blueprints-new.html.twig | 17 + .../partials/blueprints-raw.html.twig | 13 + .../templates/partials/blueprints.html.twig | 21 + .../grav/templates/partials/header.html.twig | 11 + .../partials/javascript-config.html.twig | 9 + .../grav/templates/partials/login.html.twig | 15 + .../templates/partials/messages.html.twig | 3 + .../grav/templates/partials/nav.html.twig | 87 + .../partials/page-children.html.twig | 11 + .../templates/partials/page-move.html.twig | 17 + .../templates/partials/plugin-data.html.twig | 63 + .../partials/plugins-details.html.twig | 44 + .../templates/partials/plugins-list.html.twig | 42 + .../grav/templates/partials/theme.html.twig | 13 + .../partials/themes-details.html.twig | 116 + .../templates/partials/themes-list.html.twig | 66 + .../grav/templates/partials/toolbar.html.twig | 15 + .../partials/users-details.html.twig | 19 + .../templates/partials/users-list.html.twig | 6 + .../themes/grav/templates/plugins.html.twig | 61 + .../themes/grav/templates/reset.html.twig | 19 + .../themes/grav/templates/site.html.twig | 25 + .../grav/templates/statistics.html.twig | 14 + .../themes/grav/templates/system.html.twig | 25 + .../themes/grav/templates/themes.html.twig | 60 + .../themes/grav/templates/update.json.twig | 5 + .../themes/grav/templates/users.html.twig | 37 + user/plugins/admin/themes/grav/theme.yaml | 0 .../plugins/admin/twig/AdminTwigExtension.php | 54 + user/plugins/email/CHANGELOG.md | 17 + user/plugins/email/LICENSE | 21 + user/plugins/email/README.md | 35 + user/plugins/email/blueprints.yaml | 93 + user/plugins/email/classes/email.php | 145 + user/plugins/email/composer.json | 5 + user/plugins/email/email.php | 92 + user/plugins/email/email.yaml | 13 + user/plugins/email/vendor/autoload.php | 7 + .../email/vendor/composer/ClassLoader.php | 379 + .../vendor/composer/autoload_classmap.php | 9 + .../email/vendor/composer/autoload_files.php | 10 + .../vendor/composer/autoload_namespaces.php | 9 + .../email/vendor/composer/autoload_psr4.php | 9 + .../email/vendor/composer/autoload_real.php | 55 + .../email/vendor/composer/installed.json | 55 + .../vendor/swiftmailer/swiftmailer/CHANGES | 149 + .../vendor/swiftmailer/swiftmailer/LICENSE | 19 + .../vendor/swiftmailer/swiftmailer/README | 16 + .../vendor/swiftmailer/swiftmailer/VERSION | 1 + .../swiftmailer/lib/classes/Swift.php | 81 + .../lib/classes/Swift/Attachment.php | 73 + .../AbstractFilterableInputStream.php | 183 + .../Swift/ByteStream/ArrayByteStream.php | 186 + .../Swift/ByteStream/FileByteStream.php | 225 + .../ByteStream/TemporaryFileByteStream.php | 44 + .../lib/classes/Swift/CharacterReader.php | 69 + .../GenericFixedWidthReader.php | 99 + .../Swift/CharacterReader/UsAsciiReader.php | 85 + .../Swift/CharacterReader/Utf8Reader.php | 181 + .../classes/Swift/CharacterReaderFactory.php | 28 + .../SimpleCharacterReaderFactory.php | 126 + .../lib/classes/Swift/CharacterStream.php | 91 + .../CharacterStream/ArrayCharacterStream.php | 296 + .../CharacterStream/NgCharacterStream.php | 277 + .../lib/classes/Swift/ConfigurableSpool.php | 64 + .../lib/classes/Swift/DependencyContainer.php | 373 + .../lib/classes/Swift/DependencyException.php | 28 + .../lib/classes/Swift/EmbeddedFile.php | 71 + .../swiftmailer/lib/classes/Swift/Encoder.php | 29 + .../classes/Swift/Encoder/Base64Encoder.php | 60 + .../lib/classes/Swift/Encoder/QpEncoder.php | 286 + .../classes/Swift/Encoder/Rfc2231Encoder.php | 86 + .../lib/classes/Swift/Encoding.php | 66 + .../lib/classes/Swift/Events/CommandEvent.php | 67 + .../classes/Swift/Events/CommandListener.php | 26 + .../lib/classes/Swift/Events/Event.php | 40 + .../classes/Swift/Events/EventDispatcher.php | 85 + .../classes/Swift/Events/EventListener.php | 20 + .../lib/classes/Swift/Events/EventObject.php | 65 + .../classes/Swift/Events/ResponseEvent.php | 68 + .../classes/Swift/Events/ResponseListener.php | 26 + .../lib/classes/Swift/Events/SendEvent.php | 128 + .../lib/classes/Swift/Events/SendListener.php | 33 + .../Swift/Events/SimpleEventDispatcher.php | 161 + .../Swift/Events/TransportChangeEvent.php | 29 + .../Swift/Events/TransportChangeListener.php | 47 + .../Swift/Events/TransportExceptionEvent.php | 48 + .../Events/TransportExceptionListener.php | 26 + .../lib/classes/Swift/FailoverTransport.php | 47 + .../lib/classes/Swift/FileSpool.php | 209 + .../lib/classes/Swift/FileStream.php | 26 + .../lib/classes/Swift/Filterable.php | 33 + .../swiftmailer/lib/classes/Swift/Image.php | 63 + .../lib/classes/Swift/InputByteStream.php | 77 + .../lib/classes/Swift/IoException.php | 28 + .../lib/classes/Swift/KeyCache.php | 107 + .../classes/Swift/KeyCache/ArrayKeyCache.php | 210 + .../classes/Swift/KeyCache/DiskKeyCache.php | 328 + .../Swift/KeyCache/KeyCacheInputStream.php | 53 + .../classes/Swift/KeyCache/NullKeyCache.php | 117 + .../KeyCache/SimpleKeyCacheInputStream.php | 129 + .../classes/Swift/LoadBalancedTransport.php | 47 + .../lib/classes/Swift/MailTransport.php | 47 + .../swiftmailer/lib/classes/Swift/Mailer.php | 115 + .../Swift/Mailer/ArrayRecipientIterator.php | 57 + .../Swift/Mailer/RecipientIterator.php | 34 + .../lib/classes/Swift/MemorySpool.php | 84 + .../swiftmailer/lib/classes/Swift/Message.php | 273 + .../lib/classes/Swift/Mime/Attachment.php | 155 + .../classes/Swift/Mime/CharsetObserver.php | 26 + .../lib/classes/Swift/Mime/ContentEncoder.php | 36 + .../ContentEncoder/Base64ContentEncoder.php | 69 + .../ContentEncoder/NativeQpContentEncoder.php | 125 + .../ContentEncoder/PlainContentEncoder.php | 167 + .../Mime/ContentEncoder/QpContentEncoder.php | 125 + .../ContentEncoder/QpContentEncoderProxy.php | 90 + .../Mime/ContentEncoder/RawContentEncoder.php | 65 + .../lib/classes/Swift/Mime/EmbeddedFile.php | 47 + .../classes/Swift/Mime/EncodingObserver.php | 26 + .../lib/classes/Swift/Mime/Grammar.php | 178 + .../lib/classes/Swift/Mime/Header.php | 95 + .../lib/classes/Swift/Mime/HeaderEncoder.php | 26 + .../HeaderEncoder/Base64HeaderEncoder.php | 57 + .../Mime/HeaderEncoder/QpHeaderEncoder.php | 67 + .../lib/classes/Swift/Mime/HeaderFactory.php | 80 + .../lib/classes/Swift/Mime/HeaderSet.php | 171 + .../Swift/Mime/Headers/AbstractHeader.php | 504 + .../classes/Swift/Mime/Headers/DateHeader.php | 127 + .../Mime/Headers/IdentificationHeader.php | 183 + .../Swift/Mime/Headers/MailboxHeader.php | 358 + .../Swift/Mime/Headers/OpenDKIMHeader.php | 139 + .../Mime/Headers/ParameterizedHeader.php | 265 + .../classes/Swift/Mime/Headers/PathHeader.php | 146 + .../Swift/Mime/Headers/UnstructuredHeader.php | 114 + .../lib/classes/Swift/Mime/Message.php | 225 + .../lib/classes/Swift/Mime/MimeEntity.php | 117 + .../lib/classes/Swift/Mime/MimePart.php | 218 + .../Swift/Mime/ParameterizedHeader.php | 36 + .../Swift/Mime/SimpleHeaderFactory.php | 192 + .../classes/Swift/Mime/SimpleHeaderSet.php | 387 + .../lib/classes/Swift/Mime/SimpleMessage.php | 656 ++ .../classes/Swift/Mime/SimpleMimeEntity.php | 859 ++ .../lib/classes/Swift/MimePart.php | 61 + .../lib/classes/Swift/NullTransport.php | 40 + .../lib/classes/Swift/OutputByteStream.php | 48 + .../classes/Swift/Plugins/AntiFloodPlugin.php | 143 + .../Swift/Plugins/BandwidthMonitorPlugin.php | 166 + .../Swift/Plugins/Decorator/Replacements.php | 33 + .../classes/Swift/Plugins/DecoratorPlugin.php | 211 + .../Swift/Plugins/ImpersonatePlugin.php | 70 + .../lib/classes/Swift/Plugins/Logger.php | 38 + .../classes/Swift/Plugins/LoggerPlugin.php | 143 + .../Swift/Plugins/Loggers/ArrayLogger.php | 74 + .../Swift/Plugins/Loggers/EchoLogger.php | 60 + .../classes/Swift/Plugins/MessageLogger.php | 77 + .../Swift/Plugins/Pop/Pop3Connection.php | 33 + .../Swift/Plugins/Pop/Pop3Exception.php | 29 + .../Swift/Plugins/PopBeforeSmtpPlugin.php | 278 + .../Swift/Plugins/RedirectingPlugin.php | 209 + .../lib/classes/Swift/Plugins/Reporter.php | 34 + .../classes/Swift/Plugins/ReporterPlugin.php | 75 + .../Swift/Plugins/Reporters/HitReporter.php | 61 + .../Swift/Plugins/Reporters/HtmlReporter.php | 41 + .../lib/classes/Swift/Plugins/Sleeper.php | 26 + .../classes/Swift/Plugins/ThrottlerPlugin.php | 204 + .../lib/classes/Swift/Plugins/Timer.php | 26 + .../lib/classes/Swift/Preferences.php | 104 + .../Swift/ReplacementFilterFactory.php | 28 + .../classes/Swift/RfcComplianceException.php | 28 + .../lib/classes/Swift/SendmailTransport.php | 47 + .../lib/classes/Swift/SignedMessage.php | 25 + .../swiftmailer/lib/classes/Swift/Signer.php | 22 + .../lib/classes/Swift/Signers/BodySigner.php | 35 + .../lib/classes/Swift/Signers/DKIMSigner.php | 686 ++ .../classes/Swift/Signers/DomainKeySigner.php | 516 + .../classes/Swift/Signers/HeaderSigner.php | 67 + .../classes/Swift/Signers/OpenDKIMSigner.php | 184 + .../lib/classes/Swift/Signers/SMimeSigner.php | 430 + .../lib/classes/Swift/SmtpTransport.php | 59 + .../swiftmailer/lib/classes/Swift/Spool.php | 54 + .../lib/classes/Swift/SpoolTransport.php | 48 + .../lib/classes/Swift/StreamFilter.php | 36 + .../ByteArrayReplacementFilter.php | 171 + .../StreamFilters/StringReplacementFilter.php | 67 + .../StringReplacementFilterFactory.php | 46 + .../lib/classes/Swift/SwiftException.php | 28 + .../lib/classes/Swift/Transport.php | 56 + .../Swift/Transport/AbstractSmtpTransport.php | 507 + .../Esmtp/Auth/CramMd5Authenticator.php | 83 + .../Esmtp/Auth/LoginAuthenticator.php | 53 + .../Esmtp/Auth/NTLMAuthenticator.php | 701 ++ .../Esmtp/Auth/PlainAuthenticator.php | 52 + .../Esmtp/Auth/XOAuth2Authenticator.php | 71 + .../Swift/Transport/Esmtp/AuthHandler.php | 268 + .../Swift/Transport/Esmtp/Authenticator.php | 37 + .../classes/Swift/Transport/EsmtpHandler.php | 88 + .../Swift/Transport/EsmtpTransport.php | 393 + .../Swift/Transport/FailoverTransport.php | 90 + .../lib/classes/Swift/Transport/IoBuffer.php | 69 + .../Swift/Transport/LoadBalancedTransport.php | 171 + .../classes/Swift/Transport/MailInvoker.php | 34 + .../classes/Swift/Transport/MailTransport.php | 231 + .../classes/Swift/Transport/NullTransport.php | 88 + .../Swift/Transport/SendmailTransport.php | 163 + .../Swift/Transport/SimpleMailInvoker.php | 41 + .../lib/classes/Swift/Transport/SmtpAgent.php | 38 + .../Swift/Transport/SpoolTransport.php | 118 + .../classes/Swift/Transport/StreamBuffer.php | 322 + .../lib/classes/Swift/TransportException.php | 29 + .../lib/classes/Swift/Validate.php | 43 + .../lib/dependency_maps/cache_deps.php | 23 + .../lib/dependency_maps/message_deps.php | 9 + .../lib/dependency_maps/mime_deps.php | 123 + .../lib/dependency_maps/transport_deps.php | 76 + .../swiftmailer/lib/mime_types.php | 1007 ++ .../swiftmailer/lib/preferences.php | 35 + .../swiftmailer/lib/swift_init.php | 28 + .../swiftmailer/lib/swift_required.php | 30 + .../swiftmailer/lib/swift_required_pear.php | 30 + .../lib/swiftmailer_generate_mimes_config.php | 201 + user/plugins/error/CHANGELOG.md | 17 + user/plugins/error/LICENSE | 21 + user/plugins/error/README.md | 78 + user/plugins/error/assets/readme_1.png | Bin 0 -> 41685 bytes user/plugins/error/blueprints.yaml | 32 + user/plugins/error/error.php | 68 + user/plugins/error/error.yaml | 3 + user/plugins/error/pages/error.md | 8 + user/plugins/error/templates/error.html.twig | 3 + user/plugins/error/templates/error.json.twig | 1 + user/plugins/form/CHANGELOG.md | 55 + user/plugins/form/LICENSE | 21 + user/plugins/form/README.md | 31 + user/plugins/form/blueprints.yaml | 26 + user/plugins/form/classes/form.php | 148 + user/plugins/form/form.php | 276 + user/plugins/form/form.yaml | 1 + user/plugins/form/languages.yaml | 3 + .../form/templates/forms/data.html.twig | 1 + .../form/templates/forms/data.txt.twig | 1 + .../templates/forms/default/data.html.twig | 5 + .../templates/forms/default/data.txt.twig | 3 + .../templates/forms/default/form.html.twig | 18 + .../form/templates/forms/field.html.twig | 58 + .../forms/fields/captcha/captcha.html.twig | 27 + .../forms/fields/checkbox/checkbox.html.twig | 29 + .../forms/fields/checkbox/checkbox.yaml | 11 + .../fields/checkboxes/checkboxes.html.twig | 34 + .../forms/fields/date/date.html.twig | 8 + .../forms/fields/datetime/datetime.html.twig | 18 + .../forms/fields/display/display.html.twig | 11 + .../forms/fields/email/email.html.twig | 6 + .../forms/fields/hidden/hidden.html.twig | 3 + .../forms/fields/password/password.html.twig | 7 + .../forms/fields/radio/radio.html.twig | 21 + .../forms/fields/select/select.html.twig | 22 + .../forms/fields/spacer/spacer.html.twig | 13 + .../forms/fields/text/text.html.twig | 6 + .../forms/fields/textarea/textarea.html.twig | 25 + .../form/templates/forms/form.html.twig | 1 + user/plugins/login/CHANGELOG.md | 42 + user/plugins/login/LICENSE | 21 + user/plugins/login/README.md | 103 + user/plugins/login/blueprints.yaml | 51 + user/plugins/login/classes/controller.php | 217 + user/plugins/login/css/login.css | 23 + user/plugins/login/languages.yaml | 8 + user/plugins/login/login.php | 188 + user/plugins/login/login.yaml | 4 + user/plugins/login/pages/login.md | 23 + user/plugins/login/templates/login.html.twig | 5 + user/plugins/login/templates/login.json.twig | 1 + .../templates/partials/login-form.html.twig | 19 + .../templates/partials/login-status.html.twig | 5 + .../templates/partials/messages.html.twig | 3 + user/plugins/problems/CHANGELOG.md | 24 + user/plugins/problems/LICENSE | 21 + user/plugins/problems/README.md | 84 + user/plugins/problems/assets/readme_1.png | Bin 0 -> 72908 bytes user/plugins/problems/blueprints.yaml | 37 + user/plugins/problems/css/problems.css | 71 + user/plugins/problems/css/template.css | 762 ++ user/plugins/problems/html/problems.html | 28 + user/plugins/problems/problems.php | 221 + user/plugins/problems/problems.yaml | 2 + user/plugins/taxonomylist/CHANGELOG.md | 41 + user/plugins/taxonomylist/LICENSE | 21 + user/plugins/taxonomylist/README.md | 44 + user/plugins/taxonomylist/assets/readme_1.png | Bin 0 -> 12888 bytes user/plugins/taxonomylist/blueprints.yaml | 34 + .../taxonomylist/classes/taxonomylist.php | 54 + user/plugins/taxonomylist/hebe.json | 15 + user/plugins/taxonomylist/taxonomylist.php | 58 + user/plugins/taxonomylist/taxonomylist.yaml | 2 + .../templates/partials/taxonomylist.html.twig | 10 + user/themes/.gitkeep | 0 user/themes/antimatter/CHANGELOG.md | 220 + user/themes/antimatter/LICENSE | 21 + user/themes/antimatter/README.md | 136 + user/themes/antimatter/antimatter.php | 9 + user/themes/antimatter/antimatter.yaml | 10 + user/themes/antimatter/assets/readme_1.png | Bin 0 -> 424075 bytes user/themes/antimatter/blueprints.yaml | 27 + .../antimatter/blueprints/asset/file.yaml | 70 + user/themes/antimatter/blueprints/blog.yaml | 76 + user/themes/antimatter/blueprints/form.yaml | 2 + user/themes/antimatter/blueprints/item.yaml | 103 + .../blueprints/modular/features.yaml | 40 + .../blueprints/modular/showcase.yaml | 45 + .../antimatter/blueprints/modular/text.yaml | 34 + user/themes/antimatter/composer.json | 28 + .../antimatter/css-compiled/nucleus.css | 629 ++ .../antimatter/css-compiled/nucleus.css.map | 7 + .../antimatter/css-compiled/particles.css | 98 + .../antimatter/css-compiled/particles.css.map | 7 + .../antimatter/css-compiled/template.css | 868 ++ .../antimatter/css-compiled/template.css.map | 7 + .../antimatter/css/font-awesome.min.css | 4 + user/themes/antimatter/css/nucleus-ie10.css | 24 + user/themes/antimatter/css/nucleus-ie9.css | 62 + user/themes/antimatter/css/prism.css | 121 + .../antimatter/css/pure-0.5.0/grids-min.css | 15 + user/themes/antimatter/css/slidebars.min.css | 2 + user/themes/antimatter/fonts/FontAwesome.otf | Bin 0 -> 62856 bytes .../antimatter/fonts/fontawesome-webfont.eot | Bin 0 -> 72449 bytes .../antimatter/fonts/fontawesome-webfont.svg | 504 + .../antimatter/fonts/fontawesome-webfont.ttf | Bin 0 -> 141564 bytes .../antimatter/fonts/fontawesome-webfont.woff | Bin 0 -> 83760 bytes user/themes/antimatter/js/antimatter.js | 37 + .../antimatter/js/html5shiv-printshiv.min.js | 4 + .../antimatter/js/modernizr.custom.71422.js | 4 + .../themes/antimatter/js/singlePageNav.min.js | 8 + user/themes/antimatter/js/slidebars.min.js | 2 + user/themes/antimatter/languages.yaml | 2 + user/themes/antimatter/screenshot.jpg | Bin 0 -> 162937 bytes user/themes/antimatter/scss.sh | 2 + .../scss/configuration/nucleus/_base.scss | 14 + .../configuration/nucleus/_breakpoints.scss | 16 + .../scss/configuration/nucleus/_core.scss | 2 + .../scss/configuration/nucleus/_layout.scss | 8 + .../scss/configuration/nucleus/_nav.scss | 3 + .../configuration/nucleus/_typography.scss | 14 + .../scss/configuration/template/_base.scss | 11 + .../scss/configuration/template/_bullets.scss | 5 + .../scss/configuration/template/_colors.scss | 75 + .../configuration/template/_typography.scss | 7 + .../configuration/template/_variables.scss | 13 + user/themes/antimatter/scss/nucleus.scss | 27 + .../themes/antimatter/scss/nucleus/_core.scss | 217 + .../themes/antimatter/scss/nucleus/_flex.scss | 197 + .../antimatter/scss/nucleus/_forms.scss | 63 + .../antimatter/scss/nucleus/_typography.scss | 86 + .../scss/nucleus/functions/_base.scss | 2 + .../scss/nucleus/functions/_direction.scss | 37 + .../scss/nucleus/functions/_range.scss | 13 + .../antimatter/scss/nucleus/mixins/_base.scss | 2 + .../scss/nucleus/mixins/_breakpoints.scss | 30 + .../scss/nucleus/mixins/_utilities.scss | 30 + .../scss/nucleus/particles/_align-text.scss | 46 + .../scss/nucleus/particles/_visibility.scss | 0 user/themes/antimatter/scss/particles.scss | 24 + user/themes/antimatter/scss/template.scss | 67 + .../antimatter/scss/template/_blog.scss | 171 + .../antimatter/scss/template/_bullets.scss | 60 + .../antimatter/scss/template/_buttons.scss | 9 + .../antimatter/scss/template/_core.scss | 58 + .../antimatter/scss/template/_custom.scss | 15 + .../antimatter/scss/template/_errors.scss | 17 + .../antimatter/scss/template/_extensions.scss | 22 + .../antimatter/scss/template/_fonts.scss | 3 + .../antimatter/scss/template/_footer.scss | 42 + .../antimatter/scss/template/_forms.scss | 43 + .../antimatter/scss/template/_header.scss | 231 + .../antimatter/scss/template/_panel.scss | 74 + .../scss/template/_simplesearch.scss | 53 + .../antimatter/scss/template/_tables.scss | 15 + .../antimatter/scss/template/_typography.scss | 236 + .../scss/template/modular/_all.scss | 9 + .../scss/template/modular/_features.scss | 99 + .../scss/template/modular/_showcase.scss | 60 + .../scss/template/modular/_text.scss | 35 + .../scss/template/modules/_base.scss | 2 + .../scss/template/modules/_buttons.scss | 24 + .../bourbon/_bourbon-deprecated-upcoming.scss | 8 + .../scss/vendor/bourbon/_bourbon.scss | 77 + .../scss/vendor/bourbon/addons/_button.scss | 374 + .../scss/vendor/bourbon/addons/_clearfix.scss | 23 + .../bourbon/addons/_directional-values.scss | 111 + .../scss/vendor/bourbon/addons/_ellipsis.scss | 7 + .../vendor/bourbon/addons/_font-family.scss | 5 + .../vendor/bourbon/addons/_hide-text.scss | 10 + .../bourbon/addons/_html5-input-types.scss | 86 + .../scss/vendor/bourbon/addons/_position.scss | 32 + .../scss/vendor/bourbon/addons/_prefixer.scss | 45 + .../scss/vendor/bourbon/addons/_rem.scss | 33 + .../vendor/bourbon/addons/_retina-image.scss | 31 + .../scss/vendor/bourbon/addons/_size.scss | 16 + .../bourbon/addons/_timing-functions.scss | 32 + .../scss/vendor/bourbon/addons/_triangle.scss | 83 + .../vendor/bourbon/addons/_word-wrap.scss | 8 + .../scss/vendor/bourbon/css3/_animation.scss | 52 + .../scss/vendor/bourbon/css3/_appearance.scss | 3 + .../bourbon/css3/_backface-visibility.scss | 6 + .../bourbon/css3/_background-image.scss | 42 + .../scss/vendor/bourbon/css3/_background.scss | 55 + .../vendor/bourbon/css3/_border-image.scss | 59 + .../vendor/bourbon/css3/_border-radius.scss | 22 + .../scss/vendor/bourbon/css3/_box-sizing.scss | 4 + .../scss/vendor/bourbon/css3/_calc.scss | 4 + .../scss/vendor/bourbon/css3/_columns.scss | 47 + .../scss/vendor/bourbon/css3/_filter.scss | 5 + .../scss/vendor/bourbon/css3/_flex-box.scss | 321 + .../scss/vendor/bourbon/css3/_font-face.scss | 23 + .../bourbon/css3/_font-feature-settings.scss | 10 + .../bourbon/css3/_hidpi-media-query.scss | 10 + .../scss/vendor/bourbon/css3/_hyphens.scss | 4 + .../vendor/bourbon/css3/_image-rendering.scss | 14 + .../scss/vendor/bourbon/css3/_keyframes.scss | 35 + .../vendor/bourbon/css3/_linear-gradient.scss | 38 + .../vendor/bourbon/css3/_perspective.scss | 8 + .../vendor/bourbon/css3/_placeholder.scss | 8 + .../vendor/bourbon/css3/_radial-gradient.scss | 39 + .../scss/vendor/bourbon/css3/_transform.scss | 15 + .../scss/vendor/bourbon/css3/_transition.scss | 77 + .../vendor/bourbon/css3/_user-select.scss | 3 + .../vendor/bourbon/functions/_assign.scss | 11 + .../bourbon/functions/_color-lightness.scss | 13 + .../vendor/bourbon/functions/_flex-grid.scss | 39 + .../bourbon/functions/_golden-ratio.scss | 3 + .../vendor/bourbon/functions/_grid-width.scss | 13 + .../bourbon/functions/_modular-scale.scss | 66 + .../vendor/bourbon/functions/_px-to-em.scss | 13 + .../vendor/bourbon/functions/_px-to-rem.scss | 15 + .../bourbon/functions/_strip-units.scss | 5 + .../vendor/bourbon/functions/_tint-shade.scss | 9 + .../functions/_transition-property-name.scss | 22 + .../vendor/bourbon/functions/_unpack.scss | 17 + .../bourbon/helpers/_convert-units.scss | 15 + .../helpers/_gradient-positions-parser.scss | 13 + .../scss/vendor/bourbon/helpers/_is-num.scss | 8 + .../bourbon/helpers/_linear-angle-parser.scss | 25 + .../helpers/_linear-gradient-parser.scss | 41 + .../helpers/_linear-positions-parser.scss | 61 + .../helpers/_linear-side-corner-parser.scss | 31 + .../bourbon/helpers/_radial-arg-parser.scss | 69 + .../helpers/_radial-gradient-parser.scss | 50 + .../helpers/_radial-positions-parser.scss | 18 + .../bourbon/helpers/_render-gradients.scss | 26 + .../bourbon/helpers/_shape-size-stripper.scss | 10 + .../vendor/bourbon/helpers/_str-to-num.scss | 50 + .../vendor/bourbon/settings/_prefixer.scss | 6 + .../vendor/bourbon/settings/_px-to-em.scss | 1 + .../vendor/color-schemer/_color-schemer.scss | 31 + .../color-schemer/color-schemer/_cmyk.scss | 14 + .../color-schemer/_color-adjustments.scss | 30 + .../color-schemer/_color-schemer.scss | 208 + .../color-schemer/_colorblind.scss | 29 + .../color-schemer/_comparison.scss | 15 + .../color-schemer/_equalize.scss | 5 + .../color-schemer/_harmonize.scss | 59 + .../color-schemer/_interpolation.scss | 34 + .../color-schemer/color-schemer/_mix.scss | 40 + .../color-schemer/color-schemer/_mixins.scss | 29 + .../color-schemer/color-schemer/_ryb.scss | 76 + .../color-schemer/_tint-shade.scss | 9 + .../antimatter/templates/blog.html.twig | 38 + .../antimatter/templates/default.html.twig | 5 + .../antimatter/templates/error.html.twig | 12 + .../antimatter/templates/form.html.twig | 8 + .../antimatter/templates/formdata.html.twig | 12 + .../antimatter/templates/forms/data.html.twig | 1 + .../antimatter/templates/forms/data.txt.twig | 1 + .../antimatter/templates/forms/form.html.twig | 1 + .../antimatter/templates/item.html.twig | 18 + .../templates/macros/macros.html.twig | 3 + .../antimatter/templates/modular.html.twig | 56 + .../templates/modular/features.html.twig | 22 + .../templates/modular/showcase.html.twig | 13 + .../templates/modular/text.html.twig | 7 + .../templates/partials/base.html.twig | 98 + .../templates/partials/blog_item.html.twig | 78 + .../templates/partials/metadata.html.twig | 3 + .../templates/partials/navigation.html.twig | 44 + .../templates/partials/sidebar.html.twig | 42 + .../antimatter/templates/snipcart.html.twig | 20 + user/themes/antimatter/thumbnail.jpg | Bin 0 -> 24301 bytes user/themes/ouidade/.gitignore | 1 + user/themes/ouidade/CHANGELOG.md | 5 + user/themes/ouidade/LICENSE.md | 21 + user/themes/ouidade/README.md | 3 + user/themes/ouidade/blueprints.yaml | 14 + user/themes/ouidade/bower.json | 25 + .../bower_components/doc-ready/.bower.json | 44 + .../bower_components/doc-ready/README.md | 23 + .../bower_components/doc-ready/bower.json | 35 + .../bower_components/doc-ready/doc-ready.js | 80 + .../bower_components/ev-emitter/.bower.json | 38 + .../bower_components/ev-emitter/README.md | 101 + .../bower_components/ev-emitter/bower.json | 28 + .../bower_components/ev-emitter/ev-emitter.js | 109 + .../bower_components/ev-emitter/package.json | 27 + .../bower_components/eventEmitter/.bower.json | 34 + .../eventEmitter/EventEmitter.js | 474 + .../eventEmitter/EventEmitter.min.js | 7 + .../bower_components/eventEmitter/README.md | 85 + .../bower_components/eventEmitter/UNLICENSE | 24 + .../bower_components/eventEmitter/bower.json | 24 + .../eventEmitter/component.json | 9 + .../bower_components/eventie/.bower.json | 35 + .../bower_components/eventie/README.md | 33 + .../bower_components/eventie/bower.json | 26 + .../bower_components/eventie/eventie.js | 82 + .../bower_components/eventie/package.json | 23 + .../bower_components/fastclick/.bower.json | 23 + .../bower_components/fastclick/LICENSE | 22 + .../bower_components/fastclick/README.md | 140 + .../bower_components/fastclick/bower.json | 12 + .../fastclick/lib/fastclick.js | 841 ++ .../fizzy-ui-utils/.bower.json | 41 + .../bower_components/fizzy-ui-utils/README.md | 73 + .../fizzy-ui-utils/bower.json | 31 + .../bower_components/fizzy-ui-utils/utils.js | 270 + .../bower_components/foundation/.bower.json | 32 + .../bower_components/foundation/LICENSE | 22 + .../bower_components/foundation/README.md | 46 + .../bower_components/foundation/bower.json | 21 + .../foundation/css/foundation.css | 6581 ++++++++++++ .../foundation/css/foundation.css.map | 7 + .../foundation/css/foundation.min.css | 1 + .../foundation/css/normalize.css | 356 + .../foundation/css/normalize.css.map | 7 + .../foundation/css/normalize.min.css | 1 + .../foundation/js/foundation.js | 6581 ++++++++++++ .../foundation/js/foundation.min.js | 5 + .../js/foundation/foundation.abide.js | 426 + .../js/foundation/foundation.accordion.js | 125 + .../js/foundation/foundation.alert.js | 43 + .../js/foundation/foundation.clearing.js | 586 ++ .../js/foundation/foundation.dropdown.js | 468 + .../js/foundation/foundation.equalizer.js | 104 + .../js/foundation/foundation.interchange.js | 360 + .../js/foundation/foundation.joyride.js | 935 ++ .../foundation/js/foundation/foundation.js | 732 ++ .../js/foundation/foundation.magellan.js | 214 + .../js/foundation/foundation.offcanvas.js | 225 + .../js/foundation/foundation.orbit.js | 476 + .../js/foundation/foundation.reveal.js | 522 + .../js/foundation/foundation.slider.js | 296 + .../js/foundation/foundation.tab.js | 247 + .../js/foundation/foundation.tooltip.js | 348 + .../js/foundation/foundation.topbar.js | 458 + .../foundation/js/vendor/fastclick.js | 8 + .../foundation/js/vendor/jquery.cookie.js | 8 + .../foundation/js/vendor/jquery.js | 26 + .../foundation/js/vendor/modernizr.js | 8 + .../foundation/js/vendor/placeholder.js | 2 + .../bower_components/foundation/package.json | 57 + .../foundation/scss/foundation.scss | 42 + .../scss/foundation/_functions.scss | 156 + .../foundation/scss/foundation/_settings.scss | 1489 +++ .../foundation/components/_accordion.scss | 161 + .../foundation/components/_alert-boxes.scss | 128 + .../foundation/components/_block-grid.scss | 133 + .../foundation/components/_breadcrumbs.scss | 132 + .../foundation/components/_button-groups.scss | 208 + .../scss/foundation/components/_buttons.scss | 261 + .../scss/foundation/components/_clearing.scss | 260 + .../components/_dropdown-buttons.scss | 130 + .../scss/foundation/components/_dropdown.scss | 269 + .../foundation/components/_flex-video.scss | 51 + .../scss/foundation/components/_forms.scss | 607 ++ .../scss/foundation/components/_global.scss | 566 + .../scss/foundation/components/_grid.scss | 292 + .../scss/foundation/components/_icon-bar.scss | 460 + .../foundation/components/_inline-lists.scss | 58 + .../scss/foundation/components/_joyride.scss | 220 + .../foundation/components/_keystrokes.scss | 60 + .../scss/foundation/components/_labels.scss | 106 + .../scss/foundation/components/_magellan.scss | 34 + .../foundation/components/_offcanvas.scss | 606 ++ .../scss/foundation/components/_orbit.scss | 388 + .../foundation/components/_pagination.scss | 163 + .../scss/foundation/components/_panels.scss | 107 + .../components/_pricing-tables.scss | 150 + .../foundation/components/_progress-bars.scss | 85 + .../foundation/components/_range-slider.scss | 177 + .../scss/foundation/components/_reveal.scss | 212 + .../scss/foundation/components/_side-nav.scss | 120 + .../foundation/components/_split-buttons.scss | 203 + .../scss/foundation/components/_sub-nav.scss | 125 + .../scss/foundation/components/_switches.scss | 241 + .../scss/foundation/components/_tables.scss | 135 + .../scss/foundation/components/_tabs.scss | 142 + .../scss/foundation/components/_thumbs.scss | 66 + .../scss/foundation/components/_tooltips.scss | 142 + .../scss/foundation/components/_top-bar.scss | 745 ++ .../scss/foundation/components/_type.scss | 525 + .../foundation/components/_visibility.scss | 425 + .../foundation/scss/normalize.scss | 424 + .../bower_components/get-size/.bower.json | 47 + .../bower_components/get-size/README.md | 41 + .../bower_components/get-size/bower.json | 38 + .../bower_components/get-size/get-size.js | 250 + .../bower_components/get-size/index.html | 85 + .../get-style-property/.bower.json | 36 + .../get-style-property/README.md | 27 + .../get-style-property/bower.json | 27 + .../get-style-property/component.json | 8 + .../get-style-property/get-style-property.js | 55 + .../get-style-property/package.json | 23 + .../bower_components/imagesloaded/.bower.json | 46 + .../bower_components/imagesloaded/README.md | 379 + .../bower_components/imagesloaded/bower.json | 35 + .../bower_components/imagesloaded/gulpfile.js | 172 + .../imagesloaded/imagesloaded.js | 370 + .../imagesloaded/imagesloaded.pkgd.js | 487 + .../imagesloaded/imagesloaded.pkgd.min.js | 7 + .../jquery-placeholder/.bower.json | 33 + .../jquery-placeholder/bower.json | 21 + .../jquery-placeholder/jquery.placeholder.js | 192 + .../jquery.cookie/.bower.json | 28 + .../bower_components/jquery.cookie/bower.json | 18 + .../jquery.cookie/jquery.cookie.js | 117 + .../bower_components/jquery/.bower.json | 38 + .../bower_components/jquery/MIT-LICENSE.txt | 21 + .../bower_components/jquery/bower.json | 28 + .../bower_components/jquery/dist/jquery.js | 9210 ++++++++++++++++ .../jquery/dist/jquery.min.js | 5 + .../jquery/dist/jquery.min.map | 1 + .../bower_components/jquery/src/ajax.js | 786 ++ .../bower_components/jquery/src/ajax/jsonp.js | 89 + .../bower_components/jquery/src/ajax/load.js | 75 + .../jquery/src/ajax/parseJSON.js | 13 + .../jquery/src/ajax/parseXML.js | 28 + .../jquery/src/ajax/script.js | 64 + .../jquery/src/ajax/var/nonce.js | 5 + .../jquery/src/ajax/var/rquery.js | 3 + .../bower_components/jquery/src/ajax/xhr.js | 136 + .../bower_components/jquery/src/attributes.js | 11 + .../jquery/src/attributes/attr.js | 141 + .../jquery/src/attributes/classes.js | 158 + .../jquery/src/attributes/prop.js | 94 + .../jquery/src/attributes/support.js | 35 + .../jquery/src/attributes/val.js | 161 + .../bower_components/jquery/src/callbacks.js | 205 + .../bower_components/jquery/src/core.js | 502 + .../jquery/src/core/access.js | 60 + .../bower_components/jquery/src/core/init.js | 123 + .../jquery/src/core/parseHTML.js | 39 + .../bower_components/jquery/src/core/ready.js | 97 + .../jquery/src/core/var/rsingleTag.js | 4 + .../bower_components/jquery/src/css.js | 450 + .../jquery/src/css/addGetHookIf.js | 22 + .../bower_components/jquery/src/css/curCSS.js | 57 + .../jquery/src/css/defaultDisplay.js | 70 + .../jquery/src/css/hiddenVisibleSelectors.js | 15 + .../jquery/src/css/support.js | 96 + .../bower_components/jquery/src/css/swap.js | 28 + .../jquery/src/css/var/cssExpand.js | 3 + .../jquery/src/css/var/getStyles.js | 12 + .../jquery/src/css/var/isHidden.js | 13 + .../jquery/src/css/var/rmargin.js | 3 + .../jquery/src/css/var/rnumnonpx.js | 5 + .../bower_components/jquery/src/data.js | 178 + .../bower_components/jquery/src/data/Data.js | 181 + .../jquery/src/data/accepts.js | 20 + .../jquery/src/data/var/data_priv.js | 5 + .../jquery/src/data/var/data_user.js | 5 + .../bower_components/jquery/src/deferred.js | 149 + .../bower_components/jquery/src/deprecated.js | 13 + .../bower_components/jquery/src/dimensions.js | 50 + .../bower_components/jquery/src/effects.js | 648 ++ .../jquery/src/effects/Tween.js | 114 + .../jquery/src/effects/animatedSelector.js | 13 + .../bower_components/jquery/src/event.js | 868 ++ .../bower_components/jquery/src/event/ajax.js | 13 + .../jquery/src/event/alias.js | 39 + .../jquery/src/event/support.js | 9 + .../jquery/src/exports/amd.js | 24 + .../jquery/src/exports/global.js | 32 + .../bower_components/jquery/src/intro.js | 44 + .../bower_components/jquery/src/jquery.js | 37 + .../jquery/src/manipulation.js | 580 ++ .../jquery/src/manipulation/_evalUrl.js | 18 + .../jquery/src/manipulation/support.js | 32 + .../src/manipulation/var/rcheckableType.js | 3 + .../bower_components/jquery/src/offset.js | 207 + .../bower_components/jquery/src/outro.js | 1 + .../bower_components/jquery/src/queue.js | 142 + .../jquery/src/queue/delay.js | 22 + .../jquery/src/selector-native.js | 172 + .../jquery/src/selector-sizzle.js | 14 + .../bower_components/jquery/src/selector.js | 1 + .../bower_components/jquery/src/serialize.js | 111 + .../jquery/src/sizzle/dist/sizzle.js | 2067 ++++ .../jquery/src/sizzle/dist/sizzle.min.js | 3 + .../jquery/src/sizzle/dist/sizzle.min.map | 1 + .../bower_components/jquery/src/traversing.js | 199 + .../jquery/src/traversing/findFilter.js | 100 + .../src/traversing/var/rneedsContext.js | 6 + .../bower_components/jquery/src/var/arr.js | 3 + .../jquery/src/var/class2type.js | 4 + .../bower_components/jquery/src/var/concat.js | 5 + .../bower_components/jquery/src/var/hasOwn.js | 5 + .../jquery/src/var/indexOf.js | 5 + .../bower_components/jquery/src/var/pnum.js | 3 + .../bower_components/jquery/src/var/push.js | 5 + .../jquery/src/var/rnotwhite.js | 3 + .../bower_components/jquery/src/var/slice.js | 5 + .../jquery/src/var/strundefined.js | 3 + .../jquery/src/var/support.js | 4 + .../jquery/src/var/toString.js | 5 + .../bower_components/jquery/src/wrap.js | 79 + .../bower_components/masonry/.bower.json | 54 + .../bower_components/masonry/README.mdown | 76 + .../bower_components/masonry/bower.json | 44 + .../bower_components/masonry/changelog.md | 83 + .../masonry/dist/masonry.pkgd.js | 3187 ++++++ .../masonry/dist/masonry.pkgd.min.js | 9 + .../bower_components/masonry/masonry.js | 203 + .../masonry/sandbox/add-items.html | 110 + .../masonry/sandbox/basic.html | 62 + .../masonry/sandbox/bottom-up.html | 119 + .../masonry/sandbox/browserify/index.html | 42 + .../masonry/sandbox/browserify/main.js | 19 + .../masonry/sandbox/element-sizing.html | 69 + .../masonry/sandbox/fit-width.html | 68 + .../masonry/sandbox/fluid.html | 89 + .../masonry/sandbox/jquery.html | 64 + .../masonry/sandbox/require-js/index.html | 41 + .../masonry/sandbox/require-js/main.js | 69 + .../masonry/sandbox/right-to-left.html | 120 + .../masonry/sandbox/sandbox.css | 33 + .../masonry/sandbox/stamps.html | 124 + .../matches-selector/.bower.json | 43 + .../matches-selector/README.md | 25 + .../matches-selector/bower.json | 34 + .../matches-selector/matches-selector.js | 107 + .../bower_components/modernizr/.bower.json | 14 + .../bower_components/modernizr/.editorconfig | 10 + .../bower_components/modernizr/.gitignore | 2 + .../bower_components/modernizr/.travis.yml | 6 + .../modernizr/feature-detects/a-download.js | 8 + .../feature-detects/audio-audiodata-api.js | 4 + .../feature-detects/audio-webaudio-api.js | 4 + .../modernizr/feature-detects/battery-api.js | 8 + .../feature-detects/battery-level.js | 11 + .../feature-detects/blob-constructor.js | 10 + .../feature-detects/canvas-todataurl-type.js | 28 + .../feature-detects/contenteditable.js | 9 + .../feature-detects/contentsecuritypolicy.js | 10 + .../modernizr/feature-detects/contextmenu.js | 11 + .../modernizr/feature-detects/cookies.js | 15 + .../modernizr/feature-detects/cors.js | 3 + .../css-backgroundposition-shorthand.js | 19 + .../css-backgroundposition-xy.js | 15 + .../feature-detects/css-backgroundrepeat.js | 31 + .../css-backgroundsizecover.js | 10 + .../feature-detects/css-boxsizing.js | 9 + .../modernizr/feature-detects/css-calc.js | 12 + .../feature-detects/css-cubicbezierrange.js | 8 + .../feature-detects/css-displayrunin.js | 18 + .../feature-detects/css-displaytable.js | 27 + .../modernizr/feature-detects/css-filters.js | 7 + .../modernizr/feature-detects/css-hyphens.js | 205 + .../feature-detects/css-lastchild.js | 11 + .../modernizr/feature-detects/css-mask.js | 12 + .../feature-detects/css-mediaqueries.js | 3 + .../feature-detects/css-objectfit.js | 6 + .../feature-detects/css-overflow-scrolling.js | 9 + .../feature-detects/css-pointerevents.js | 25 + .../feature-detects/css-positionsticky.js | 13 + .../modernizr/feature-detects/css-regions.js | 55 + .../modernizr/feature-detects/css-remunit.js | 19 + .../modernizr/feature-detects/css-resize.js | 8 + .../feature-detects/css-scrollbars.js | 19 + .../modernizr/feature-detects/css-shapes.js | 4 + .../feature-detects/css-subpixelfont.js | 23 + .../modernizr/feature-detects/css-supports.js | 6 + .../feature-detects/css-userselect.js | 10 + .../modernizr/feature-detects/css-vhunit.js | 14 + .../modernizr/feature-detects/css-vmaxunit.js | 14 + .../modernizr/feature-detects/css-vminunit.js | 14 + .../modernizr/feature-detects/css-vwunit.js | 14 + .../custom-protocol-handler.js | 10 + .../modernizr/feature-detects/dart.js | 6 + .../modernizr/feature-detects/dataview-api.js | 4 + .../feature-detects/dom-classlist.js | 4 + .../dom-createElement-attrs.js | 11 + .../modernizr/feature-detects/dom-dataset.js | 9 + .../feature-detects/dom-microdata.js | 4 + .../feature-detects/elem-datalist.js | 12 + .../modernizr/feature-detects/elem-details.js | 25 + .../modernizr/feature-detects/elem-output.js | 4 + .../feature-detects/elem-progress-meter.js | 11 + .../modernizr/feature-detects/elem-ruby.js | 53 + .../modernizr/feature-detects/elem-time.js | 4 + .../modernizr/feature-detects/elem-track.js | 11 + .../modernizr/feature-detects/emoji.js | 11 + .../feature-detects/es5-strictmode.js | 7 + .../event-deviceorientation-motion.js | 11 + .../feature-detects/exif-orientation.js | 32 + .../modernizr/feature-detects/file-api.js | 12 + .../feature-detects/file-filesystem.js | 9 + .../feature-detects/forms-fileinput.js | 13 + .../feature-detects/forms-formattribute.js | 29 + .../feature-detects/forms-inputnumber-l10n.js | 32 + .../feature-detects/forms-placeholder.js | 10 + .../feature-detects/forms-speechinput.js | 19 + .../feature-detects/forms-validation.js | 62 + .../feature-detects/fullscreen-api.js | 10 + .../modernizr/feature-detects/gamepad.js | 12 + .../modernizr/feature-detects/getusermedia.js | 5 + .../modernizr/feature-detects/ie8compat.js | 12 + .../feature-detects/iframe-sandbox.js | 5 + .../feature-detects/iframe-seamless.js | 5 + .../feature-detects/iframe-srcdoc.js | 5 + .../modernizr/feature-detects/img-apng.js | 26 + .../modernizr/feature-detects/img-webp.js | 20 + .../modernizr/feature-detects/json.js | 7 + .../feature-detects/lists-reversed.js | 6 + .../modernizr/feature-detects/mathml.js | 23 + .../feature-detects/network-connection.js | 22 + .../feature-detects/network-eventsource.js | 5 + .../modernizr/feature-detects/network-xhr2.js | 13 + .../modernizr/feature-detects/notification.js | 10 + .../modernizr/feature-detects/performance.js | 5 + .../feature-detects/pointerlock-api.js | 4 + .../feature-detects/quota-management-api.js | 11 + .../feature-detects/requestanimationframe.js | 7 + .../modernizr/feature-detects/script-async.js | 3 + .../modernizr/feature-detects/script-defer.js | 3 + .../modernizr/feature-detects/style-scoped.js | 6 + .../modernizr/feature-detects/svg-filters.js | 13 + .../modernizr/feature-detects/unicode.js | 32 + .../modernizr/feature-detects/url-data-uri.js | 26 + .../modernizr/feature-detects/userdata.js | 7 + .../modernizr/feature-detects/vibration.js | 4 + .../modernizr/feature-detects/web-intents.js | 6 + .../feature-detects/webgl-extensions.js | 42 + .../feature-detects/websockets-binary.js | 20 + .../feature-detects/window-framed.js | 8 + .../feature-detects/workers-blobworkers.js | 66 + .../feature-detects/workers-dataworkers.js | 34 + .../feature-detects/workers-sharedworkers.js | 3 + .../bower_components/modernizr/grunt.js | 69 + .../modernizr/media/Modernizr 2 Logo.ai | 291 + .../modernizr/media/Modernizr 2 Logo.eps | Bin 0 -> 350902 bytes .../modernizr/media/Modernizr 2 Logo.pdf | 291 + .../modernizr/media/Modernizr 2 Logo.png | Bin 0 -> 14823 bytes .../modernizr/media/Modernizr 2 Logo.svg | 35 + .../bower_components/modernizr/modernizr.js | 1406 +++ .../bower_components/modernizr/readme.md | 28 + .../modernizr/test/basic.html | 65 + .../modernizr/test/caniuse.html | 1451 +++ .../test/caniuse_files/Windsong-webfont.eot | Bin 0 -> 40166 bytes .../test/caniuse_files/Windsong-webfont.otf | Bin 0 -> 78680 bytes .../test/caniuse_files/Windsong-webfont.svg | 147 + .../test/caniuse_files/Windsong-webfont.ttf | Bin 0 -> 39936 bytes .../test/caniuse_files/Windsong-webfont.woff | Bin 0 -> 27284 bytes .../modernizr/test/caniuse_files/alpha.png | Bin 0 -> 163 bytes .../test/caniuse_files/apng_test.png | Bin 0 -> 195 bytes .../test/caniuse_files/before-after.png | Bin 0 -> 452 bytes .../test/caniuse_files/form_validation.html | 15 + .../modernizr/test/caniuse_files/ga.js | 43 + .../modernizr/test/caniuse_files/green5x5.png | Bin 0 -> 72 bytes .../test/caniuse_files/hashchange.html | 16 + .../test/caniuse_files/jquery.min.js | 18 + .../modernizr/test/caniuse_files/mathml.html | 120 + .../test/caniuse_files/mathml_ref.png | Bin 0 -> 3140 bytes .../test/caniuse_files/modernizr-1.7.min.js | 2 + .../test/caniuse_files/png_alpha_result.png | Bin 0 -> 214 bytes .../test/caniuse_files/pushstate.html | 40 + .../modernizr/test/caniuse_files/red30x30.png | Bin 0 -> 93 bytes .../modernizr/test/caniuse_files/ruby.png | Bin 0 -> 1339 bytes .../test/caniuse_files/stroked-text.png | Bin 0 -> 1291 bytes .../modernizr/test/caniuse_files/style.css | 168 + .../test/caniuse_files/svg-html-blur.png | Bin 0 -> 1232 bytes .../modernizr/test/caniuse_files/svg-img.svg | 5 + .../test/caniuse_files/svg-img.svg.1 | 5 + .../modernizr/test/caniuse_files/svg_blur.png | Bin 0 -> 3742 bytes .../modernizr/test/caniuse_files/table.png | Bin 0 -> 2519 bytes .../test/caniuse_files/text-shadow1.png | Bin 0 -> 796 bytes .../test/caniuse_files/text-shadow2.png | Bin 0 -> 1680 bytes .../test/caniuse_files/windsong_font.png | Bin 0 -> 1339 bytes .../modernizr/test/caniuse_files/xhtml.html | 14 + .../modernizr/test/index.html | 104 + .../modernizr/test/js/basic.html | 65 + .../modernizr/test/js/dumpdata.js | 75 + .../modernizr/test/js/lib/detect-global.js | 153 + .../modernizr/test/js/lib/jquery-1.7b2.js | 9279 +++++++++++++++++ .../modernizr/test/js/lib/jsonselect.js | 279 + .../modernizr/test/js/lib/polyfills.js | 96 + .../modernizr/test/js/lib/uaparser.js | 215 + .../modernizr/test/js/setup.js | 44 + .../modernizr/test/js/unit-caniuse.js | 191 + .../modernizr/test/js/unit.js | 669 ++ .../modernizr/test/qunit/qunit.css | 231 + .../modernizr/test/qunit/qunit.js | 1932 ++++ .../modernizr/test/qunit/run-qunit.js | 72 + .../bower_components/outlayer/.bower.json | 57 + .../bower_components/outlayer/README.md | 129 + .../bower_components/outlayer/bower.json | 48 + .../ouidade/bower_components/outlayer/item.js | 584 ++ .../bower_components/outlayer/outlayer.js | 926 ++ user/themes/ouidade/css/styles.css | 7500 +++++++++++++ user/themes/ouidade/font/fontwebkit.css | 49 + .../ouidade/font/webfonts/2F5366_0_0.eot | Bin 0 -> 45834 bytes .../ouidade/font/webfonts/2F5366_0_0.ttf | Bin 0 -> 172688 bytes .../ouidade/font/webfonts/2F5366_0_0.woff | Bin 0 -> 76147 bytes .../ouidade/font/webfonts/2F5366_0_0.woff2 | Bin 0 -> 53844 bytes .../ouidade/font/webfonts/2F5366_1_0.eot | Bin 0 -> 40896 bytes .../ouidade/font/webfonts/2F5366_1_0.ttf | Bin 0 -> 163268 bytes .../ouidade/font/webfonts/2F5366_1_0.woff | Bin 0 -> 68990 bytes .../ouidade/font/webfonts/2F5366_1_0.woff2 | Bin 0 -> 47705 bytes user/themes/ouidade/gulpfile.js | 37 + user/themes/ouidade/js/dist/script.min.js | 3 + user/themes/ouidade/js/script.js | 50 + user/themes/ouidade/ouidade.php | 9 + user/themes/ouidade/ouidade.yaml | 1 + user/themes/ouidade/package.json | 20 + user/themes/ouidade/screenshot.png | Bin 0 -> 1028675 bytes user/themes/ouidade/scss/_settings.scss | 1486 +++ user/themes/ouidade/scss/styles.scss | 491 + .../ouidade/templates/categories.html.twig | 44 + .../ouidade/templates/default.html.twig | 7 + user/themes/ouidade/templates/home.html.twig | 15 + .../ouidade/templates/partials/base.html.twig | 68 + .../templates/partials/footer.html.twig | 11 + .../templates/partials/header.html.twig | 32 + .../templates/partials/projet-block.html.twig | 22 + .../templates/partials/tagslist.html.twig | 19 + .../themes/ouidade/templates/projet.html.twig | 69 + vendor/autoload.php | 7 + vendor/composer/ClassLoader.php | 413 + vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 786 ++ vendor/composer/autoload_files.php | 13 + vendor/composer/autoload_namespaces.php | 19 + vendor/composer/autoload_psr4.php | 23 + vendor/composer/autoload_real.php | 55 + vendor/composer/installed.json | 1030 ++ .../donatj/phpuseragentparser/CONTRIBUTING.md | 18 + vendor/donatj/phpuseragentparser/LICENSE.md | 22 + vendor/donatj/phpuseragentparser/README.md | 114 + .../Source/UserAgentParser.php | 167 + vendor/erusev/parsedown-extra/LICENSE.txt | 20 + .../erusev/parsedown-extra/ParsedownExtra.php | 526 + vendor/erusev/parsedown-extra/README.md | 27 + vendor/erusev/parsedown/LICENSE.txt | 20 + vendor/erusev/parsedown/Parsedown.php | 1528 +++ vendor/erusev/parsedown/README.md | 57 + vendor/filp/whoops/.gitattributes | 10 + vendor/filp/whoops/CONTRIBUTING.md | 11 + vendor/filp/whoops/LICENSE.md | 19 + vendor/filp/whoops/README.md | 84 + .../src/Whoops/Exception/ErrorException.php | 17 + .../whoops/src/Whoops/Exception/Formatter.php | 74 + .../whoops/src/Whoops/Exception/Frame.php | 269 + .../src/Whoops/Exception/FrameCollection.php | 191 + .../whoops/src/Whoops/Exception/Inspector.php | 209 + .../src/Whoops/Handler/CallbackHandler.php | 52 + .../whoops/src/Whoops/Handler/Handler.php | 89 + .../src/Whoops/Handler/HandlerInterface.php | 37 + .../Whoops/Handler/JsonResponseHandler.php | 91 + .../src/Whoops/Handler/PlainTextHandler.php | 331 + .../src/Whoops/Handler/PrettyPageHandler.php | 529 + .../Whoops/Handler/SoapResponseHandler.php | 49 + .../src/Whoops/Handler/XmlResponseHandler.php | 99 + .../Phalcon/WhoopsServiceProvider.php | 78 + .../Provider/Silex/WhoopsServiceProvider.php | 111 + .../src/Whoops/Resources/css/whoops.base.css | 428 + .../src/Whoops/Resources/js/whoops.base.js | 86 + .../src/Whoops/Resources/js/zepto.min.js | 2 + .../Resources/views/env_details.html.php | 40 + .../Resources/views/frame_code.html.php | 52 + .../Resources/views/frame_list.html.php | 17 + .../Whoops/Resources/views/header.html.php | 34 + .../Whoops/Resources/views/layout.html.php | 37 + vendor/filp/whoops/src/Whoops/Run.php | 408 + vendor/filp/whoops/src/Whoops/Util/Misc.php | 44 + .../whoops/src/Whoops/Util/TemplateHelper.php | 154 + .../src/deprecated/Zend/ExceptionStrategy.php | 63 + .../whoops/src/deprecated/Zend/Module.php | 107 + .../deprecated/Zend/RouteNotFoundStrategy.php | 67 + .../deprecated/Zend/module.config.example.php | 20 + .../image/Gregwar/Image/Adapter/Adapter.php | 58 + .../Image/Adapter/AdapterInterface.php | 388 + .../image/Gregwar/Image/Adapter/Common.php | 351 + .../image/Gregwar/Image/Adapter/GD.php | 567 + .../image/Gregwar/Image/Adapter/Imagick.php | 389 + .../Image/Exceptions/GenerationError.php | 16 + .../image/Gregwar/Image/GarbageCollect.php | 83 + vendor/gregwar/image/Gregwar/Image/Image.php | 752 ++ .../image/Gregwar/Image/ImageColor.php | 93 + vendor/gregwar/image/Gregwar/Image/LICENSE | 19 + vendor/gregwar/image/Gregwar/Image/README.md | 275 + .../image/Gregwar/Image/Source/Create.php | 38 + .../image/Gregwar/Image/Source/Data.php | 26 + .../image/Gregwar/Image/Source/File.php | 63 + .../image/Gregwar/Image/Source/Resource.php | 21 + .../image/Gregwar/Image/Source/Source.php | 34 + .../gregwar/image/Gregwar/Image/autoload.php | 21 + .../ircmaxell/password-compat/.gitattributes | 8 + vendor/ircmaxell/password-compat/LICENSE.md | 7 + vendor/ircmaxell/password-compat/README.md | 76 + .../password-compat/lib/password.php | 314 + vendor/maximebf/debugbar/.gitattributes | 12 + vendor/maximebf/debugbar/CHANGELOG.md | 95 + vendor/maximebf/debugbar/CONTRIBUTING.md | 23 + vendor/maximebf/debugbar/LICENSE | 19 + vendor/maximebf/debugbar/README.md | 100 + .../DebugBar/Bridge/CacheCacheCollector.php | 62 + .../src/DebugBar/Bridge/DoctrineCollector.php | 98 + .../src/DebugBar/Bridge/MonologCollector.php | 103 + .../src/DebugBar/Bridge/Propel2Collector.php | 307 + .../src/DebugBar/Bridge/PropelCollector.php | 253 + .../src/DebugBar/Bridge/SlimCollector.php | 66 + .../Bridge/SwiftMailer/SwiftLogCollector.php | 44 + .../Bridge/SwiftMailer/SwiftMailCollector.php | 92 + .../Bridge/Twig/TraceableTwigEnvironment.php | 417 + .../Bridge/Twig/TraceableTwigTemplate.php | 131 + .../DebugBar/Bridge/Twig/TwigCollector.php | 87 + .../DataCollector/AggregatedCollector.php | 166 + .../DebugBar/DataCollector/AssetProvider.php | 28 + .../DataCollector/ConfigCollector.php | 71 + .../DebugBar/DataCollector/DataCollector.php | 90 + .../DataCollector/DataCollectorInterface.php | 31 + .../DataCollector/ExceptionsCollector.php | 111 + .../DataCollector/LocalizationCollector.php | 64 + .../DataCollector/MemoryCollector.php | 63 + .../MessagesAggregateInterface.php | 21 + .../DataCollector/MessagesCollector.php | 152 + .../DataCollector/PDO/PDOCollector.php | 182 + .../DataCollector/PDO/TraceablePDO.php | 196 + .../PDO/TraceablePDOStatement.php | 74 + .../DataCollector/PDO/TracedStatement.php | 240 + .../DataCollector/PhpInfoCollector.php | 29 + .../src/DebugBar/DataCollector/Renderable.php | 25 + .../DataCollector/RequestDataCollector.php | 48 + .../DataCollector/TimeDataCollector.php | 228 + .../DebugBar/DataFormatter/DataFormatter.php | 61 + .../DataFormatter/DataFormatterInterface.php | 42 + .../debugbar/src/DebugBar/DebugBar.php | 468 + .../src/DebugBar/DebugBarException.php | 16 + .../src/DebugBar/HttpDriverInterface.php | 63 + .../src/DebugBar/JavascriptRenderer.php | 960 ++ .../debugbar/src/DebugBar/OpenHandler.php | 107 + .../debugbar/src/DebugBar/PhpHttpDriver.php | 49 + .../src/DebugBar/RequestIdGenerator.php | 22 + .../DebugBar/RequestIdGeneratorInterface.php | 21 + .../src/DebugBar/Resources/debugbar.css | 290 + .../src/DebugBar/Resources/debugbar.js | 1129 ++ .../src/DebugBar/Resources/openhandler.css | 69 + .../src/DebugBar/Resources/openhandler.js | 202 + .../font-awesome/css/font-awesome.min.css | 4 + .../vendor/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes .../fonts/fontawesome-webfont.svg | 565 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes .../vendor/highlightjs/highlight.pack.js | 1 + .../vendor/highlightjs/styles/github.css | 125 + .../vendor/jquery/dist/jquery.min.js | 4 + .../src/DebugBar/Resources/widgets.css | 208 + .../src/DebugBar/Resources/widgets.js | 456 + .../Resources/widgets/mails/widget.css | 12 + .../Resources/widgets/mails/widget.js | 40 + .../Resources/widgets/sqlqueries/widget.css | 112 + .../Resources/widgets/sqlqueries/widget.js | 130 + .../Resources/widgets/templates/widget.css | 60 + .../Resources/widgets/templates/widget.js | 69 + .../src/DebugBar/StandardDebugBar.php | 34 + .../src/DebugBar/Storage/FileStorage.php | 128 + .../src/DebugBar/Storage/MemcachedStorage.php | 111 + .../src/DebugBar/Storage/PdoStorage.php | 137 + .../src/DebugBar/Storage/RedisStorage.php | 87 + .../src/DebugBar/Storage/StorageInterface.php | 45 + vendor/monolog/monolog/.gitattributes | 3 + vendor/monolog/monolog/.php_cs | 15 + vendor/monolog/monolog/CHANGELOG.mdown | 265 + vendor/monolog/monolog/LICENSE | 19 + vendor/monolog/monolog/README.mdown | 95 + .../monolog/src/Monolog/ErrorHandler.php | 224 + .../Monolog/Formatter/ChromePHPFormatter.php | 79 + .../Monolog/Formatter/ElasticaFormatter.php | 87 + .../Monolog/Formatter/FlowdockFormatter.php | 116 + .../Monolog/Formatter/FormatterInterface.php | 36 + .../Formatter/GelfMessageFormatter.php | 111 + .../src/Monolog/Formatter/HtmlFormatter.php | 140 + .../src/Monolog/Formatter/JsonFormatter.php | 116 + .../src/Monolog/Formatter/LineFormatter.php | 159 + .../src/Monolog/Formatter/LogglyFormatter.php | 47 + .../Monolog/Formatter/LogstashFormatter.php | 166 + .../Monolog/Formatter/MongoDBFormatter.php | 105 + .../Monolog/Formatter/NormalizerFormatter.php | 193 + .../src/Monolog/Formatter/ScalarFormatter.php | 48 + .../Monolog/Formatter/WildfireFormatter.php | 113 + .../src/Monolog/Handler/AbstractHandler.php | 184 + .../Handler/AbstractProcessingHandler.php | 66 + .../Monolog/Handler/AbstractSyslogHandler.php | 92 + .../src/Monolog/Handler/AmqpHandler.php | 98 + .../Monolog/Handler/BrowserConsoleHandler.php | 192 + .../src/Monolog/Handler/BufferHandler.php | 117 + .../src/Monolog/Handler/ChromePHPHandler.php | 204 + .../src/Monolog/Handler/CouchDBHandler.php | 72 + .../src/Monolog/Handler/CubeHandler.php | 149 + .../monolog/src/Monolog/Handler/Curl/Util.php | 57 + .../Handler/DoctrineCouchDBHandler.php | 45 + .../src/Monolog/Handler/DynamoDbHandler.php | 89 + .../Monolog/Handler/ElasticSearchHandler.php | 128 + .../src/Monolog/Handler/ErrorLogHandler.php | 82 + .../src/Monolog/Handler/FilterHandler.php | 140 + .../ActivationStrategyInterface.php | 28 + .../ChannelLevelActivationStrategy.php | 59 + .../ErrorLevelActivationStrategy.php | 34 + .../Monolog/Handler/FingersCrossedHandler.php | 153 + .../src/Monolog/Handler/FirePHPHandler.php | 195 + .../src/Monolog/Handler/FleepHookHandler.php | 126 + .../src/Monolog/Handler/FlowdockHandler.php | 127 + .../src/Monolog/Handler/GelfHandler.php | 73 + .../src/Monolog/Handler/GroupHandler.php | 80 + .../src/Monolog/Handler/HandlerInterface.php | 90 + .../src/Monolog/Handler/HipChatHandler.php | 337 + .../src/Monolog/Handler/IFTTTHandler.php | 69 + .../src/Monolog/Handler/LogEntriesHandler.php | 55 + .../src/Monolog/Handler/LogglyHandler.php | 102 + .../src/Monolog/Handler/MailHandler.php | 55 + .../src/Monolog/Handler/MandrillHandler.php | 68 + .../Handler/MissingExtensionException.php | 21 + .../src/Monolog/Handler/MongoDBHandler.php | 55 + .../Monolog/Handler/NativeMailerHandler.php | 176 + .../src/Monolog/Handler/NewRelicHandler.php | 198 + .../src/Monolog/Handler/NullHandler.php | 45 + .../src/Monolog/Handler/PHPConsoleHandler.php | 242 + .../src/Monolog/Handler/PsrHandler.php | 56 + .../src/Monolog/Handler/PushoverHandler.php | 185 + .../src/Monolog/Handler/RavenHandler.php | 207 + .../src/Monolog/Handler/RedisHandler.php | 97 + .../src/Monolog/Handler/RollbarHandler.php | 95 + .../Monolog/Handler/RotatingFileHandler.php | 155 + .../src/Monolog/Handler/SamplingHandler.php | 82 + .../src/Monolog/Handler/SlackHandler.php | 284 + .../src/Monolog/Handler/SocketHandler.php | 284 + .../src/Monolog/Handler/StreamHandler.php | 146 + .../Monolog/Handler/SwiftMailerHandler.php | 88 + .../src/Monolog/Handler/SyslogHandler.php | 67 + .../Monolog/Handler/SyslogUdp/UdpSocket.php | 56 + .../src/Monolog/Handler/SyslogUdpHandler.php | 82 + .../src/Monolog/Handler/TestHandler.php | 148 + .../Handler/WhatFailureGroupHandler.php | 57 + .../Monolog/Handler/ZendMonitorHandler.php | 95 + vendor/monolog/monolog/src/Monolog/Logger.php | 649 ++ .../src/Monolog/Processor/GitProcessor.php | 64 + .../Processor/IntrospectionProcessor.php | 102 + .../Processor/MemoryPeakUsageProcessor.php | 35 + .../src/Monolog/Processor/MemoryProcessor.php | 63 + .../Processor/MemoryUsageProcessor.php | 35 + .../Monolog/Processor/ProcessIdProcessor.php | 31 + .../Processor/PsrLogMessageProcessor.php | 48 + .../src/Monolog/Processor/TagProcessor.php | 44 + .../src/Monolog/Processor/UidProcessor.php | 46 + .../src/Monolog/Processor/WebProcessor.php | 105 + .../monolog/monolog/src/Monolog/Registry.php | 134 + vendor/mrclay/minify/.gitattributes | 5 + vendor/mrclay/minify/HISTORY.txt | 141 + vendor/mrclay/minify/LICENSE.txt | 26 + vendor/mrclay/minify/MIN.txt | 181 + vendor/mrclay/minify/README.txt | 68 + vendor/mrclay/minify/UPGRADING.txt | 28 + vendor/mrclay/minify/min/lib/CSSmin.php | 777 ++ .../mrclay/minify/min/lib/DooDigestAuth.php | 121 + vendor/mrclay/minify/min/lib/FirePHP.php | 1370 +++ .../minify/min/lib/HTTP/ConditionalGet.php | 366 + vendor/mrclay/minify/min/lib/HTTP/Encoder.php | 335 + vendor/mrclay/minify/min/lib/JSMin.php | 449 + vendor/mrclay/minify/min/lib/JSMinPlus.php | 2086 ++++ vendor/mrclay/minify/min/lib/Minify.php | 608 ++ vendor/mrclay/minify/min/lib/Minify/Build.php | 101 + vendor/mrclay/minify/min/lib/Minify/CSS.php | 99 + .../minify/min/lib/Minify/CSS/Compressor.php | 249 + .../minify/min/lib/Minify/CSS/UriRewriter.php | 307 + .../mrclay/minify/min/lib/Minify/CSSmin.php | 85 + .../minify/min/lib/Minify/Cache/APC.php | 133 + .../minify/min/lib/Minify/Cache/File.php | 197 + .../minify/min/lib/Minify/Cache/Memcache.php | 140 + .../minify/min/lib/Minify/Cache/WinCache.php | 130 + .../minify/min/lib/Minify/Cache/XCache.php | 126 + .../min/lib/Minify/Cache/ZendPlatform.php | 142 + .../minify/min/lib/Minify/ClosureCompiler.php | 139 + .../min/lib/Minify/CommentPreserver.php | 89 + .../minify/min/lib/Minify/Controller/Base.php | 222 + .../min/lib/Minify/Controller/Files.php | 76 + .../min/lib/Minify/Controller/Groups.php | 91 + .../min/lib/Minify/Controller/MinApp.php | 237 + .../minify/min/lib/Minify/Controller/Page.php | 68 + .../min/lib/Minify/Controller/Version1.php | 119 + .../minify/min/lib/Minify/DebugDetector.php | 26 + vendor/mrclay/minify/min/lib/Minify/HTML.php | 255 + .../minify/min/lib/Minify/HTML/Helper.php | 225 + .../minify/min/lib/Minify/ImportProcessor.php | 216 + .../min/lib/Minify/JS/ClosureCompiler.php | 230 + vendor/mrclay/minify/min/lib/Minify/Lines.php | 143 + .../mrclay/minify/min/lib/Minify/Loader.php | 28 + .../mrclay/minify/min/lib/Minify/Logger.php | 47 + .../mrclay/minify/min/lib/Minify/Packer.php | 37 + .../mrclay/minify/min/lib/Minify/Source.php | 187 + .../min/lib/Minify/YUI/CssCompressor.java | 382 + .../min/lib/Minify/YUI/CssCompressor.php | 171 + .../minify/min/lib/Minify/YUICompressor.php | 156 + vendor/mrclay/minify/min/lib/MrClay/Cli.php | 384 + .../mrclay/minify/min/lib/MrClay/Cli/Arg.php | 183 + vendor/pimple/pimple/CHANGELOG | 35 + vendor/pimple/pimple/LICENSE | 19 + vendor/pimple/pimple/README.rst | 201 + vendor/pimple/pimple/src/Pimple/Container.php | 282 + .../src/Pimple/ServiceProviderInterface.php | 46 + vendor/psr/log/LICENSE | 19 + vendor/psr/log/Psr/Log/AbstractLogger.php | 120 + .../log/Psr/Log/InvalidArgumentException.php | 7 + vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 17 + vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 22 + vendor/psr/log/Psr/Log/LoggerInterface.php | 114 + vendor/psr/log/Psr/Log/LoggerTrait.php | 131 + vendor/psr/log/Psr/Log/NullLogger.php | 27 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 116 + vendor/psr/log/README.md | 45 + .../toolbox/ArrayTraits/src/ArrayAccess.php | 66 + .../src/ArrayAccessWithGetters.php | 57 + .../toolbox/ArrayTraits/src/Constructor.php | 24 + .../toolbox/ArrayTraits/src/Countable.php | 24 + .../toolbox/ArrayTraits/src/Export.php | 51 + .../ArrayTraits/src/ExportInterface.php | 35 + .../toolbox/ArrayTraits/src/Iterator.php | 77 + .../ArrayTraits/src/NestedArrayAccess.php | 188 + .../src/NestedArrayAccessWithGetters.php | 57 + .../toolbox/ArrayTraits/src/Serializable.php | 34 + .../toolbox/Blueprints/src/Blueprints.php | 369 + vendor/rockettheme/toolbox/CHANGELOG.md | 21 + .../rockettheme/toolbox/DI/src/Container.php | 15 + .../DI/src/ServiceProviderInterface.php | 15 + .../rockettheme/toolbox/Event/src/Event.php | 23 + .../toolbox/Event/src/EventDispatcher.php | 25 + .../Event/src/EventSubscriberInterface.php | 15 + vendor/rockettheme/toolbox/File/src/File.php | 420 + .../toolbox/File/src/FileInterface.php | 106 + .../rockettheme/toolbox/File/src/IniFile.php | 76 + .../rockettheme/toolbox/File/src/JsonFile.php | 57 + .../rockettheme/toolbox/File/src/LogFile.php | 71 + .../toolbox/File/src/MarkdownFile.php | 168 + .../rockettheme/toolbox/File/src/MoFile.php | 160 + .../rockettheme/toolbox/File/src/PhpFile.php | 106 + .../rockettheme/toolbox/File/src/YamlFile.php | 84 + vendor/rockettheme/toolbox/LICENSE | 21 + vendor/rockettheme/toolbox/README.md | 56 + .../src/RecursiveUniformResourceIterator.php | 48 + .../src/ResourceLocatorInterface.php | 37 + .../src/UniformResourceIterator.php | 250 + .../src/UniformResourceLocator.php | 338 + .../toolbox/Session/src/Message.php | 94 + .../toolbox/Session/src/Session.php | 257 + .../toolbox/Session/tests/MessageTest.php | 12 + .../StreamWrapper/src/ReadOnlyStream.php | 78 + .../toolbox/StreamWrapper/src/Stream.php | 239 + .../StreamWrapper/src/StreamBuilder.php | 89 + .../StreamWrapper/src/StreamInterface.php | 255 + vendor/symfony/console/Application.php | 1179 +++ vendor/symfony/console/CHANGELOG.md | 62 + vendor/symfony/console/Command/Command.php | 697 ++ .../symfony/console/Command/HelpCommand.php | 93 + .../symfony/console/Command/ListCommand.php | 97 + vendor/symfony/console/ConsoleEvents.php | 61 + .../Descriptor/ApplicationDescription.php | 157 + .../symfony/console/Descriptor/Descriptor.php | 121 + .../Descriptor/DescriptorInterface.php | 31 + .../console/Descriptor/JsonDescriptor.php | 166 + .../console/Descriptor/MarkdownDescriptor.php | 143 + .../console/Descriptor/TextDescriptor.php | 287 + .../console/Descriptor/XmlDescriptor.php | 263 + .../console/Event/ConsoleCommandEvent.php | 62 + vendor/symfony/console/Event/ConsoleEvent.php | 67 + .../console/Event/ConsoleExceptionEvent.php | 67 + .../console/Event/ConsoleTerminateEvent.php | 58 + .../console/Formatter/OutputFormatter.php | 242 + .../Formatter/OutputFormatterInterface.php | 83 + .../Formatter/OutputFormatterStyle.php | 229 + .../OutputFormatterStyleInterface.php | 72 + .../Formatter/OutputFormatterStyleStack.php | 121 + .../console/Helper/DebugFormatterHelper.php | 127 + .../console/Helper/DescriptorHelper.php | 96 + .../symfony/console/Helper/DialogHelper.php | 483 + .../console/Helper/FormatterHelper.php | 82 + vendor/symfony/console/Helper/Helper.php | 121 + .../console/Helper/HelperInterface.php | 49 + vendor/symfony/console/Helper/HelperSet.php | 116 + .../console/Helper/InputAwareHelper.php | 33 + .../symfony/console/Helper/ProcessHelper.php | 151 + vendor/symfony/console/Helper/ProgressBar.php | 620 ++ .../symfony/console/Helper/ProgressHelper.php | 465 + .../symfony/console/Helper/QuestionHelper.php | 446 + .../console/Helper/SymfonyQuestionHelper.php | 106 + vendor/symfony/console/Helper/Table.php | 606 ++ vendor/symfony/console/Helper/TableCell.php | 77 + vendor/symfony/console/Helper/TableHelper.php | 268 + .../symfony/console/Helper/TableSeparator.php | 29 + vendor/symfony/console/Helper/TableStyle.php | 255 + vendor/symfony/console/Input/ArgvInput.php | 353 + vendor/symfony/console/Input/ArrayInput.php | 211 + vendor/symfony/console/Input/Input.php | 226 + .../symfony/console/Input/InputArgument.php | 132 + .../console/Input/InputAwareInterface.php | 28 + .../symfony/console/Input/InputDefinition.php | 485 + .../symfony/console/Input/InputInterface.php | 152 + vendor/symfony/console/Input/InputOption.php | 213 + vendor/symfony/console/Input/StringInput.php | 87 + vendor/symfony/console/LICENSE | 19 + .../symfony/console/Logger/ConsoleLogger.php | 119 + .../symfony/console/Output/BufferedOutput.php | 48 + .../symfony/console/Output/ConsoleOutput.php | 154 + .../console/Output/ConsoleOutputInterface.php | 35 + vendor/symfony/console/Output/NullOutput.php | 113 + vendor/symfony/console/Output/Output.php | 165 + .../console/Output/OutputInterface.php | 113 + .../symfony/console/Output/StreamOutput.php | 103 + .../console/Question/ChoiceQuestion.php | 175 + .../console/Question/ConfirmationQuestion.php | 61 + vendor/symfony/console/Question/Question.php | 247 + vendor/symfony/console/README.md | 67 + vendor/symfony/console/Shell.php | 228 + vendor/symfony/console/Style/OutputStyle.php | 116 + .../symfony/console/Style/StyleInterface.php | 159 + vendor/symfony/console/Style/SymfonyStyle.php | 406 + .../console/Tester/ApplicationTester.php | 128 + .../symfony/console/Tester/CommandTester.php | 132 + .../symfony/console/Tests/ApplicationTest.php | 1060 ++ vendor/symfony/console/Tests/ClockMock.php | 41 + .../console/Tests/Command/CommandTest.php | 337 + .../console/Tests/Command/HelpCommandTest.php | 70 + .../console/Tests/Command/ListCommandTest.php | 64 + .../Descriptor/AbstractDescriptorTest.php | 105 + .../Tests/Descriptor/JsonDescriptorTest.php | 35 + .../Descriptor/MarkdownDescriptorTest.php | 27 + .../Tests/Descriptor/ObjectsProvider.php | 77 + .../Tests/Descriptor/TextDescriptorTest.php | 27 + .../Tests/Descriptor/XmlDescriptorTest.php | 27 + .../console/Tests/Fixtures/BarBucCommand.php | 11 + .../Tests/Fixtures/DescriptorApplication1.php | 18 + .../Tests/Fixtures/DescriptorApplication2.php | 24 + .../Tests/Fixtures/DescriptorCommand1.php | 27 + .../Tests/Fixtures/DescriptorCommand2.php | 32 + .../console/Tests/Fixtures/DummyOutput.php | 36 + .../console/Tests/Fixtures/Foo1Command.php | 26 + .../console/Tests/Fixtures/Foo2Command.php | 21 + .../console/Tests/Fixtures/Foo3Command.php | 29 + .../console/Tests/Fixtures/Foo4Command.php | 11 + .../console/Tests/Fixtures/Foo5Command.php | 10 + .../console/Tests/Fixtures/FooCommand.php | 33 + .../Fixtures/FooSubnamespaced1Command.php | 26 + .../Fixtures/FooSubnamespaced2Command.php | 26 + .../console/Tests/Fixtures/FoobarCommand.php | 25 + .../Style/SymfonyStyle/command/command_0.php | 11 + .../Style/SymfonyStyle/command/command_1.php | 13 + .../Style/SymfonyStyle/command/command_2.php | 16 + .../Style/SymfonyStyle/command/command_3.php | 12 + .../Style/SymfonyStyle/command/command_4.php | 34 + .../Style/SymfonyStyle/command/command_5.php | 29 + .../Style/SymfonyStyle/command/command_6.php | 16 + .../Style/SymfonyStyle/command/command_7.php | 15 + .../Style/SymfonyStyle/output/output_0.txt | 3 + .../Style/SymfonyStyle/output/output_1.txt | 9 + .../Style/SymfonyStyle/output/output_2.txt | 13 + .../Style/SymfonyStyle/output/output_3.txt | 7 + .../Style/SymfonyStyle/output/output_4.txt | 32 + .../Style/SymfonyStyle/output/output_5.txt | 11 + .../Style/SymfonyStyle/output/output_6.txt | 6 + .../Style/SymfonyStyle/output/output_7.txt | 5 + .../console/Tests/Fixtures/TestCommand.php | 28 + .../console/Tests/Fixtures/application_1.json | 1 + .../console/Tests/Fixtures/application_1.md | 201 + .../console/Tests/Fixtures/application_1.txt | 17 + .../console/Tests/Fixtures/application_1.xml | 110 + .../console/Tests/Fixtures/application_2.json | 1 + .../console/Tests/Fixtures/application_2.md | 396 + .../console/Tests/Fixtures/application_2.txt | 22 + .../console/Tests/Fixtures/application_2.xml | 190 + .../Tests/Fixtures/application_astext1.txt | 20 + .../Tests/Fixtures/application_astext2.txt | 16 + .../Tests/Fixtures/application_asxml1.txt | 146 + .../Tests/Fixtures/application_asxml2.txt | 37 + .../Tests/Fixtures/application_gethelp.txt | 1 + .../Fixtures/application_renderexception1.txt | 8 + .../Fixtures/application_renderexception2.txt | 11 + .../Fixtures/application_renderexception3.txt | 27 + .../application_renderexception3decorated.txt | 27 + .../Fixtures/application_renderexception4.txt | 9 + ...plication_renderexception_doublewidth1.txt | 11 + ..._renderexception_doublewidth1decorated.txt | 11 + ...plication_renderexception_doublewidth2.txt | 12 + .../Tests/Fixtures/application_run1.txt | 17 + .../Tests/Fixtures/application_run2.txt | 29 + .../Tests/Fixtures/application_run3.txt | 27 + .../Tests/Fixtures/application_run4.txt | 1 + .../console/Tests/Fixtures/command_1.json | 1 + .../console/Tests/Fixtures/command_1.md | 11 + .../console/Tests/Fixtures/command_1.txt | 7 + .../console/Tests/Fixtures/command_1.xml | 12 + .../console/Tests/Fixtures/command_2.json | 1 + .../console/Tests/Fixtures/command_2.md | 33 + .../console/Tests/Fixtures/command_2.txt | 13 + .../console/Tests/Fixtures/command_2.xml | 21 + .../console/Tests/Fixtures/command_astext.txt | 18 + .../console/Tests/Fixtures/command_asxml.txt | 38 + .../Tests/Fixtures/definition_astext.txt | 11 + .../Tests/Fixtures/definition_asxml.txt | 39 + .../Tests/Fixtures/input_argument_1.json | 1 + .../Tests/Fixtures/input_argument_1.md | 7 + .../Tests/Fixtures/input_argument_1.txt | 1 + .../Tests/Fixtures/input_argument_1.xml | 5 + .../Tests/Fixtures/input_argument_2.json | 1 + .../Tests/Fixtures/input_argument_2.md | 7 + .../Tests/Fixtures/input_argument_2.txt | 1 + .../Tests/Fixtures/input_argument_2.xml | 5 + .../Tests/Fixtures/input_argument_3.json | 1 + .../Tests/Fixtures/input_argument_3.md | 7 + .../Tests/Fixtures/input_argument_3.txt | 1 + .../Tests/Fixtures/input_argument_3.xml | 7 + .../Tests/Fixtures/input_argument_4.json | 1 + .../Tests/Fixtures/input_argument_4.md | 8 + .../Tests/Fixtures/input_argument_4.txt | 2 + .../Tests/Fixtures/input_argument_4.xml | 6 + .../Tests/Fixtures/input_definition_1.json | 1 + .../Tests/Fixtures/input_definition_1.md | 0 .../Tests/Fixtures/input_definition_1.txt | 0 .../Tests/Fixtures/input_definition_1.xml | 5 + .../Tests/Fixtures/input_definition_2.json | 1 + .../Tests/Fixtures/input_definition_2.md | 9 + .../Tests/Fixtures/input_definition_2.txt | 2 + .../Tests/Fixtures/input_definition_2.xml | 10 + .../Tests/Fixtures/input_definition_3.json | 1 + .../Tests/Fixtures/input_definition_3.md | 11 + .../Tests/Fixtures/input_definition_3.txt | 2 + .../Tests/Fixtures/input_definition_3.xml | 9 + .../Tests/Fixtures/input_definition_4.json | 1 + .../Tests/Fixtures/input_definition_4.md | 21 + .../Tests/Fixtures/input_definition_4.txt | 5 + .../Tests/Fixtures/input_definition_4.xml | 14 + .../Tests/Fixtures/input_option_1.json | 1 + .../console/Tests/Fixtures/input_option_1.md | 9 + .../console/Tests/Fixtures/input_option_1.txt | 1 + .../console/Tests/Fixtures/input_option_1.xml | 4 + .../Tests/Fixtures/input_option_2.json | 1 + .../console/Tests/Fixtures/input_option_2.md | 9 + .../console/Tests/Fixtures/input_option_2.txt | 1 + .../console/Tests/Fixtures/input_option_2.xml | 7 + .../Tests/Fixtures/input_option_3.json | 1 + .../console/Tests/Fixtures/input_option_3.md | 9 + .../console/Tests/Fixtures/input_option_3.txt | 1 + .../console/Tests/Fixtures/input_option_3.xml | 5 + .../Tests/Fixtures/input_option_4.json | 1 + .../console/Tests/Fixtures/input_option_4.md | 9 + .../console/Tests/Fixtures/input_option_4.txt | 1 + .../console/Tests/Fixtures/input_option_4.xml | 5 + .../Tests/Fixtures/input_option_5.json | 1 + .../console/Tests/Fixtures/input_option_5.md | 10 + .../console/Tests/Fixtures/input_option_5.txt | 2 + .../console/Tests/Fixtures/input_option_5.xml | 6 + .../Tests/Fixtures/input_option_6.json | 1 + .../console/Tests/Fixtures/input_option_6.md | 9 + .../console/Tests/Fixtures/input_option_6.txt | 1 + .../console/Tests/Fixtures/input_option_6.xml | 5 + .../OutputFormatterStyleStackTest.php | 70 + .../Formatter/OutputFormatterStyleTest.php | 99 + .../Tests/Formatter/OutputFormatterTest.php | 273 + .../Tests/Helper/FormatterHelperTest.php | 99 + .../console/Tests/Helper/HelperSetTest.php | 153 + .../Tests/Helper/LegacyDialogHelperTest.php | 195 + .../Tests/Helper/LegacyProgressHelperTest.php | 240 + .../Tests/Helper/LegacyTableHelperTest.php | 324 + .../Tests/Helper/ProcessHelperTest.php | 117 + .../console/Tests/Helper/ProgressBarTest.php | 612 ++ .../Tests/Helper/QuestionHelperTest.php | 383 + .../console/Tests/Helper/TableStyleTest.php | 27 + .../console/Tests/Helper/TableTest.php | 568 + .../console/Tests/Input/ArgvInputTest.php | 317 + .../console/Tests/Input/ArrayInputTest.php | 138 + .../console/Tests/Input/InputArgumentTest.php | 111 + .../Tests/Input/InputDefinitionTest.php | 437 + .../console/Tests/Input/InputOptionTest.php | 204 + .../symfony/console/Tests/Input/InputTest.php | 121 + .../console/Tests/Input/StringInputTest.php | 99 + .../Tests/Logger/ConsoleLoggerTest.php | 58 + .../Tests/Output/ConsoleOutputTest.php | 25 + .../console/Tests/Output/NullOutputTest.php | 39 + .../console/Tests/Output/OutputTest.php | 156 + .../console/Tests/Output/StreamOutputTest.php | 60 + .../console/Tests/Style/SymfonyStyleTest.php | 64 + .../Tests/Tester/ApplicationTesterTest.php | 69 + .../Tests/Tester/CommandTesterTest.php | 84 + vendor/symfony/console/composer.json | 41 + vendor/symfony/console/phpunit.xml.dist | 29 + vendor/symfony/event-dispatcher/CHANGELOG.md | 23 + .../ContainerAwareEventDispatcher.php | 187 + .../Debug/TraceableEventDispatcher.php | 335 + .../TraceableEventDispatcherInterface.php | 34 + .../Debug/WrappedListener.php | 71 + .../RegisterListenersPass.php | 110 + vendor/symfony/event-dispatcher/Event.php | 134 + .../event-dispatcher/EventDispatcher.php | 179 + .../EventDispatcherInterface.php | 96 + .../EventSubscriberInterface.php | 50 + .../symfony/event-dispatcher/GenericEvent.php | 186 + .../ImmutableEventDispatcher.php | 93 + vendor/symfony/event-dispatcher/LICENSE | 19 + vendor/symfony/event-dispatcher/README.md | 27 + .../Tests/AbstractEventDispatcherTest.php | 382 + .../ContainerAwareEventDispatcherTest.php | 249 + .../Debug/TraceableEventDispatcherTest.php | 199 + .../RegisterListenersPassTest.php | 200 + .../Tests/EventDispatcherTest.php | 22 + .../event-dispatcher/Tests/EventTest.php | 96 + .../Tests/GenericEventTest.php | 139 + .../Tests/ImmutableEventDispatcherTest.php | 105 + vendor/symfony/event-dispatcher/composer.json | 42 + .../symfony/event-dispatcher/phpunit.xml.dist | 29 + vendor/symfony/var-dumper/CHANGELOG.md | 7 + .../symfony/var-dumper/Caster/AmqpCaster.php | 164 + vendor/symfony/var-dumper/Caster/Caster.php | 114 + .../symfony/var-dumper/Caster/ConstStub.php | 28 + vendor/symfony/var-dumper/Caster/CutStub.php | 56 + .../symfony/var-dumper/Caster/DOMCaster.php | 302 + .../var-dumper/Caster/DoctrineCaster.php | 60 + .../var-dumper/Caster/ExceptionCaster.php | 137 + .../symfony/var-dumper/Caster/MongoCaster.php | 34 + .../symfony/var-dumper/Caster/PdoCaster.php | 114 + .../var-dumper/Caster/ReflectionCaster.php | 241 + .../var-dumper/Caster/ResourceCaster.php | 67 + .../symfony/var-dumper/Caster/SplCaster.php | 102 + .../symfony/var-dumper/Caster/StubCaster.php | 46 + .../var-dumper/Caster/XmlResourceCaster.php | 61 + .../var-dumper/Cloner/AbstractCloner.php | 304 + .../var-dumper/Cloner/ClonerInterface.php | 27 + vendor/symfony/var-dumper/Cloner/Cursor.php | 41 + vendor/symfony/var-dumper/Cloner/Data.php | 241 + .../var-dumper/Cloner/DumperInterface.php | 60 + vendor/symfony/var-dumper/Cloner/Stub.php | 40 + .../symfony/var-dumper/Cloner/VarCloner.php | 300 + .../var-dumper/Dumper/AbstractDumper.php | 222 + .../symfony/var-dumper/Dumper/CliDumper.php | 473 + .../var-dumper/Dumper/DataDumperInterface.php | 29 + .../symfony/var-dumper/Dumper/HtmlDumper.php | 475 + .../Exception/ThrowingCasterException.php | 27 + vendor/symfony/var-dumper/LICENSE | 19 + vendor/symfony/var-dumper/README.md | 14 + .../var-dumper/Resources/functions/dump.php | 24 + .../var-dumper/Test/VarDumperTestCase.php | 44 + .../var-dumper/Test/VarDumperTestTrait.php | 45 + .../var-dumper/Tests/Caster/CasterTest.php | 147 + .../var-dumper/Tests/Caster/PdoCasterTest.php | 56 + .../Tests/Caster/ReflectionCasterTest.php | 63 + .../var-dumper/Tests/CliDumperTest.php | 390 + .../var-dumper/Tests/Fixtures/dumb-var.php | 40 + .../var-dumper/Tests/HtmlDumperTest.php | 152 + .../Tests/Test/VarDumpTestTraitRequire54.php | 41 + .../Tests/Test/VarDumpTestTraitTest.php | 16 + .../var-dumper/Tests/VarClonerTest.php | 187 + vendor/symfony/var-dumper/VarDumper.php | 52 + vendor/symfony/var-dumper/composer.json | 37 + vendor/symfony/var-dumper/phpunit.xml.dist | 29 + vendor/symfony/yaml/CHANGELOG.md | 8 + vendor/symfony/yaml/Dumper.php | 73 + vendor/symfony/yaml/Escaper.php | 97 + .../symfony/yaml/Exception/DumpException.php | 23 + .../yaml/Exception/ExceptionInterface.php | 23 + .../symfony/yaml/Exception/ParseException.php | 148 + .../yaml/Exception/RuntimeException.php | 23 + vendor/symfony/yaml/Inline.php | 546 + vendor/symfony/yaml/LICENSE | 19 + vendor/symfony/yaml/Parser.php | 704 ++ vendor/symfony/yaml/README.md | 21 + vendor/symfony/yaml/Tests/DumperTest.php | 236 + .../yaml/Tests/Fixtures/YtsAnchorAlias.yml | 31 + .../yaml/Tests/Fixtures/YtsBasicTests.yml | 202 + .../yaml/Tests/Fixtures/YtsBlockMapping.yml | 51 + .../Tests/Fixtures/YtsDocumentSeparator.yml | 85 + .../yaml/Tests/Fixtures/YtsErrorTests.yml | 25 + .../Tests/Fixtures/YtsFlowCollections.yml | 60 + .../yaml/Tests/Fixtures/YtsFoldedScalars.yml | 176 + .../Tests/Fixtures/YtsNullsAndEmpties.yml | 45 + .../Fixtures/YtsSpecificationExamples.yml | 1697 +++ .../yaml/Tests/Fixtures/YtsTypeTransfers.yml | 244 + .../yaml/Tests/Fixtures/embededPhp.yml | 1 + .../yaml/Tests/Fixtures/escapedCharacters.yml | 147 + vendor/symfony/yaml/Tests/Fixtures/index.yml | 18 + .../yaml/Tests/Fixtures/sfComments.yml | 73 + .../symfony/yaml/Tests/Fixtures/sfCompact.yml | 159 + .../yaml/Tests/Fixtures/sfMergeKey.yml | 58 + .../symfony/yaml/Tests/Fixtures/sfObjects.yml | 11 + .../symfony/yaml/Tests/Fixtures/sfQuotes.yml | 33 + .../symfony/yaml/Tests/Fixtures/sfTests.yml | 135 + .../Tests/Fixtures/unindentedCollections.yml | 82 + vendor/symfony/yaml/Tests/InlineTest.php | 384 + .../symfony/yaml/Tests/ParseExceptionTest.php | 41 + vendor/symfony/yaml/Tests/ParserTest.php | 773 ++ vendor/symfony/yaml/Tests/YamlTest.php | 37 + vendor/symfony/yaml/Unescaper.php | 147 + vendor/symfony/yaml/Yaml.php | 105 + vendor/symfony/yaml/composer.json | 33 + vendor/symfony/yaml/phpunit.xml.dist | 28 + vendor/twig/twig/CHANGELOG | 799 ++ vendor/twig/twig/LICENSE | 31 + vendor/twig/twig/README.rst | 15 + vendor/twig/twig/lib/Twig/Autoloader.php | 54 + vendor/twig/twig/lib/Twig/BaseNodeVisitor.php | 62 + .../twig/twig/lib/Twig/Cache/Filesystem.php | 96 + vendor/twig/twig/lib/Twig/Cache/Null.php | 48 + vendor/twig/twig/lib/Twig/CacheInterface.php | 56 + vendor/twig/twig/lib/Twig/Compiler.php | 277 + .../twig/twig/lib/Twig/CompilerInterface.php | 36 + vendor/twig/twig/lib/Twig/Environment.php | 1355 +++ vendor/twig/twig/lib/Twig/Error.php | 250 + vendor/twig/twig/lib/Twig/Error/Loader.php | 31 + vendor/twig/twig/lib/Twig/Error/Runtime.php | 20 + vendor/twig/twig/lib/Twig/Error/Syntax.php | 20 + .../twig/lib/Twig/ExistsLoaderInterface.php | 29 + .../twig/twig/lib/Twig/ExpressionParser.php | 645 ++ vendor/twig/twig/lib/Twig/Extension.php | 75 + vendor/twig/twig/lib/Twig/Extension/Core.php | 1574 +++ vendor/twig/twig/lib/Twig/Extension/Debug.php | 71 + .../twig/twig/lib/Twig/Extension/Escaper.php | 122 + .../twig/lib/Twig/Extension/Optimizer.php | 35 + .../twig/twig/lib/Twig/Extension/Profiler.php | 52 + .../twig/twig/lib/Twig/Extension/Sandbox.php | 112 + .../twig/twig/lib/Twig/Extension/Staging.php | 115 + .../twig/lib/Twig/Extension/StringLoader.php | 47 + .../twig/twig/lib/Twig/ExtensionInterface.php | 83 + .../Twig/FileExtensionEscapingStrategy.php | 58 + vendor/twig/twig/lib/Twig/Filter.php | 84 + vendor/twig/twig/lib/Twig/Filter/Function.php | 40 + vendor/twig/twig/lib/Twig/Filter/Method.php | 42 + vendor/twig/twig/lib/Twig/Filter/Node.php | 42 + .../twig/lib/Twig/FilterCallableInterface.php | 24 + vendor/twig/twig/lib/Twig/FilterInterface.php | 43 + vendor/twig/twig/lib/Twig/Function.php | 74 + .../twig/twig/lib/Twig/Function/Function.php | 41 + vendor/twig/twig/lib/Twig/Function/Method.php | 43 + vendor/twig/twig/lib/Twig/Function/Node.php | 42 + .../lib/Twig/FunctionCallableInterface.php | 24 + .../twig/twig/lib/Twig/FunctionInterface.php | 40 + vendor/twig/twig/lib/Twig/Lexer.php | 411 + vendor/twig/twig/lib/Twig/LexerInterface.php | 32 + vendor/twig/twig/lib/Twig/Loader/Array.php | 95 + vendor/twig/twig/lib/Twig/Loader/Chain.php | 138 + .../twig/twig/lib/Twig/Loader/Filesystem.php | 260 + vendor/twig/twig/lib/Twig/Loader/String.php | 63 + vendor/twig/twig/lib/Twig/LoaderInterface.php | 53 + vendor/twig/twig/lib/Twig/Markup.php | 37 + vendor/twig/twig/lib/Twig/Node.php | 231 + vendor/twig/twig/lib/Twig/Node/AutoEscape.php | 39 + vendor/twig/twig/lib/Twig/Node/Block.php | 44 + .../twig/lib/Twig/Node/BlockReference.php | 37 + vendor/twig/twig/lib/Twig/Node/Body.php | 19 + .../twig/twig/lib/Twig/Node/CheckSecurity.php | 78 + vendor/twig/twig/lib/Twig/Node/Do.php | 38 + vendor/twig/twig/lib/Twig/Node/Embed.php | 42 + vendor/twig/twig/lib/Twig/Node/Expression.php | 20 + .../twig/lib/Twig/Node/Expression/Array.php | 86 + .../lib/Twig/Node/Expression/AssignName.php | 28 + .../twig/lib/Twig/Node/Expression/Binary.php | 40 + .../lib/Twig/Node/Expression/Binary/Add.php | 18 + .../lib/Twig/Node/Expression/Binary/And.php | 18 + .../Node/Expression/Binary/BitwiseAnd.php | 18 + .../Twig/Node/Expression/Binary/BitwiseOr.php | 18 + .../Node/Expression/Binary/BitwiseXor.php | 18 + .../Twig/Node/Expression/Binary/Concat.php | 18 + .../lib/Twig/Node/Expression/Binary/Div.php | 18 + .../Twig/Node/Expression/Binary/EndsWith.php | 30 + .../lib/Twig/Node/Expression/Binary/Equal.php | 17 + .../Twig/Node/Expression/Binary/FloorDiv.php | 29 + .../Twig/Node/Expression/Binary/Greater.php | 17 + .../Node/Expression/Binary/GreaterEqual.php | 17 + .../lib/Twig/Node/Expression/Binary/In.php | 33 + .../lib/Twig/Node/Expression/Binary/Less.php | 17 + .../Twig/Node/Expression/Binary/LessEqual.php | 17 + .../Twig/Node/Expression/Binary/Matches.php | 28 + .../lib/Twig/Node/Expression/Binary/Mod.php | 18 + .../lib/Twig/Node/Expression/Binary/Mul.php | 18 + .../Twig/Node/Expression/Binary/NotEqual.php | 17 + .../lib/Twig/Node/Expression/Binary/NotIn.php | 33 + .../lib/Twig/Node/Expression/Binary/Or.php | 18 + .../lib/Twig/Node/Expression/Binary/Power.php | 33 + .../lib/Twig/Node/Expression/Binary/Range.php | 33 + .../Node/Expression/Binary/StartsWith.php | 30 + .../lib/Twig/Node/Expression/Binary/Sub.php | 18 + .../Twig/Node/Expression/BlockReference.php | 51 + .../twig/lib/Twig/Node/Expression/Call.php | 247 + .../lib/Twig/Node/Expression/Conditional.php | 31 + .../lib/Twig/Node/Expression/Constant.php | 23 + .../Node/Expression/ExtensionReference.php | 33 + .../twig/lib/Twig/Node/Expression/Filter.php | 39 + .../Twig/Node/Expression/Filter/Default.php | 43 + .../lib/Twig/Node/Expression/Function.php | 38 + .../twig/lib/Twig/Node/Expression/GetAttr.php | 63 + .../lib/Twig/Node/Expression/MethodCall.php | 41 + .../twig/lib/Twig/Node/Expression/Name.php | 98 + .../twig/lib/Twig/Node/Expression/Parent.php | 47 + .../lib/Twig/Node/Expression/TempName.php | 26 + .../twig/lib/Twig/Node/Expression/Test.php | 35 + .../Twig/Node/Expression/Test/Constant.php | 46 + .../lib/Twig/Node/Expression/Test/Defined.php | 54 + .../Twig/Node/Expression/Test/Divisibleby.php | 33 + .../lib/Twig/Node/Expression/Test/Even.php | 32 + .../lib/Twig/Node/Expression/Test/Null.php | 31 + .../lib/Twig/Node/Expression/Test/Odd.php | 32 + .../lib/Twig/Node/Expression/Test/Sameas.php | 29 + .../twig/lib/Twig/Node/Expression/Unary.php | 27 + .../lib/Twig/Node/Expression/Unary/Neg.php | 18 + .../lib/Twig/Node/Expression/Unary/Not.php | 18 + .../lib/Twig/Node/Expression/Unary/Pos.php | 18 + vendor/twig/twig/lib/Twig/Node/Flush.php | 36 + vendor/twig/twig/lib/Twig/Node/For.php | 111 + vendor/twig/twig/lib/Twig/Node/ForLoop.php | 55 + vendor/twig/twig/lib/Twig/Node/If.php | 66 + vendor/twig/twig/lib/Twig/Node/Import.php | 54 + vendor/twig/twig/lib/Twig/Node/Include.php | 88 + vendor/twig/twig/lib/Twig/Node/Macro.php | 123 + vendor/twig/twig/lib/Twig/Node/Module.php | 408 + vendor/twig/twig/lib/Twig/Node/Print.php | 39 + vendor/twig/twig/lib/Twig/Node/Sandbox.php | 47 + .../twig/lib/Twig/Node/SandboxedPrint.php | 61 + vendor/twig/twig/lib/Twig/Node/Set.php | 101 + vendor/twig/twig/lib/Twig/Node/SetTemp.php | 35 + vendor/twig/twig/lib/Twig/Node/Spaceless.php | 40 + vendor/twig/twig/lib/Twig/Node/Text.php | 39 + vendor/twig/twig/lib/Twig/NodeInterface.php | 31 + .../twig/lib/Twig/NodeOutputInterface.php | 19 + vendor/twig/twig/lib/Twig/NodeTraverser.php | 89 + .../twig/lib/Twig/NodeVisitor/Escaper.php | 157 + .../twig/lib/Twig/NodeVisitor/Optimizer.php | 271 + .../lib/Twig/NodeVisitor/SafeAnalysis.php | 154 + .../twig/lib/Twig/NodeVisitor/Sandbox.php | 82 + .../twig/lib/Twig/NodeVisitorInterface.php | 47 + vendor/twig/twig/lib/Twig/Parser.php | 399 + vendor/twig/twig/lib/Twig/ParserInterface.php | 31 + .../lib/Twig/Profiler/Dumper/Blackfire.php | 68 + .../twig/lib/Twig/Profiler/Dumper/Html.php | 43 + .../twig/lib/Twig/Profiler/Dumper/Text.php | 68 + .../lib/Twig/Profiler/Node/EnterProfile.php | 40 + .../lib/Twig/Profiler/Node/LeaveProfile.php | 34 + .../Twig/Profiler/NodeVisitor/Profiler.php | 72 + .../twig/twig/lib/Twig/Profiler/Profile.php | 160 + .../twig/lib/Twig/Sandbox/SecurityError.php | 19 + .../Sandbox/SecurityNotAllowedFilterError.php | 31 + .../SecurityNotAllowedFunctionError.php | 31 + .../Sandbox/SecurityNotAllowedTagError.php | 31 + .../twig/lib/Twig/Sandbox/SecurityPolicy.php | 119 + .../Twig/Sandbox/SecurityPolicyInterface.php | 24 + vendor/twig/twig/lib/Twig/SimpleFilter.php | 112 + vendor/twig/twig/lib/Twig/SimpleFunction.php | 102 + vendor/twig/twig/lib/Twig/SimpleTest.php | 64 + vendor/twig/twig/lib/Twig/Template.php | 614 ++ .../twig/twig/lib/Twig/TemplateInterface.php | 48 + vendor/twig/twig/lib/Twig/Test.php | 37 + vendor/twig/twig/lib/Twig/Test/Function.php | 38 + .../lib/Twig/Test/IntegrationTestCase.php | 230 + vendor/twig/twig/lib/Twig/Test/Method.php | 40 + vendor/twig/twig/lib/Twig/Test/Node.php | 40 + .../twig/twig/lib/Twig/Test/NodeTestCase.php | 60 + .../twig/lib/Twig/TestCallableInterface.php | 22 + vendor/twig/twig/lib/Twig/TestInterface.php | 27 + vendor/twig/twig/lib/Twig/Token.php | 216 + vendor/twig/twig/lib/Twig/TokenParser.php | 33 + .../twig/lib/Twig/TokenParser/AutoEscape.php | 91 + .../twig/twig/lib/Twig/TokenParser/Block.php | 81 + vendor/twig/twig/lib/Twig/TokenParser/Do.php | 42 + .../twig/twig/lib/Twig/TokenParser/Embed.php | 66 + .../twig/lib/Twig/TokenParser/Extends.php | 52 + .../twig/twig/lib/Twig/TokenParser/Filter.php | 61 + .../twig/twig/lib/Twig/TokenParser/Flush.php | 42 + vendor/twig/twig/lib/Twig/TokenParser/For.php | 135 + .../twig/twig/lib/Twig/TokenParser/From.php | 74 + vendor/twig/twig/lib/Twig/TokenParser/If.php | 94 + .../twig/twig/lib/Twig/TokenParser/Import.php | 49 + .../twig/lib/Twig/TokenParser/Include.php | 75 + .../twig/twig/lib/Twig/TokenParser/Macro.php | 68 + .../twig/lib/Twig/TokenParser/Sandbox.php | 68 + vendor/twig/twig/lib/Twig/TokenParser/Set.php | 83 + .../twig/lib/Twig/TokenParser/Spaceless.php | 59 + vendor/twig/twig/lib/Twig/TokenParser/Use.php | 76 + .../twig/twig/lib/Twig/TokenParserBroker.php | 141 + .../lib/Twig/TokenParserBrokerInterface.php | 46 + .../twig/lib/Twig/TokenParserInterface.php | 43 + vendor/twig/twig/lib/Twig/TokenStream.php | 155 + .../lib/Twig/Util/DeprecationCollector.php | 82 + .../lib/Twig/Util/TemplateDirIterator.php | 26 + web.config | 55 + 2240 files changed, 288691 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/.gitkeep create mode 100644 backup/.gitkeep create mode 100755 bin/composer.phar create mode 100755 bin/gpm create mode 100755 bin/grav create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 fixperms.sh create mode 100644 htaccess.txt create mode 100644 index.php create mode 100644 nginx.conf create mode 100644 robots.txt create mode 100644 screenshot.png create mode 100644 system/assets/debugger.css create mode 100644 system/assets/grav.png create mode 100644 system/assets/jquery/jquery-2.1.4.min.js create mode 100644 system/assets/responsive-overlays/1x.png create mode 100644 system/assets/responsive-overlays/2x.png create mode 100644 system/assets/responsive-overlays/3x.png create mode 100644 system/assets/responsive-overlays/4x.png create mode 100644 system/assets/responsive-overlays/unknown.png create mode 100644 system/assets/whoops.css create mode 100644 system/blueprints/config/media.yaml create mode 100644 system/blueprints/config/site.yaml create mode 100644 system/blueprints/config/streams.yaml create mode 100644 system/blueprints/config/system.yaml create mode 100644 system/blueprints/pages/default.yaml create mode 100644 system/blueprints/pages/modular.yaml create mode 100644 system/blueprints/pages/modular_new.yaml create mode 100644 system/blueprints/pages/modular_raw.yaml create mode 100644 system/blueprints/pages/move.yaml create mode 100644 system/blueprints/pages/new.yaml create mode 100644 system/blueprints/pages/raw.yaml create mode 100644 system/blueprints/user/account.yaml create mode 100644 system/blueprints/user/account_new.yaml create mode 100644 system/config/media.yaml create mode 100644 system/config/site.yaml create mode 100644 system/config/streams.yaml create mode 100644 system/config/system.yaml create mode 100644 system/defines.php create mode 100644 system/languages/cs.yaml create mode 100644 system/languages/de.yaml create mode 100644 system/languages/en.yaml create mode 100644 system/languages/fr.yaml create mode 100644 system/languages/it.yaml create mode 100644 system/languages/nl.yaml create mode 100644 system/languages/ru.yaml create mode 100644 system/src/Grav/Common/Assets.php create mode 100644 system/src/Grav/Common/Backup/ZipBackup.php create mode 100644 system/src/Grav/Common/Browser.php create mode 100644 system/src/Grav/Common/Cache.php create mode 100644 system/src/Grav/Common/Composer.php create mode 100644 system/src/Grav/Common/Config/Blueprints.php create mode 100644 system/src/Grav/Common/Config/Config.php create mode 100644 system/src/Grav/Common/Config/ConfigFinder.php create mode 100644 system/src/Grav/Common/Config/Languages.php create mode 100644 system/src/Grav/Common/Data/Blueprint.php create mode 100644 system/src/Grav/Common/Data/Blueprints.php create mode 100644 system/src/Grav/Common/Data/Data.php create mode 100644 system/src/Grav/Common/Data/DataInterface.php create mode 100644 system/src/Grav/Common/Data/DataMutatorTrait.php create mode 100644 system/src/Grav/Common/Data/Validation.php create mode 100644 system/src/Grav/Common/Debugger.php create mode 100644 system/src/Grav/Common/Errors/Errors.php create mode 100644 system/src/Grav/Common/Errors/Resources/error.css create mode 100644 system/src/Grav/Common/Errors/Resources/layout.html.php create mode 100644 system/src/Grav/Common/Errors/SimplePageHandler.php create mode 100644 system/src/Grav/Common/File/CompiledFile.php create mode 100644 system/src/Grav/Common/File/CompiledMarkdownFile.php create mode 100644 system/src/Grav/Common/File/CompiledYamlFile.php create mode 100644 system/src/Grav/Common/Filesystem/Folder.php create mode 100644 system/src/Grav/Common/Filesystem/RecursiveFolderFilterIterator.php create mode 100644 system/src/Grav/Common/GPM/AbstractCollection.php create mode 100644 system/src/Grav/Common/GPM/Common/AbstractPackageCollection.php create mode 100644 system/src/Grav/Common/GPM/Common/CachedCollection.php create mode 100644 system/src/Grav/Common/GPM/Common/Package.php create mode 100644 system/src/Grav/Common/GPM/GPM.php create mode 100644 system/src/Grav/Common/GPM/Installer.php create mode 100644 system/src/Grav/Common/GPM/Local/AbstractPackageCollection.php create mode 100644 system/src/Grav/Common/GPM/Local/Package.php create mode 100644 system/src/Grav/Common/GPM/Local/Packages.php create mode 100644 system/src/Grav/Common/GPM/Local/Plugins.php create mode 100644 system/src/Grav/Common/GPM/Local/Themes.php create mode 100644 system/src/Grav/Common/GPM/PackageInterface.php create mode 100644 system/src/Grav/Common/GPM/Remote/AbstractPackageCollection.php create mode 100644 system/src/Grav/Common/GPM/Remote/Grav.php create mode 100644 system/src/Grav/Common/GPM/Remote/Package.php create mode 100644 system/src/Grav/Common/GPM/Remote/Packages.php create mode 100644 system/src/Grav/Common/GPM/Remote/Plugins.php create mode 100644 system/src/Grav/Common/GPM/Remote/Themes.php create mode 100644 system/src/Grav/Common/GPM/Response.php create mode 100644 system/src/Grav/Common/GPM/Upgrader.php create mode 100644 system/src/Grav/Common/Getters.php create mode 100644 system/src/Grav/Common/Grav.php create mode 100644 system/src/Grav/Common/GravTrait.php create mode 100644 system/src/Grav/Common/Helpers/Truncator.php create mode 100644 system/src/Grav/Common/Inflector.php create mode 100644 system/src/Grav/Common/Iterator.php create mode 100644 system/src/Grav/Common/Language/Language.php create mode 100644 system/src/Grav/Common/Language/LanguageCodes.php create mode 100644 system/src/Grav/Common/Markdown/Parsedown.php create mode 100644 system/src/Grav/Common/Markdown/ParsedownExtra.php create mode 100644 system/src/Grav/Common/Markdown/ParsedownGravTrait.php create mode 100644 system/src/Grav/Common/Page/Collection.php create mode 100644 system/src/Grav/Common/Page/Header.php create mode 100644 system/src/Grav/Common/Page/Media.php create mode 100644 system/src/Grav/Common/Page/Medium/AudioMedium.php create mode 100644 system/src/Grav/Common/Page/Medium/ImageFile.php create mode 100644 system/src/Grav/Common/Page/Medium/ImageMedium.php create mode 100644 system/src/Grav/Common/Page/Medium/Link.php create mode 100644 system/src/Grav/Common/Page/Medium/Medium.php create mode 100644 system/src/Grav/Common/Page/Medium/MediumFactory.php create mode 100644 system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php create mode 100644 system/src/Grav/Common/Page/Medium/RenderableInterface.php create mode 100644 system/src/Grav/Common/Page/Medium/StaticImageMedium.php create mode 100644 system/src/Grav/Common/Page/Medium/StaticResizeTrait.php create mode 100644 system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php create mode 100644 system/src/Grav/Common/Page/Medium/VideoMedium.php create mode 100644 system/src/Grav/Common/Page/Page.php create mode 100644 system/src/Grav/Common/Page/Pages.php create mode 100644 system/src/Grav/Common/Page/Types.php create mode 100644 system/src/Grav/Common/Plugin.php create mode 100644 system/src/Grav/Common/Plugins.php create mode 100644 system/src/Grav/Common/Service/ConfigServiceProvider.php create mode 100644 system/src/Grav/Common/Service/ErrorServiceProvider.php create mode 100644 system/src/Grav/Common/Service/LoggerServiceProvider.php create mode 100644 system/src/Grav/Common/Service/StreamsServiceProvider.php create mode 100644 system/src/Grav/Common/Session.php create mode 100644 system/src/Grav/Common/Taxonomy.php create mode 100644 system/src/Grav/Common/Theme.php create mode 100644 system/src/Grav/Common/Themes.php create mode 100644 system/src/Grav/Common/Twig/Twig.php create mode 100644 system/src/Grav/Common/Twig/TwigEnvironment.php create mode 100644 system/src/Grav/Common/Twig/TwigExtension.php create mode 100644 system/src/Grav/Common/Twig/WriteCacheFileTrait.php create mode 100644 system/src/Grav/Common/Uri.php create mode 100644 system/src/Grav/Common/User/Authentication.php create mode 100644 system/src/Grav/Common/User/User.php create mode 100644 system/src/Grav/Common/Utils.php create mode 100644 system/src/Grav/Console/Cli/BackupCommand.php create mode 100644 system/src/Grav/Console/Cli/CleanCommand.php create mode 100644 system/src/Grav/Console/Cli/ClearCacheCommand.php create mode 100644 system/src/Grav/Console/Cli/ComposerCommand.php create mode 100644 system/src/Grav/Console/Cli/InstallCommand.php create mode 100644 system/src/Grav/Console/Cli/NewProjectCommand.php create mode 100644 system/src/Grav/Console/Cli/NewUserCommand.php create mode 100644 system/src/Grav/Console/Cli/SandboxCommand.php create mode 100644 system/src/Grav/Console/ConsoleTrait.php create mode 100644 system/src/Grav/Console/Gpm/IndexCommand.php create mode 100644 system/src/Grav/Console/Gpm/InfoCommand.php create mode 100644 system/src/Grav/Console/Gpm/InstallCommand.php create mode 100644 system/src/Grav/Console/Gpm/SelfupgradeCommand.php create mode 100644 system/src/Grav/Console/Gpm/UninstallCommand.php create mode 100644 system/src/Grav/Console/Gpm/UpdateCommand.php create mode 100644 system/src/Grav/Console/Gpm/VersionCommand.php create mode 100644 system/tests/Grav/Test/.gitkeep create mode 100644 system/tests/Grav/TestCase.php create mode 100644 system/tests/bootstrap.php create mode 100644 system/tests/phpunit.xml create mode 100644 user/accounts/.gitkeep create mode 100644 user/accounts/root.yaml create mode 100644 user/config/site.yaml create mode 100644 user/config/system.yaml create mode 100644 user/data/.gitkeep create mode 100644 user/plugins/.gitkeep create mode 100644 user/plugins/admin/CHANGELOG.md create mode 100644 user/plugins/admin/LICENSE create mode 100644 user/plugins/admin/README.md create mode 100644 user/plugins/admin/admin.php create mode 100644 user/plugins/admin/admin.yaml create mode 100644 user/plugins/admin/assets/admin-dashboard.png create mode 100644 user/plugins/admin/blueprints.yaml create mode 100644 user/plugins/admin/classes/admin.php create mode 100644 user/plugins/admin/classes/controller.php create mode 100644 user/plugins/admin/classes/gpm.php create mode 100644 user/plugins/admin/classes/popularity.php create mode 100644 user/plugins/admin/languages.yaml create mode 100644 user/plugins/admin/pages/admin/backup.md create mode 100644 user/plugins/admin/pages/admin/cache.md create mode 100644 user/plugins/admin/pages/admin/dashboard.md create mode 100644 user/plugins/admin/pages/admin/denied.md create mode 100644 user/plugins/admin/pages/admin/forgot.md create mode 100644 user/plugins/admin/pages/admin/info.md create mode 100644 user/plugins/admin/pages/admin/installer.md create mode 100644 user/plugins/admin/pages/admin/login.md create mode 100644 user/plugins/admin/pages/admin/logout.md create mode 100644 user/plugins/admin/pages/admin/logs.md create mode 100644 user/plugins/admin/pages/admin/media.md create mode 100644 user/plugins/admin/pages/admin/pages-filter.md create mode 100644 user/plugins/admin/pages/admin/pages.md create mode 100644 user/plugins/admin/pages/admin/plugins.md create mode 100644 user/plugins/admin/pages/admin/reset.md create mode 100644 user/plugins/admin/pages/admin/site.md create mode 100644 user/plugins/admin/pages/admin/statistics.md create mode 100644 user/plugins/admin/pages/admin/system.md create mode 100644 user/plugins/admin/pages/admin/themes.md create mode 100644 user/plugins/admin/pages/admin/update.md create mode 100644 user/plugins/admin/pages/admin/users.md create mode 100644 user/plugins/admin/themes/grav/css-compiled/nucleus.css create mode 100644 user/plugins/admin/themes/grav/css-compiled/nucleus.css.map create mode 100644 user/plugins/admin/themes/grav/css-compiled/template.css create mode 100644 user/plugins/admin/themes/grav/css-compiled/template.css.map create mode 100644 user/plugins/admin/themes/grav/css/chartist.min.css create mode 100644 user/plugins/admin/themes/grav/css/codemirror/base16-light.css create mode 100644 user/plugins/admin/themes/grav/css/codemirror/codemirror.css create mode 100644 user/plugins/admin/themes/grav/css/codemirror/paper.css create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/editor.png create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/imagebrowser.png create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/indeterminate.gif create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/loading-image.gif create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/loading.gif create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/loading_2x.gif create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/slider-h.gif create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/slider-v.gif create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/sprite.png create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_2x.png create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_kpi.png create mode 100644 user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_kpi_2x.png create mode 100644 user/plugins/admin/themes/grav/css/datepicker/README.md create mode 100644 user/plugins/admin/themes/grav/css/datepicker/grav.overrides.css create mode 100644 user/plugins/admin/themes/grav/css/datepicker/kendo.common.core.min.css create mode 100644 user/plugins/admin/themes/grav/css/datepicker/kendo.flat.min.css create mode 100644 user/plugins/admin/themes/grav/css/featherlight.min.css create mode 100644 user/plugins/admin/themes/grav/css/font-awesome.min.css create mode 100644 user/plugins/admin/themes/grav/css/hint.base.min.css create mode 100644 user/plugins/admin/themes/grav/css/nucleus-ie10.css create mode 100644 user/plugins/admin/themes/grav/css/nucleus-ie9.css create mode 100644 user/plugins/admin/themes/grav/css/prism.css create mode 100644 user/plugins/admin/themes/grav/css/pure-0.5.0/grids-min.css create mode 100644 user/plugins/admin/themes/grav/css/selectize.min.css create mode 100644 user/plugins/admin/themes/grav/css/uikit.css create mode 100644 user/plugins/admin/themes/grav/fonts/FontAwesome.otf create mode 100644 user/plugins/admin/themes/grav/fonts/fontawesome-webfont.eot create mode 100644 user/plugins/admin/themes/grav/fonts/fontawesome-webfont.svg create mode 100644 user/plugins/admin/themes/grav/fonts/fontawesome-webfont.ttf create mode 100644 user/plugins/admin/themes/grav/fonts/fontawesome-webfont.woff create mode 100644 user/plugins/admin/themes/grav/fonts/fontawesome-webfont.woff2 create mode 100644 user/plugins/admin/themes/grav/js/admin-all.js create mode 100644 user/plugins/admin/themes/grav/js/ajax.js create mode 100644 user/plugins/admin/themes/grav/js/chartist.min.js create mode 100644 user/plugins/admin/themes/grav/js/codemirror-compressed.js create mode 100644 user/plugins/admin/themes/grav/js/datepicker/README.md create mode 100644 user/plugins/admin/themes/grav/js/datepicker/init.js create mode 100644 user/plugins/admin/themes/grav/js/datepicker/kendo.custom.min.js create mode 100644 user/plugins/admin/themes/grav/js/dropdown.js create mode 100644 user/plugins/admin/themes/grav/js/dropzone.min.js create mode 100644 user/plugins/admin/themes/grav/js/featherlight.min.js create mode 100644 user/plugins/admin/themes/grav/js/form-attr.polyfill.js create mode 100644 user/plugins/admin/themes/grav/js/forms.js create mode 100644 user/plugins/admin/themes/grav/js/forms/fields/array.js create mode 100644 user/plugins/admin/themes/grav/js/forms/fields/checkboxes.js create mode 100644 user/plugins/admin/themes/grav/js/forms/fields/input.js create mode 100644 user/plugins/admin/themes/grav/js/forms/fields/selectize.js create mode 100644 user/plugins/admin/themes/grav/js/forms/fields/toggle.js create mode 100644 user/plugins/admin/themes/grav/js/forms/form.js create mode 100644 user/plugins/admin/themes/grav/js/html5shiv-printshiv.min.js create mode 100644 user/plugins/admin/themes/grav/js/jquery-2.1.1.min.js create mode 100644 user/plugins/admin/themes/grav/js/jquery.remodal.min.js create mode 100644 user/plugins/admin/themes/grav/js/mdeditor.js create mode 100644 user/plugins/admin/themes/grav/js/mobile.js create mode 100644 user/plugins/admin/themes/grav/js/modernizr.custom.71422.js create mode 100644 user/plugins/admin/themes/grav/js/pages-all.js create mode 100644 user/plugins/admin/themes/grav/js/selectize.min.js create mode 100644 user/plugins/admin/themes/grav/js/slugify.min.js create mode 100644 user/plugins/admin/themes/grav/js/sortable.min.js create mode 100644 user/plugins/admin/themes/grav/js/speakingurl.min.js create mode 100644 user/plugins/admin/themes/grav/js/toastr.min.js create mode 100644 user/plugins/admin/themes/grav/scss.sh create mode 100644 user/plugins/admin/themes/grav/scss/configuration/nucleus/_base.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/nucleus/_breakpoints.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/nucleus/_core.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/nucleus/_layout.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/nucleus/_nav.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/nucleus/_typography.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/template/_base.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/template/_bullets.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/template/_colors.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/template/_typography.scss create mode 100644 user/plugins/admin/themes/grav/scss/configuration/template/_variables.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/_core.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/_flex.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/_forms.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/_typography.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/functions/_base.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/functions/_direction.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/functions/_range.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/mixins/_base.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/mixins/_breakpoints.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/mixins/_utilities.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/particles/_align-text.scss create mode 100644 user/plugins/admin/themes/grav/scss/nucleus/particles/_visibility.scss create mode 100644 user/plugins/admin/themes/grav/scss/platform/joomla/_core.scss create mode 100644 user/plugins/admin/themes/grav/scss/template.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_admin.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_buttons.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_core.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_custom.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_dropzone.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_editor.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_errors.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_extensions.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_fonts.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_forms.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_gpm.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_header.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_login.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_pages.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_phpinfo.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_remodal.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_tables.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_tabs.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_toastr.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/_typography.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/modules/_base.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/modules/_buttons.scss create mode 100644 user/plugins/admin/themes/grav/scss/template/modules/_toggle-switch.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/_bourbon.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_button.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_clearfix.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_directional-values.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_ellipsis.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_font-family.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_hide-text.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_html5-input-types.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_position.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_prefixer.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_rem.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_retina-image.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_size.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_timing-functions.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_triangle.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/addons/_word-wrap.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_animation.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_appearance.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_backface-visibility.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_background-image.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_background.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_border-image.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_border-radius.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_box-sizing.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_calc.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_columns.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_filter.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_flex-box.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_font-face.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_font-feature-settings.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_hidpi-media-query.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_hyphens.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_image-rendering.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_keyframes.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_linear-gradient.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_perspective.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_placeholder.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_radial-gradient.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_transform.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_transition.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/css3/_user-select.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_assign.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_color-lightness.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_flex-grid.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_golden-ratio.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_grid-width.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_modular-scale.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_px-to-em.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_px-to-rem.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_strip-units.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_tint-shade.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_transition-property-name.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/functions/_unpack.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_convert-units.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_gradient-positions-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_is-num.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_linear-angle-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_linear-gradient-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_linear-positions-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_radial-arg-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_radial-gradient-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_radial-positions-parser.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_render-gradients.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_shape-size-stripper.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/helpers/_str-to-num.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/settings/_prefixer.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/bourbon/settings/_px-to-em.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/_color-schemer.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_cmyk.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_color-adjustments.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_color-schemer.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_colorblind.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_comparison.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_equalize.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_harmonize.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_interpolation.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_mix.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_mixins.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_ryb.scss create mode 100644 user/plugins/admin/themes/grav/scss/vendor/color-schemer/color-schemer/_tint-shade.scss create mode 100644 user/plugins/admin/themes/grav/templates/ajax.json.twig create mode 100644 user/plugins/admin/themes/grav/templates/cache.json.twig create mode 100644 user/plugins/admin/themes/grav/templates/dashboard.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/denied.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/email/base.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/email/reset.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/error.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/error.json.twig create mode 100644 user/plugins/admin/themes/grav/templates/forgot.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/field.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/array/array.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/blueprint/blueprint.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/column/column.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/columns/columns.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/dateformat/dateformat.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/fieldset/fieldset.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/frontmatter/frontmatter.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/ignore/ignore.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/list/list.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/markdown/markdown.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/order/order.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/pagemedia/pagemedia.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/pages/pages.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/section/section.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/selectize/selectize.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/tab/tab.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/tabs/tabs.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/taxonomy/taxonomy.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/themeselect/themeselect.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/forms/fields/toggle/toggle.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/info.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/installer.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/login.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/logout.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/logs.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/media.json.twig create mode 100644 user/plugins/admin/themes/grav/templates/pages-filter.json.twig create mode 100644 user/plugins/admin/themes/grav/templates/pages.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/base.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/blueprints-new.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/blueprints-raw.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/blueprints.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/header.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/javascript-config.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/login.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/messages.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/nav.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/page-children.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/page-move.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/plugin-data.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/plugins-details.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/plugins-list.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/theme.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/themes-details.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/themes-list.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/toolbar.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/users-details.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/partials/users-list.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/plugins.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/reset.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/site.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/statistics.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/system.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/themes.html.twig create mode 100644 user/plugins/admin/themes/grav/templates/update.json.twig create mode 100644 user/plugins/admin/themes/grav/templates/users.html.twig create mode 100644 user/plugins/admin/themes/grav/theme.yaml create mode 100644 user/plugins/admin/twig/AdminTwigExtension.php create mode 100644 user/plugins/email/CHANGELOG.md create mode 100644 user/plugins/email/LICENSE create mode 100644 user/plugins/email/README.md create mode 100644 user/plugins/email/blueprints.yaml create mode 100644 user/plugins/email/classes/email.php create mode 100644 user/plugins/email/composer.json create mode 100644 user/plugins/email/email.php create mode 100644 user/plugins/email/email.yaml create mode 100644 user/plugins/email/vendor/autoload.php create mode 100644 user/plugins/email/vendor/composer/ClassLoader.php create mode 100644 user/plugins/email/vendor/composer/autoload_classmap.php create mode 100644 user/plugins/email/vendor/composer/autoload_files.php create mode 100644 user/plugins/email/vendor/composer/autoload_namespaces.php create mode 100644 user/plugins/email/vendor/composer/autoload_psr4.php create mode 100644 user/plugins/email/vendor/composer/autoload_real.php create mode 100644 user/plugins/email/vendor/composer/installed.json create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/CHANGES create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/LICENSE create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/README create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/VERSION create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Attachment.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/AbstractFilterableInputStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/ArrayByteStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/FileByteStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/TemporaryFileByteStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/GenericFixedWidthReader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/UsAsciiReader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/Utf8Reader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReaderFactory.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReaderFactory/SimpleCharacterReaderFactory.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream/ArrayCharacterStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream/NgCharacterStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ConfigurableSpool.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/DependencyContainer.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/DependencyException.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/EmbeddedFile.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/Base64Encoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/QpEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/Rfc2231Encoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoding.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/CommandEvent.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/CommandListener.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/Event.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventDispatcher.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventListener.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventObject.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/ResponseEvent.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/ResponseListener.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SendEvent.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SendListener.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SimpleEventDispatcher.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportChangeEvent.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportChangeListener.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportExceptionEvent.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportExceptionListener.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/FailoverTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/FileSpool.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/FileStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Filterable.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Image.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/InputByteStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/IoException.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/ArrayKeyCache.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/DiskKeyCache.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/KeyCacheInputStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/NullKeyCache.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/SimpleKeyCacheInputStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/LoadBalancedTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/MailTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer/ArrayRecipientIterator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer/RecipientIterator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/MemorySpool.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Message.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Attachment.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/CharsetObserver.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/Base64ContentEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/PlainContentEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/EmbeddedFile.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/EncodingObserver.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Grammar.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Header.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder/Base64HeaderEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderFactory.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderSet.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/AbstractHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/DateHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/IdentificationHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/OpenDKIMHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/ParameterizedHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/PathHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/UnstructuredHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Message.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/MimeEntity.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/MimePart.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ParameterizedHeader.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleHeaderFactory.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleHeaderSet.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMessage.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMimeEntity.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/MimePart.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/NullTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/OutputByteStream.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ImpersonatePlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Logger.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/MessageLogger.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/RedirectingPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporter.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Timer.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Preferences.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ReplacementFilterFactory.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/RfcComplianceException.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SendmailTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SignedMessage.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signer.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/BodySigner.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Spool.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SpoolTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilter.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/ByteArrayReplacementFilter.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilter.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilterFactory.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SwiftException.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/AuthHandler.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Authenticator.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpHandler.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/FailoverTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/IoBuffer.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/LoadBalancedTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/MailInvoker.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/MailTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/NullTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SimpleMailInvoker.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SmtpAgent.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SpoolTransport.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Validate.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/cache_deps.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/mime_types.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/preferences.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swift_init.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swift_required.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swift_required_pear.php create mode 100644 user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swiftmailer_generate_mimes_config.php create mode 100644 user/plugins/error/CHANGELOG.md create mode 100644 user/plugins/error/LICENSE create mode 100644 user/plugins/error/README.md create mode 100644 user/plugins/error/assets/readme_1.png create mode 100644 user/plugins/error/blueprints.yaml create mode 100644 user/plugins/error/error.php create mode 100644 user/plugins/error/error.yaml create mode 100644 user/plugins/error/pages/error.md create mode 100644 user/plugins/error/templates/error.html.twig create mode 100644 user/plugins/error/templates/error.json.twig create mode 100644 user/plugins/form/CHANGELOG.md create mode 100644 user/plugins/form/LICENSE create mode 100644 user/plugins/form/README.md create mode 100644 user/plugins/form/blueprints.yaml create mode 100644 user/plugins/form/classes/form.php create mode 100644 user/plugins/form/form.php create mode 100644 user/plugins/form/form.yaml create mode 100644 user/plugins/form/languages.yaml create mode 100644 user/plugins/form/templates/forms/data.html.twig create mode 100644 user/plugins/form/templates/forms/data.txt.twig create mode 100644 user/plugins/form/templates/forms/default/data.html.twig create mode 100644 user/plugins/form/templates/forms/default/data.txt.twig create mode 100644 user/plugins/form/templates/forms/default/form.html.twig create mode 100644 user/plugins/form/templates/forms/field.html.twig create mode 100644 user/plugins/form/templates/forms/fields/captcha/captcha.html.twig create mode 100644 user/plugins/form/templates/forms/fields/checkbox/checkbox.html.twig create mode 100644 user/plugins/form/templates/forms/fields/checkbox/checkbox.yaml create mode 100644 user/plugins/form/templates/forms/fields/checkboxes/checkboxes.html.twig create mode 100644 user/plugins/form/templates/forms/fields/date/date.html.twig create mode 100644 user/plugins/form/templates/forms/fields/datetime/datetime.html.twig create mode 100644 user/plugins/form/templates/forms/fields/display/display.html.twig create mode 100644 user/plugins/form/templates/forms/fields/email/email.html.twig create mode 100644 user/plugins/form/templates/forms/fields/hidden/hidden.html.twig create mode 100644 user/plugins/form/templates/forms/fields/password/password.html.twig create mode 100644 user/plugins/form/templates/forms/fields/radio/radio.html.twig create mode 100644 user/plugins/form/templates/forms/fields/select/select.html.twig create mode 100644 user/plugins/form/templates/forms/fields/spacer/spacer.html.twig create mode 100644 user/plugins/form/templates/forms/fields/text/text.html.twig create mode 100644 user/plugins/form/templates/forms/fields/textarea/textarea.html.twig create mode 100644 user/plugins/form/templates/forms/form.html.twig create mode 100644 user/plugins/login/CHANGELOG.md create mode 100644 user/plugins/login/LICENSE create mode 100644 user/plugins/login/README.md create mode 100644 user/plugins/login/blueprints.yaml create mode 100644 user/plugins/login/classes/controller.php create mode 100644 user/plugins/login/css/login.css create mode 100644 user/plugins/login/languages.yaml create mode 100644 user/plugins/login/login.php create mode 100644 user/plugins/login/login.yaml create mode 100644 user/plugins/login/pages/login.md create mode 100644 user/plugins/login/templates/login.html.twig create mode 100644 user/plugins/login/templates/login.json.twig create mode 100644 user/plugins/login/templates/partials/login-form.html.twig create mode 100644 user/plugins/login/templates/partials/login-status.html.twig create mode 100644 user/plugins/login/templates/partials/messages.html.twig create mode 100644 user/plugins/problems/CHANGELOG.md create mode 100644 user/plugins/problems/LICENSE create mode 100644 user/plugins/problems/README.md create mode 100644 user/plugins/problems/assets/readme_1.png create mode 100644 user/plugins/problems/blueprints.yaml create mode 100644 user/plugins/problems/css/problems.css create mode 100644 user/plugins/problems/css/template.css create mode 100644 user/plugins/problems/html/problems.html create mode 100644 user/plugins/problems/problems.php create mode 100644 user/plugins/problems/problems.yaml create mode 100644 user/plugins/taxonomylist/CHANGELOG.md create mode 100644 user/plugins/taxonomylist/LICENSE create mode 100644 user/plugins/taxonomylist/README.md create mode 100644 user/plugins/taxonomylist/assets/readme_1.png create mode 100644 user/plugins/taxonomylist/blueprints.yaml create mode 100644 user/plugins/taxonomylist/classes/taxonomylist.php create mode 100644 user/plugins/taxonomylist/hebe.json create mode 100644 user/plugins/taxonomylist/taxonomylist.php create mode 100644 user/plugins/taxonomylist/taxonomylist.yaml create mode 100644 user/plugins/taxonomylist/templates/partials/taxonomylist.html.twig create mode 100644 user/themes/.gitkeep create mode 100644 user/themes/antimatter/CHANGELOG.md create mode 100644 user/themes/antimatter/LICENSE create mode 100644 user/themes/antimatter/README.md create mode 100644 user/themes/antimatter/antimatter.php create mode 100644 user/themes/antimatter/antimatter.yaml create mode 100644 user/themes/antimatter/assets/readme_1.png create mode 100644 user/themes/antimatter/blueprints.yaml create mode 100644 user/themes/antimatter/blueprints/asset/file.yaml create mode 100644 user/themes/antimatter/blueprints/blog.yaml create mode 100644 user/themes/antimatter/blueprints/form.yaml create mode 100644 user/themes/antimatter/blueprints/item.yaml create mode 100644 user/themes/antimatter/blueprints/modular/features.yaml create mode 100644 user/themes/antimatter/blueprints/modular/showcase.yaml create mode 100644 user/themes/antimatter/blueprints/modular/text.yaml create mode 100644 user/themes/antimatter/composer.json create mode 100644 user/themes/antimatter/css-compiled/nucleus.css create mode 100644 user/themes/antimatter/css-compiled/nucleus.css.map create mode 100644 user/themes/antimatter/css-compiled/particles.css create mode 100644 user/themes/antimatter/css-compiled/particles.css.map create mode 100644 user/themes/antimatter/css-compiled/template.css create mode 100644 user/themes/antimatter/css-compiled/template.css.map create mode 100644 user/themes/antimatter/css/font-awesome.min.css create mode 100644 user/themes/antimatter/css/nucleus-ie10.css create mode 100644 user/themes/antimatter/css/nucleus-ie9.css create mode 100644 user/themes/antimatter/css/prism.css create mode 100644 user/themes/antimatter/css/pure-0.5.0/grids-min.css create mode 100644 user/themes/antimatter/css/slidebars.min.css create mode 100644 user/themes/antimatter/fonts/FontAwesome.otf create mode 100644 user/themes/antimatter/fonts/fontawesome-webfont.eot create mode 100644 user/themes/antimatter/fonts/fontawesome-webfont.svg create mode 100644 user/themes/antimatter/fonts/fontawesome-webfont.ttf create mode 100644 user/themes/antimatter/fonts/fontawesome-webfont.woff create mode 100644 user/themes/antimatter/js/antimatter.js create mode 100644 user/themes/antimatter/js/html5shiv-printshiv.min.js create mode 100644 user/themes/antimatter/js/modernizr.custom.71422.js create mode 100644 user/themes/antimatter/js/singlePageNav.min.js create mode 100644 user/themes/antimatter/js/slidebars.min.js create mode 100644 user/themes/antimatter/languages.yaml create mode 100644 user/themes/antimatter/screenshot.jpg create mode 100644 user/themes/antimatter/scss.sh create mode 100644 user/themes/antimatter/scss/configuration/nucleus/_base.scss create mode 100644 user/themes/antimatter/scss/configuration/nucleus/_breakpoints.scss create mode 100644 user/themes/antimatter/scss/configuration/nucleus/_core.scss create mode 100644 user/themes/antimatter/scss/configuration/nucleus/_layout.scss create mode 100644 user/themes/antimatter/scss/configuration/nucleus/_nav.scss create mode 100644 user/themes/antimatter/scss/configuration/nucleus/_typography.scss create mode 100644 user/themes/antimatter/scss/configuration/template/_base.scss create mode 100644 user/themes/antimatter/scss/configuration/template/_bullets.scss create mode 100644 user/themes/antimatter/scss/configuration/template/_colors.scss create mode 100644 user/themes/antimatter/scss/configuration/template/_typography.scss create mode 100644 user/themes/antimatter/scss/configuration/template/_variables.scss create mode 100644 user/themes/antimatter/scss/nucleus.scss create mode 100644 user/themes/antimatter/scss/nucleus/_core.scss create mode 100644 user/themes/antimatter/scss/nucleus/_flex.scss create mode 100644 user/themes/antimatter/scss/nucleus/_forms.scss create mode 100644 user/themes/antimatter/scss/nucleus/_typography.scss create mode 100644 user/themes/antimatter/scss/nucleus/functions/_base.scss create mode 100644 user/themes/antimatter/scss/nucleus/functions/_direction.scss create mode 100644 user/themes/antimatter/scss/nucleus/functions/_range.scss create mode 100644 user/themes/antimatter/scss/nucleus/mixins/_base.scss create mode 100644 user/themes/antimatter/scss/nucleus/mixins/_breakpoints.scss create mode 100644 user/themes/antimatter/scss/nucleus/mixins/_utilities.scss create mode 100644 user/themes/antimatter/scss/nucleus/particles/_align-text.scss create mode 100644 user/themes/antimatter/scss/nucleus/particles/_visibility.scss create mode 100644 user/themes/antimatter/scss/particles.scss create mode 100644 user/themes/antimatter/scss/template.scss create mode 100644 user/themes/antimatter/scss/template/_blog.scss create mode 100644 user/themes/antimatter/scss/template/_bullets.scss create mode 100644 user/themes/antimatter/scss/template/_buttons.scss create mode 100644 user/themes/antimatter/scss/template/_core.scss create mode 100644 user/themes/antimatter/scss/template/_custom.scss create mode 100644 user/themes/antimatter/scss/template/_errors.scss create mode 100644 user/themes/antimatter/scss/template/_extensions.scss create mode 100644 user/themes/antimatter/scss/template/_fonts.scss create mode 100644 user/themes/antimatter/scss/template/_footer.scss create mode 100644 user/themes/antimatter/scss/template/_forms.scss create mode 100644 user/themes/antimatter/scss/template/_header.scss create mode 100644 user/themes/antimatter/scss/template/_panel.scss create mode 100644 user/themes/antimatter/scss/template/_simplesearch.scss create mode 100644 user/themes/antimatter/scss/template/_tables.scss create mode 100644 user/themes/antimatter/scss/template/_typography.scss create mode 100644 user/themes/antimatter/scss/template/modular/_all.scss create mode 100644 user/themes/antimatter/scss/template/modular/_features.scss create mode 100644 user/themes/antimatter/scss/template/modular/_showcase.scss create mode 100644 user/themes/antimatter/scss/template/modular/_text.scss create mode 100644 user/themes/antimatter/scss/template/modules/_base.scss create mode 100644 user/themes/antimatter/scss/template/modules/_buttons.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/_bourbon.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_button.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_clearfix.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_directional-values.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_ellipsis.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_font-family.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_hide-text.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_html5-input-types.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_position.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_prefixer.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_rem.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_retina-image.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_size.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_timing-functions.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_triangle.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/addons/_word-wrap.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_animation.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_appearance.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_backface-visibility.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_background-image.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_background.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_border-image.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_border-radius.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_box-sizing.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_calc.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_columns.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_filter.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_flex-box.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_font-face.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_font-feature-settings.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_hidpi-media-query.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_hyphens.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_image-rendering.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_keyframes.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_linear-gradient.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_perspective.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_placeholder.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_radial-gradient.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_transform.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_transition.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/css3/_user-select.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_assign.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_color-lightness.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_flex-grid.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_golden-ratio.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_grid-width.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_modular-scale.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-em.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-rem.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_strip-units.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_tint-shade.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_transition-property-name.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/functions/_unpack.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_convert-units.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_gradient-positions-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_is-num.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-angle-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-gradient-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-positions-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-arg-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-gradient-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-positions-parser.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_render-gradients.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_shape-size-stripper.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/helpers/_str-to-num.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/settings/_prefixer.scss create mode 100644 user/themes/antimatter/scss/vendor/bourbon/settings/_px-to-em.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/_color-schemer.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_cmyk.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-adjustments.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-schemer.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_colorblind.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_comparison.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_equalize.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_harmonize.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_interpolation.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mix.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mixins.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_ryb.scss create mode 100644 user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_tint-shade.scss create mode 100644 user/themes/antimatter/templates/blog.html.twig create mode 100644 user/themes/antimatter/templates/default.html.twig create mode 100644 user/themes/antimatter/templates/error.html.twig create mode 100644 user/themes/antimatter/templates/form.html.twig create mode 100644 user/themes/antimatter/templates/formdata.html.twig create mode 100644 user/themes/antimatter/templates/forms/data.html.twig create mode 100644 user/themes/antimatter/templates/forms/data.txt.twig create mode 100644 user/themes/antimatter/templates/forms/form.html.twig create mode 100644 user/themes/antimatter/templates/item.html.twig create mode 100644 user/themes/antimatter/templates/macros/macros.html.twig create mode 100644 user/themes/antimatter/templates/modular.html.twig create mode 100644 user/themes/antimatter/templates/modular/features.html.twig create mode 100644 user/themes/antimatter/templates/modular/showcase.html.twig create mode 100644 user/themes/antimatter/templates/modular/text.html.twig create mode 100644 user/themes/antimatter/templates/partials/base.html.twig create mode 100644 user/themes/antimatter/templates/partials/blog_item.html.twig create mode 100644 user/themes/antimatter/templates/partials/metadata.html.twig create mode 100644 user/themes/antimatter/templates/partials/navigation.html.twig create mode 100644 user/themes/antimatter/templates/partials/sidebar.html.twig create mode 100644 user/themes/antimatter/templates/snipcart.html.twig create mode 100644 user/themes/antimatter/thumbnail.jpg create mode 100644 user/themes/ouidade/.gitignore create mode 100644 user/themes/ouidade/CHANGELOG.md create mode 100644 user/themes/ouidade/LICENSE.md create mode 100644 user/themes/ouidade/README.md create mode 100644 user/themes/ouidade/blueprints.yaml create mode 100644 user/themes/ouidade/bower.json create mode 100644 user/themes/ouidade/bower_components/doc-ready/.bower.json create mode 100644 user/themes/ouidade/bower_components/doc-ready/README.md create mode 100644 user/themes/ouidade/bower_components/doc-ready/bower.json create mode 100644 user/themes/ouidade/bower_components/doc-ready/doc-ready.js create mode 100644 user/themes/ouidade/bower_components/ev-emitter/.bower.json create mode 100644 user/themes/ouidade/bower_components/ev-emitter/README.md create mode 100644 user/themes/ouidade/bower_components/ev-emitter/bower.json create mode 100644 user/themes/ouidade/bower_components/ev-emitter/ev-emitter.js create mode 100644 user/themes/ouidade/bower_components/ev-emitter/package.json create mode 100644 user/themes/ouidade/bower_components/eventEmitter/.bower.json create mode 100644 user/themes/ouidade/bower_components/eventEmitter/EventEmitter.js create mode 100644 user/themes/ouidade/bower_components/eventEmitter/EventEmitter.min.js create mode 100644 user/themes/ouidade/bower_components/eventEmitter/README.md create mode 100644 user/themes/ouidade/bower_components/eventEmitter/UNLICENSE create mode 100644 user/themes/ouidade/bower_components/eventEmitter/bower.json create mode 100644 user/themes/ouidade/bower_components/eventEmitter/component.json create mode 100644 user/themes/ouidade/bower_components/eventie/.bower.json create mode 100644 user/themes/ouidade/bower_components/eventie/README.md create mode 100644 user/themes/ouidade/bower_components/eventie/bower.json create mode 100644 user/themes/ouidade/bower_components/eventie/eventie.js create mode 100644 user/themes/ouidade/bower_components/eventie/package.json create mode 100644 user/themes/ouidade/bower_components/fastclick/.bower.json create mode 100644 user/themes/ouidade/bower_components/fastclick/LICENSE create mode 100644 user/themes/ouidade/bower_components/fastclick/README.md create mode 100644 user/themes/ouidade/bower_components/fastclick/bower.json create mode 100644 user/themes/ouidade/bower_components/fastclick/lib/fastclick.js create mode 100644 user/themes/ouidade/bower_components/fizzy-ui-utils/.bower.json create mode 100644 user/themes/ouidade/bower_components/fizzy-ui-utils/README.md create mode 100644 user/themes/ouidade/bower_components/fizzy-ui-utils/bower.json create mode 100644 user/themes/ouidade/bower_components/fizzy-ui-utils/utils.js create mode 100644 user/themes/ouidade/bower_components/foundation/.bower.json create mode 100644 user/themes/ouidade/bower_components/foundation/LICENSE create mode 100644 user/themes/ouidade/bower_components/foundation/README.md create mode 100644 user/themes/ouidade/bower_components/foundation/bower.json create mode 100644 user/themes/ouidade/bower_components/foundation/css/foundation.css create mode 100644 user/themes/ouidade/bower_components/foundation/css/foundation.css.map create mode 100644 user/themes/ouidade/bower_components/foundation/css/foundation.min.css create mode 100644 user/themes/ouidade/bower_components/foundation/css/normalize.css create mode 100644 user/themes/ouidade/bower_components/foundation/css/normalize.css.map create mode 100644 user/themes/ouidade/bower_components/foundation/css/normalize.min.css create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation.min.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.abide.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.accordion.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.alert.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.clearing.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.dropdown.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.equalizer.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.interchange.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.joyride.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.magellan.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.offcanvas.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.orbit.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.reveal.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.slider.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.tab.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.tooltip.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/foundation/foundation.topbar.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/vendor/fastclick.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/vendor/jquery.cookie.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/vendor/jquery.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/vendor/modernizr.js create mode 100644 user/themes/ouidade/bower_components/foundation/js/vendor/placeholder.js create mode 100644 user/themes/ouidade/bower_components/foundation/package.json create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/_functions.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/_settings.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_accordion.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_alert-boxes.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_block-grid.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_breadcrumbs.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_button-groups.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_buttons.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_clearing.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_dropdown-buttons.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_dropdown.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_flex-video.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_forms.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_global.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_grid.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_icon-bar.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_inline-lists.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_joyride.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_keystrokes.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_labels.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_magellan.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_offcanvas.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_orbit.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_pagination.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_panels.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_pricing-tables.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_progress-bars.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_range-slider.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_reveal.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_side-nav.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_split-buttons.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_sub-nav.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_switches.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_tables.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_tabs.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_thumbs.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_tooltips.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_top-bar.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_type.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/foundation/components/_visibility.scss create mode 100644 user/themes/ouidade/bower_components/foundation/scss/normalize.scss create mode 100644 user/themes/ouidade/bower_components/get-size/.bower.json create mode 100644 user/themes/ouidade/bower_components/get-size/README.md create mode 100644 user/themes/ouidade/bower_components/get-size/bower.json create mode 100644 user/themes/ouidade/bower_components/get-size/get-size.js create mode 100644 user/themes/ouidade/bower_components/get-size/index.html create mode 100644 user/themes/ouidade/bower_components/get-style-property/.bower.json create mode 100644 user/themes/ouidade/bower_components/get-style-property/README.md create mode 100644 user/themes/ouidade/bower_components/get-style-property/bower.json create mode 100644 user/themes/ouidade/bower_components/get-style-property/component.json create mode 100644 user/themes/ouidade/bower_components/get-style-property/get-style-property.js create mode 100644 user/themes/ouidade/bower_components/get-style-property/package.json create mode 100644 user/themes/ouidade/bower_components/imagesloaded/.bower.json create mode 100644 user/themes/ouidade/bower_components/imagesloaded/README.md create mode 100644 user/themes/ouidade/bower_components/imagesloaded/bower.json create mode 100644 user/themes/ouidade/bower_components/imagesloaded/gulpfile.js create mode 100644 user/themes/ouidade/bower_components/imagesloaded/imagesloaded.js create mode 100644 user/themes/ouidade/bower_components/imagesloaded/imagesloaded.pkgd.js create mode 100644 user/themes/ouidade/bower_components/imagesloaded/imagesloaded.pkgd.min.js create mode 100644 user/themes/ouidade/bower_components/jquery-placeholder/.bower.json create mode 100644 user/themes/ouidade/bower_components/jquery-placeholder/bower.json create mode 100644 user/themes/ouidade/bower_components/jquery-placeholder/jquery.placeholder.js create mode 100644 user/themes/ouidade/bower_components/jquery.cookie/.bower.json create mode 100644 user/themes/ouidade/bower_components/jquery.cookie/bower.json create mode 100644 user/themes/ouidade/bower_components/jquery.cookie/jquery.cookie.js create mode 100644 user/themes/ouidade/bower_components/jquery/.bower.json create mode 100644 user/themes/ouidade/bower_components/jquery/MIT-LICENSE.txt create mode 100644 user/themes/ouidade/bower_components/jquery/bower.json create mode 100644 user/themes/ouidade/bower_components/jquery/dist/jquery.js create mode 100644 user/themes/ouidade/bower_components/jquery/dist/jquery.min.js create mode 100644 user/themes/ouidade/bower_components/jquery/dist/jquery.min.map create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/jsonp.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/load.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/parseJSON.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/parseXML.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/script.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/var/nonce.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/var/rquery.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/ajax/xhr.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/attributes.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/attributes/attr.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/attributes/classes.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/attributes/prop.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/attributes/support.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/attributes/val.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/callbacks.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/core.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/core/access.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/core/init.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/core/parseHTML.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/core/ready.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/core/var/rsingleTag.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/addGetHookIf.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/curCSS.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/defaultDisplay.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/hiddenVisibleSelectors.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/support.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/swap.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/var/cssExpand.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/var/getStyles.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/var/isHidden.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/var/rmargin.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/css/var/rnumnonpx.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/data.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/data/Data.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/data/accepts.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/data/var/data_priv.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/data/var/data_user.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/deferred.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/deprecated.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/dimensions.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/effects.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/effects/Tween.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/effects/animatedSelector.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/event.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/event/ajax.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/event/alias.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/event/support.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/exports/amd.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/exports/global.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/intro.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/jquery.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/manipulation.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/manipulation/_evalUrl.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/manipulation/support.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/manipulation/var/rcheckableType.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/offset.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/outro.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/queue.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/queue/delay.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/selector-native.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/selector-sizzle.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/selector.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/serialize.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/sizzle/dist/sizzle.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/sizzle/dist/sizzle.min.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/sizzle/dist/sizzle.min.map create mode 100644 user/themes/ouidade/bower_components/jquery/src/traversing.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/traversing/findFilter.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/traversing/var/rneedsContext.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/arr.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/class2type.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/concat.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/hasOwn.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/indexOf.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/pnum.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/push.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/rnotwhite.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/slice.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/strundefined.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/support.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/var/toString.js create mode 100644 user/themes/ouidade/bower_components/jquery/src/wrap.js create mode 100644 user/themes/ouidade/bower_components/masonry/.bower.json create mode 100644 user/themes/ouidade/bower_components/masonry/README.mdown create mode 100644 user/themes/ouidade/bower_components/masonry/bower.json create mode 100644 user/themes/ouidade/bower_components/masonry/changelog.md create mode 100644 user/themes/ouidade/bower_components/masonry/dist/masonry.pkgd.js create mode 100644 user/themes/ouidade/bower_components/masonry/dist/masonry.pkgd.min.js create mode 100644 user/themes/ouidade/bower_components/masonry/masonry.js create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/add-items.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/basic.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/bottom-up.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/browserify/index.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/browserify/main.js create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/element-sizing.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/fit-width.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/fluid.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/jquery.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/require-js/index.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/require-js/main.js create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/right-to-left.html create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/sandbox.css create mode 100644 user/themes/ouidade/bower_components/masonry/sandbox/stamps.html create mode 100644 user/themes/ouidade/bower_components/matches-selector/.bower.json create mode 100644 user/themes/ouidade/bower_components/matches-selector/README.md create mode 100644 user/themes/ouidade/bower_components/matches-selector/bower.json create mode 100644 user/themes/ouidade/bower_components/matches-selector/matches-selector.js create mode 100644 user/themes/ouidade/bower_components/modernizr/.bower.json create mode 100644 user/themes/ouidade/bower_components/modernizr/.editorconfig create mode 100644 user/themes/ouidade/bower_components/modernizr/.gitignore create mode 100644 user/themes/ouidade/bower_components/modernizr/.travis.yml create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/a-download.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/audio-audiodata-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/audio-webaudio-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/battery-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/battery-level.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/blob-constructor.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/canvas-todataurl-type.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/contenteditable.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/contentsecuritypolicy.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/contextmenu.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/cookies.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/cors.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-backgroundposition-shorthand.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-backgroundposition-xy.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-backgroundrepeat.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-backgroundsizecover.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-boxsizing.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-calc.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-cubicbezierrange.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-displayrunin.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-displaytable.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-filters.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-hyphens.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-lastchild.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-mask.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-mediaqueries.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-objectfit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-overflow-scrolling.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-pointerevents.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-positionsticky.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-regions.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-remunit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-resize.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-scrollbars.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-shapes.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-subpixelfont.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-supports.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-userselect.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-vhunit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-vmaxunit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-vminunit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/css-vwunit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/custom-protocol-handler.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/dart.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/dataview-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/dom-classlist.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/dom-createElement-attrs.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/dom-dataset.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/dom-microdata.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-datalist.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-details.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-output.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-progress-meter.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-ruby.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-time.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/elem-track.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/emoji.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/es5-strictmode.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/event-deviceorientation-motion.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/exif-orientation.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/file-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/file-filesystem.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/forms-fileinput.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/forms-formattribute.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/forms-inputnumber-l10n.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/forms-placeholder.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/forms-speechinput.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/forms-validation.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/fullscreen-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/gamepad.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/getusermedia.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/ie8compat.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/iframe-sandbox.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/iframe-seamless.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/iframe-srcdoc.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/img-apng.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/img-webp.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/json.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/lists-reversed.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/mathml.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/network-connection.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/network-eventsource.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/network-xhr2.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/notification.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/performance.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/pointerlock-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/quota-management-api.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/requestanimationframe.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/script-async.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/script-defer.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/style-scoped.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/svg-filters.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/unicode.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/url-data-uri.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/userdata.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/vibration.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/web-intents.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/webgl-extensions.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/websockets-binary.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/window-framed.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/workers-blobworkers.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/workers-dataworkers.js create mode 100644 user/themes/ouidade/bower_components/modernizr/feature-detects/workers-sharedworkers.js create mode 100644 user/themes/ouidade/bower_components/modernizr/grunt.js create mode 100644 user/themes/ouidade/bower_components/modernizr/media/Modernizr 2 Logo.ai create mode 100644 user/themes/ouidade/bower_components/modernizr/media/Modernizr 2 Logo.eps create mode 100644 user/themes/ouidade/bower_components/modernizr/media/Modernizr 2 Logo.pdf create mode 100644 user/themes/ouidade/bower_components/modernizr/media/Modernizr 2 Logo.png create mode 100644 user/themes/ouidade/bower_components/modernizr/media/Modernizr 2 Logo.svg create mode 100644 user/themes/ouidade/bower_components/modernizr/modernizr.js create mode 100644 user/themes/ouidade/bower_components/modernizr/readme.md create mode 100644 user/themes/ouidade/bower_components/modernizr/test/basic.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.eot create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.otf create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.svg create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.ttf create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.woff create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/alpha.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/apng_test.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/before-after.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/form_validation.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/ga.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/green5x5.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/hashchange.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/jquery.min.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml_ref.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/modernizr-1.7.min.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/png_alpha_result.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/pushstate.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/red30x30.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/ruby.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/stroked-text.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/style.css create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-html-blur.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-img.svg create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-img.svg.1 create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg_blur.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/table.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/text-shadow1.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/text-shadow2.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/windsong_font.png create mode 100644 user/themes/ouidade/bower_components/modernizr/test/caniuse_files/xhtml.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/index.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/basic.html create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/dumpdata.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/lib/detect-global.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/lib/jquery-1.7b2.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/lib/jsonselect.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/lib/polyfills.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/lib/uaparser.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/setup.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/unit-caniuse.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/js/unit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/qunit/qunit.css create mode 100644 user/themes/ouidade/bower_components/modernizr/test/qunit/qunit.js create mode 100644 user/themes/ouidade/bower_components/modernizr/test/qunit/run-qunit.js create mode 100644 user/themes/ouidade/bower_components/outlayer/.bower.json create mode 100644 user/themes/ouidade/bower_components/outlayer/README.md create mode 100644 user/themes/ouidade/bower_components/outlayer/bower.json create mode 100644 user/themes/ouidade/bower_components/outlayer/item.js create mode 100644 user/themes/ouidade/bower_components/outlayer/outlayer.js create mode 100644 user/themes/ouidade/css/styles.css create mode 100644 user/themes/ouidade/font/fontwebkit.css create mode 100644 user/themes/ouidade/font/webfonts/2F5366_0_0.eot create mode 100644 user/themes/ouidade/font/webfonts/2F5366_0_0.ttf create mode 100644 user/themes/ouidade/font/webfonts/2F5366_0_0.woff create mode 100644 user/themes/ouidade/font/webfonts/2F5366_0_0.woff2 create mode 100644 user/themes/ouidade/font/webfonts/2F5366_1_0.eot create mode 100644 user/themes/ouidade/font/webfonts/2F5366_1_0.ttf create mode 100644 user/themes/ouidade/font/webfonts/2F5366_1_0.woff create mode 100644 user/themes/ouidade/font/webfonts/2F5366_1_0.woff2 create mode 100644 user/themes/ouidade/gulpfile.js create mode 100644 user/themes/ouidade/js/dist/script.min.js create mode 100644 user/themes/ouidade/js/script.js create mode 100644 user/themes/ouidade/ouidade.php create mode 100644 user/themes/ouidade/ouidade.yaml create mode 100644 user/themes/ouidade/package.json create mode 100644 user/themes/ouidade/screenshot.png create mode 100644 user/themes/ouidade/scss/_settings.scss create mode 100644 user/themes/ouidade/scss/styles.scss create mode 100644 user/themes/ouidade/templates/categories.html.twig create mode 100644 user/themes/ouidade/templates/default.html.twig create mode 100644 user/themes/ouidade/templates/home.html.twig create mode 100644 user/themes/ouidade/templates/partials/base.html.twig create mode 100644 user/themes/ouidade/templates/partials/footer.html.twig create mode 100644 user/themes/ouidade/templates/partials/header.html.twig create mode 100644 user/themes/ouidade/templates/partials/projet-block.html.twig create mode 100644 user/themes/ouidade/templates/partials/tagslist.html.twig create mode 100644 user/themes/ouidade/templates/projet.html.twig create mode 100644 vendor/autoload.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/donatj/phpuseragentparser/CONTRIBUTING.md create mode 100644 vendor/donatj/phpuseragentparser/LICENSE.md create mode 100644 vendor/donatj/phpuseragentparser/README.md create mode 100644 vendor/donatj/phpuseragentparser/Source/UserAgentParser.php create mode 100644 vendor/erusev/parsedown-extra/LICENSE.txt create mode 100644 vendor/erusev/parsedown-extra/ParsedownExtra.php create mode 100644 vendor/erusev/parsedown-extra/README.md create mode 100644 vendor/erusev/parsedown/LICENSE.txt create mode 100644 vendor/erusev/parsedown/Parsedown.php create mode 100644 vendor/erusev/parsedown/README.md create mode 100644 vendor/filp/whoops/.gitattributes create mode 100644 vendor/filp/whoops/CONTRIBUTING.md create mode 100644 vendor/filp/whoops/LICENSE.md create mode 100644 vendor/filp/whoops/README.md create mode 100644 vendor/filp/whoops/src/Whoops/Exception/ErrorException.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/Formatter.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/Frame.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/FrameCollection.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/Inspector.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/CallbackHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/Handler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/HandlerInterface.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/JsonResponseHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/PlainTextHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/SoapResponseHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/XmlResponseHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Provider/Phalcon/WhoopsServiceProvider.php create mode 100644 vendor/filp/whoops/src/Whoops/Provider/Silex/WhoopsServiceProvider.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css create mode 100644 vendor/filp/whoops/src/Whoops/Resources/js/whoops.base.js create mode 100644 vendor/filp/whoops/src/Whoops/Resources/js/zepto.min.js create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/env_details.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/frame_list.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/header.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/layout.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Run.php create mode 100644 vendor/filp/whoops/src/Whoops/Util/Misc.php create mode 100644 vendor/filp/whoops/src/Whoops/Util/TemplateHelper.php create mode 100644 vendor/filp/whoops/src/deprecated/Zend/ExceptionStrategy.php create mode 100644 vendor/filp/whoops/src/deprecated/Zend/Module.php create mode 100644 vendor/filp/whoops/src/deprecated/Zend/RouteNotFoundStrategy.php create mode 100644 vendor/filp/whoops/src/deprecated/Zend/module.config.example.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/Common.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/GD.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Exceptions/GenerationError.php create mode 100644 vendor/gregwar/image/Gregwar/Image/GarbageCollect.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Image.php create mode 100644 vendor/gregwar/image/Gregwar/Image/ImageColor.php create mode 100644 vendor/gregwar/image/Gregwar/Image/LICENSE create mode 100644 vendor/gregwar/image/Gregwar/Image/README.md create mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Create.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Data.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Source/File.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Resource.php create mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Source.php create mode 100644 vendor/gregwar/image/Gregwar/Image/autoload.php create mode 100644 vendor/ircmaxell/password-compat/.gitattributes create mode 100644 vendor/ircmaxell/password-compat/LICENSE.md create mode 100644 vendor/ircmaxell/password-compat/README.md create mode 100644 vendor/ircmaxell/password-compat/lib/password.php create mode 100644 vendor/maximebf/debugbar/.gitattributes create mode 100644 vendor/maximebf/debugbar/CHANGELOG.md create mode 100644 vendor/maximebf/debugbar/CONTRIBUTING.md create mode 100644 vendor/maximebf/debugbar/LICENSE create mode 100644 vendor/maximebf/debugbar/README.md create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/CacheCacheCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/DoctrineCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/MonologCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/Propel2Collector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/PropelCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/SlimCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TwigCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/AggregatedCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/AssetProvider.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/ConfigCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollectorInterface.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/ExceptionsCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/LocalizationCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/MemoryCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/MessagesAggregateInterface.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/MessagesCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/PDOCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDO.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TracedStatement.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/PhpInfoCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/Renderable.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/RequestDataCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataCollector/TimeDataCollector.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatter.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatterInterface.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DebugBar.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/DebugBarException.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/HttpDriverInterface.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/JavascriptRenderer.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/OpenHandler.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/PhpHttpDriver.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/RequestIdGenerator.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/RequestIdGeneratorInterface.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/debugbar.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/debugbar.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/openhandler.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/openhandler.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets/mails/widget.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets/mails/widget.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets/sqlqueries/widget.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets/sqlqueries/widget.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets/templates/widget.css create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Resources/widgets/templates/widget.js create mode 100644 vendor/maximebf/debugbar/src/DebugBar/StandardDebugBar.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Storage/FileStorage.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Storage/MemcachedStorage.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Storage/PdoStorage.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Storage/RedisStorage.php create mode 100644 vendor/maximebf/debugbar/src/DebugBar/Storage/StorageInterface.php create mode 100644 vendor/monolog/monolog/.gitattributes create mode 100644 vendor/monolog/monolog/.php_cs create mode 100644 vendor/monolog/monolog/CHANGELOG.mdown create mode 100644 vendor/monolog/monolog/LICENSE create mode 100644 vendor/monolog/monolog/README.mdown create mode 100644 vendor/monolog/monolog/src/Monolog/ErrorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Logger.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Registry.php create mode 100644 vendor/mrclay/minify/.gitattributes create mode 100644 vendor/mrclay/minify/HISTORY.txt create mode 100644 vendor/mrclay/minify/LICENSE.txt create mode 100644 vendor/mrclay/minify/MIN.txt create mode 100644 vendor/mrclay/minify/README.txt create mode 100644 vendor/mrclay/minify/UPGRADING.txt create mode 100644 vendor/mrclay/minify/min/lib/CSSmin.php create mode 100644 vendor/mrclay/minify/min/lib/DooDigestAuth.php create mode 100644 vendor/mrclay/minify/min/lib/FirePHP.php create mode 100644 vendor/mrclay/minify/min/lib/HTTP/ConditionalGet.php create mode 100644 vendor/mrclay/minify/min/lib/HTTP/Encoder.php create mode 100644 vendor/mrclay/minify/min/lib/JSMin.php create mode 100644 vendor/mrclay/minify/min/lib/JSMinPlus.php create mode 100644 vendor/mrclay/minify/min/lib/Minify.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Build.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/CSS.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/CSS/Compressor.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/CSS/UriRewriter.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/CSSmin.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/APC.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/File.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/Memcache.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/WinCache.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/XCache.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/ZendPlatform.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/ClosureCompiler.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/CommentPreserver.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Base.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Files.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Groups.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/MinApp.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Page.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Version1.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/DebugDetector.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/HTML.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/HTML/Helper.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/ImportProcessor.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Lines.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Loader.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Logger.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Packer.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/Source.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.java create mode 100644 vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.php create mode 100644 vendor/mrclay/minify/min/lib/Minify/YUICompressor.php create mode 100644 vendor/mrclay/minify/min/lib/MrClay/Cli.php create mode 100644 vendor/mrclay/minify/min/lib/MrClay/Cli/Arg.php create mode 100644 vendor/pimple/pimple/CHANGELOG create mode 100644 vendor/pimple/pimple/LICENSE create mode 100644 vendor/pimple/pimple/README.rst create mode 100644 vendor/pimple/pimple/src/Pimple/Container.php create mode 100644 vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php create mode 100644 vendor/psr/log/LICENSE create mode 100644 vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100644 vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100644 vendor/psr/log/Psr/Log/LogLevel.php create mode 100644 vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100644 vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100644 vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100644 vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100644 vendor/psr/log/Psr/Log/NullLogger.php create mode 100644 vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php create mode 100644 vendor/psr/log/README.md create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/ArrayAccess.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/ArrayAccessWithGetters.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/Constructor.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/Countable.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/Export.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/ExportInterface.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/Iterator.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/NestedArrayAccess.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/NestedArrayAccessWithGetters.php create mode 100644 vendor/rockettheme/toolbox/ArrayTraits/src/Serializable.php create mode 100644 vendor/rockettheme/toolbox/Blueprints/src/Blueprints.php create mode 100644 vendor/rockettheme/toolbox/CHANGELOG.md create mode 100644 vendor/rockettheme/toolbox/DI/src/Container.php create mode 100644 vendor/rockettheme/toolbox/DI/src/ServiceProviderInterface.php create mode 100644 vendor/rockettheme/toolbox/Event/src/Event.php create mode 100644 vendor/rockettheme/toolbox/Event/src/EventDispatcher.php create mode 100644 vendor/rockettheme/toolbox/Event/src/EventSubscriberInterface.php create mode 100644 vendor/rockettheme/toolbox/File/src/File.php create mode 100644 vendor/rockettheme/toolbox/File/src/FileInterface.php create mode 100644 vendor/rockettheme/toolbox/File/src/IniFile.php create mode 100644 vendor/rockettheme/toolbox/File/src/JsonFile.php create mode 100644 vendor/rockettheme/toolbox/File/src/LogFile.php create mode 100644 vendor/rockettheme/toolbox/File/src/MarkdownFile.php create mode 100644 vendor/rockettheme/toolbox/File/src/MoFile.php create mode 100644 vendor/rockettheme/toolbox/File/src/PhpFile.php create mode 100644 vendor/rockettheme/toolbox/File/src/YamlFile.php create mode 100644 vendor/rockettheme/toolbox/LICENSE create mode 100644 vendor/rockettheme/toolbox/README.md create mode 100644 vendor/rockettheme/toolbox/ResourceLocator/src/RecursiveUniformResourceIterator.php create mode 100644 vendor/rockettheme/toolbox/ResourceLocator/src/ResourceLocatorInterface.php create mode 100644 vendor/rockettheme/toolbox/ResourceLocator/src/UniformResourceIterator.php create mode 100644 vendor/rockettheme/toolbox/ResourceLocator/src/UniformResourceLocator.php create mode 100644 vendor/rockettheme/toolbox/Session/src/Message.php create mode 100644 vendor/rockettheme/toolbox/Session/src/Session.php create mode 100644 vendor/rockettheme/toolbox/Session/tests/MessageTest.php create mode 100644 vendor/rockettheme/toolbox/StreamWrapper/src/ReadOnlyStream.php create mode 100644 vendor/rockettheme/toolbox/StreamWrapper/src/Stream.php create mode 100644 vendor/rockettheme/toolbox/StreamWrapper/src/StreamBuilder.php create mode 100644 vendor/rockettheme/toolbox/StreamWrapper/src/StreamInterface.php create mode 100644 vendor/symfony/console/Application.php create mode 100644 vendor/symfony/console/CHANGELOG.md create mode 100644 vendor/symfony/console/Command/Command.php create mode 100644 vendor/symfony/console/Command/HelpCommand.php create mode 100644 vendor/symfony/console/Command/ListCommand.php create mode 100644 vendor/symfony/console/ConsoleEvents.php create mode 100644 vendor/symfony/console/Descriptor/ApplicationDescription.php create mode 100644 vendor/symfony/console/Descriptor/Descriptor.php create mode 100644 vendor/symfony/console/Descriptor/DescriptorInterface.php create mode 100644 vendor/symfony/console/Descriptor/JsonDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/MarkdownDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/TextDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/XmlDescriptor.php create mode 100644 vendor/symfony/console/Event/ConsoleCommandEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleExceptionEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleTerminateEvent.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatter.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyle.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleStack.php create mode 100644 vendor/symfony/console/Helper/DebugFormatterHelper.php create mode 100644 vendor/symfony/console/Helper/DescriptorHelper.php create mode 100644 vendor/symfony/console/Helper/DialogHelper.php create mode 100644 vendor/symfony/console/Helper/FormatterHelper.php create mode 100644 vendor/symfony/console/Helper/Helper.php create mode 100644 vendor/symfony/console/Helper/HelperInterface.php create mode 100644 vendor/symfony/console/Helper/HelperSet.php create mode 100644 vendor/symfony/console/Helper/InputAwareHelper.php create mode 100644 vendor/symfony/console/Helper/ProcessHelper.php create mode 100644 vendor/symfony/console/Helper/ProgressBar.php create mode 100644 vendor/symfony/console/Helper/ProgressHelper.php create mode 100644 vendor/symfony/console/Helper/QuestionHelper.php create mode 100644 vendor/symfony/console/Helper/SymfonyQuestionHelper.php create mode 100644 vendor/symfony/console/Helper/Table.php create mode 100644 vendor/symfony/console/Helper/TableCell.php create mode 100644 vendor/symfony/console/Helper/TableHelper.php create mode 100644 vendor/symfony/console/Helper/TableSeparator.php create mode 100644 vendor/symfony/console/Helper/TableStyle.php create mode 100644 vendor/symfony/console/Input/ArgvInput.php create mode 100644 vendor/symfony/console/Input/ArrayInput.php create mode 100644 vendor/symfony/console/Input/Input.php create mode 100644 vendor/symfony/console/Input/InputArgument.php create mode 100644 vendor/symfony/console/Input/InputAwareInterface.php create mode 100644 vendor/symfony/console/Input/InputDefinition.php create mode 100644 vendor/symfony/console/Input/InputInterface.php create mode 100644 vendor/symfony/console/Input/InputOption.php create mode 100644 vendor/symfony/console/Input/StringInput.php create mode 100644 vendor/symfony/console/LICENSE create mode 100644 vendor/symfony/console/Logger/ConsoleLogger.php create mode 100644 vendor/symfony/console/Output/BufferedOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutputInterface.php create mode 100644 vendor/symfony/console/Output/NullOutput.php create mode 100644 vendor/symfony/console/Output/Output.php create mode 100644 vendor/symfony/console/Output/OutputInterface.php create mode 100644 vendor/symfony/console/Output/StreamOutput.php create mode 100644 vendor/symfony/console/Question/ChoiceQuestion.php create mode 100644 vendor/symfony/console/Question/ConfirmationQuestion.php create mode 100644 vendor/symfony/console/Question/Question.php create mode 100644 vendor/symfony/console/README.md create mode 100644 vendor/symfony/console/Shell.php create mode 100644 vendor/symfony/console/Style/OutputStyle.php create mode 100644 vendor/symfony/console/Style/StyleInterface.php create mode 100644 vendor/symfony/console/Style/SymfonyStyle.php create mode 100644 vendor/symfony/console/Tester/ApplicationTester.php create mode 100644 vendor/symfony/console/Tester/CommandTester.php create mode 100644 vendor/symfony/console/Tests/ApplicationTest.php create mode 100644 vendor/symfony/console/Tests/ClockMock.php create mode 100644 vendor/symfony/console/Tests/Command/CommandTest.php create mode 100644 vendor/symfony/console/Tests/Command/HelpCommandTest.php create mode 100644 vendor/symfony/console/Tests/Command/ListCommandTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/AbstractDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/JsonDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/MarkdownDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/ObjectsProvider.php create mode 100644 vendor/symfony/console/Tests/Descriptor/TextDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/XmlDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Fixtures/BarBucCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplication1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplication2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommand1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommand2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DummyOutput.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo1Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo2Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo3Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo4Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo5Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooSubnamespaced1Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooSubnamespaced2Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FoobarCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_0.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_3.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_4.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_5.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_6.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/command/command_7.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_0.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_5.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_6.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_7.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/TestCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/application_astext1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_astext2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_asxml1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_asxml2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_gethelp.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception3decorated.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1decorated.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/command_astext.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_asxml.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/definition_astext.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/definition_asxml.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_6.xml create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterStyleStackTest.php create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterStyleTest.php create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php create mode 100644 vendor/symfony/console/Tests/Helper/FormatterHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/HelperSetTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/ProcessHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/ProgressBarTest.php create mode 100644 vendor/symfony/console/Tests/Helper/QuestionHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/TableStyleTest.php create mode 100644 vendor/symfony/console/Tests/Helper/TableTest.php create mode 100644 vendor/symfony/console/Tests/Input/ArgvInputTest.php create mode 100644 vendor/symfony/console/Tests/Input/ArrayInputTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputArgumentTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputDefinitionTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputOptionTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputTest.php create mode 100644 vendor/symfony/console/Tests/Input/StringInputTest.php create mode 100644 vendor/symfony/console/Tests/Logger/ConsoleLoggerTest.php create mode 100644 vendor/symfony/console/Tests/Output/ConsoleOutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/NullOutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/OutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/StreamOutputTest.php create mode 100644 vendor/symfony/console/Tests/Style/SymfonyStyleTest.php create mode 100644 vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php create mode 100644 vendor/symfony/console/Tests/Tester/CommandTesterTest.php create mode 100644 vendor/symfony/console/composer.json create mode 100644 vendor/symfony/console/phpunit.xml.dist create mode 100644 vendor/symfony/event-dispatcher/CHANGELOG.md create mode 100644 vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php create mode 100644 vendor/symfony/event-dispatcher/Debug/WrappedListener.php create mode 100644 vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php create mode 100644 vendor/symfony/event-dispatcher/Event.php create mode 100644 vendor/symfony/event-dispatcher/EventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/EventDispatcherInterface.php create mode 100644 vendor/symfony/event-dispatcher/EventSubscriberInterface.php create mode 100644 vendor/symfony/event-dispatcher/GenericEvent.php create mode 100644 vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/LICENSE create mode 100644 vendor/symfony/event-dispatcher/README.md create mode 100644 vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/EventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/EventTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/GenericEventTest.php create mode 100644 vendor/symfony/event-dispatcher/Tests/ImmutableEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/composer.json create mode 100644 vendor/symfony/event-dispatcher/phpunit.xml.dist create mode 100644 vendor/symfony/var-dumper/CHANGELOG.md create mode 100644 vendor/symfony/var-dumper/Caster/AmqpCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/Caster.php create mode 100644 vendor/symfony/var-dumper/Caster/ConstStub.php create mode 100644 vendor/symfony/var-dumper/Caster/CutStub.php create mode 100644 vendor/symfony/var-dumper/Caster/DOMCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DoctrineCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ExceptionCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/MongoCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/PdoCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ReflectionCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ResourceCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/SplCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/StubCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/XmlResourceCaster.php create mode 100644 vendor/symfony/var-dumper/Cloner/AbstractCloner.php create mode 100644 vendor/symfony/var-dumper/Cloner/ClonerInterface.php create mode 100644 vendor/symfony/var-dumper/Cloner/Cursor.php create mode 100644 vendor/symfony/var-dumper/Cloner/Data.php create mode 100644 vendor/symfony/var-dumper/Cloner/DumperInterface.php create mode 100644 vendor/symfony/var-dumper/Cloner/Stub.php create mode 100644 vendor/symfony/var-dumper/Cloner/VarCloner.php create mode 100644 vendor/symfony/var-dumper/Dumper/AbstractDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/CliDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/DataDumperInterface.php create mode 100644 vendor/symfony/var-dumper/Dumper/HtmlDumper.php create mode 100644 vendor/symfony/var-dumper/Exception/ThrowingCasterException.php create mode 100644 vendor/symfony/var-dumper/LICENSE create mode 100644 vendor/symfony/var-dumper/README.md create mode 100644 vendor/symfony/var-dumper/Resources/functions/dump.php create mode 100644 vendor/symfony/var-dumper/Test/VarDumperTestCase.php create mode 100644 vendor/symfony/var-dumper/Test/VarDumperTestTrait.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/CasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/PdoCasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php create mode 100644 vendor/symfony/var-dumper/Tests/CliDumperTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php create mode 100644 vendor/symfony/var-dumper/Tests/HtmlDumperTest.php create mode 100644 vendor/symfony/var-dumper/Tests/Test/VarDumpTestTraitRequire54.php create mode 100644 vendor/symfony/var-dumper/Tests/Test/VarDumpTestTraitTest.php create mode 100644 vendor/symfony/var-dumper/Tests/VarClonerTest.php create mode 100644 vendor/symfony/var-dumper/VarDumper.php create mode 100644 vendor/symfony/var-dumper/composer.json create mode 100644 vendor/symfony/var-dumper/phpunit.xml.dist create mode 100644 vendor/symfony/yaml/CHANGELOG.md create mode 100644 vendor/symfony/yaml/Dumper.php create mode 100644 vendor/symfony/yaml/Escaper.php create mode 100644 vendor/symfony/yaml/Exception/DumpException.php create mode 100644 vendor/symfony/yaml/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/yaml/Exception/ParseException.php create mode 100644 vendor/symfony/yaml/Exception/RuntimeException.php create mode 100644 vendor/symfony/yaml/Inline.php create mode 100644 vendor/symfony/yaml/LICENSE create mode 100644 vendor/symfony/yaml/Parser.php create mode 100644 vendor/symfony/yaml/README.md create mode 100644 vendor/symfony/yaml/Tests/DumperTest.php create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/index.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfComments.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfTests.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml create mode 100644 vendor/symfony/yaml/Tests/InlineTest.php create mode 100644 vendor/symfony/yaml/Tests/ParseExceptionTest.php create mode 100644 vendor/symfony/yaml/Tests/ParserTest.php create mode 100644 vendor/symfony/yaml/Tests/YamlTest.php create mode 100644 vendor/symfony/yaml/Unescaper.php create mode 100644 vendor/symfony/yaml/Yaml.php create mode 100644 vendor/symfony/yaml/composer.json create mode 100644 vendor/symfony/yaml/phpunit.xml.dist create mode 100644 vendor/twig/twig/CHANGELOG create mode 100644 vendor/twig/twig/LICENSE create mode 100644 vendor/twig/twig/README.rst create mode 100644 vendor/twig/twig/lib/Twig/Autoloader.php create mode 100644 vendor/twig/twig/lib/Twig/BaseNodeVisitor.php create mode 100644 vendor/twig/twig/lib/Twig/Cache/Filesystem.php create mode 100644 vendor/twig/twig/lib/Twig/Cache/Null.php create mode 100644 vendor/twig/twig/lib/Twig/CacheInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Compiler.php create mode 100644 vendor/twig/twig/lib/Twig/CompilerInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Environment.php create mode 100644 vendor/twig/twig/lib/Twig/Error.php create mode 100644 vendor/twig/twig/lib/Twig/Error/Loader.php create mode 100644 vendor/twig/twig/lib/Twig/Error/Runtime.php create mode 100644 vendor/twig/twig/lib/Twig/Error/Syntax.php create mode 100644 vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php create mode 100644 vendor/twig/twig/lib/Twig/ExpressionParser.php create mode 100644 vendor/twig/twig/lib/Twig/Extension.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Core.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Debug.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Escaper.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Optimizer.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Profiler.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Sandbox.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/Staging.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/StringLoader.php create mode 100644 vendor/twig/twig/lib/Twig/ExtensionInterface.php create mode 100644 vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php create mode 100644 vendor/twig/twig/lib/Twig/Filter.php create mode 100644 vendor/twig/twig/lib/Twig/Filter/Function.php create mode 100644 vendor/twig/twig/lib/Twig/Filter/Method.php create mode 100644 vendor/twig/twig/lib/Twig/Filter/Node.php create mode 100644 vendor/twig/twig/lib/Twig/FilterCallableInterface.php create mode 100644 vendor/twig/twig/lib/Twig/FilterInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Function.php create mode 100644 vendor/twig/twig/lib/Twig/Function/Function.php create mode 100644 vendor/twig/twig/lib/Twig/Function/Method.php create mode 100644 vendor/twig/twig/lib/Twig/Function/Node.php create mode 100644 vendor/twig/twig/lib/Twig/FunctionCallableInterface.php create mode 100644 vendor/twig/twig/lib/Twig/FunctionInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Lexer.php create mode 100644 vendor/twig/twig/lib/Twig/LexerInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Loader/Array.php create mode 100644 vendor/twig/twig/lib/Twig/Loader/Chain.php create mode 100644 vendor/twig/twig/lib/Twig/Loader/Filesystem.php create mode 100644 vendor/twig/twig/lib/Twig/Loader/String.php create mode 100644 vendor/twig/twig/lib/Twig/LoaderInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Markup.php create mode 100644 vendor/twig/twig/lib/Twig/Node.php create mode 100644 vendor/twig/twig/lib/Twig/Node/AutoEscape.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Block.php create mode 100644 vendor/twig/twig/lib/Twig/Node/BlockReference.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Body.php create mode 100644 vendor/twig/twig/lib/Twig/Node/CheckSecurity.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Do.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Embed.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Array.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Call.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Constant.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Filter.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Function.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Name.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Parent.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/TempName.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Flush.php create mode 100644 vendor/twig/twig/lib/Twig/Node/For.php create mode 100644 vendor/twig/twig/lib/Twig/Node/ForLoop.php create mode 100644 vendor/twig/twig/lib/Twig/Node/If.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Import.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Include.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Macro.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Module.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Print.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Sandbox.php create mode 100644 vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Set.php create mode 100644 vendor/twig/twig/lib/Twig/Node/SetTemp.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Spaceless.php create mode 100644 vendor/twig/twig/lib/Twig/Node/Text.php create mode 100644 vendor/twig/twig/lib/Twig/NodeInterface.php create mode 100644 vendor/twig/twig/lib/Twig/NodeOutputInterface.php create mode 100644 vendor/twig/twig/lib/Twig/NodeTraverser.php create mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php create mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php create mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php create mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php create mode 100644 vendor/twig/twig/lib/Twig/NodeVisitorInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Parser.php create mode 100644 vendor/twig/twig/lib/Twig/ParserInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php create mode 100644 vendor/twig/twig/lib/Twig/Profiler/Profile.php create mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php create mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php create mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php create mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php create mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php create mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php create mode 100644 vendor/twig/twig/lib/Twig/SimpleFilter.php create mode 100644 vendor/twig/twig/lib/Twig/SimpleFunction.php create mode 100644 vendor/twig/twig/lib/Twig/SimpleTest.php create mode 100644 vendor/twig/twig/lib/Twig/Template.php create mode 100644 vendor/twig/twig/lib/Twig/TemplateInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Test.php create mode 100644 vendor/twig/twig/lib/Twig/Test/Function.php create mode 100644 vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php create mode 100644 vendor/twig/twig/lib/Twig/Test/Method.php create mode 100644 vendor/twig/twig/lib/Twig/Test/Node.php create mode 100644 vendor/twig/twig/lib/Twig/Test/NodeTestCase.php create mode 100644 vendor/twig/twig/lib/Twig/TestCallableInterface.php create mode 100644 vendor/twig/twig/lib/Twig/TestInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Token.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Block.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Do.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Embed.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Extends.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Filter.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Flush.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/For.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/From.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/If.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Import.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Include.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Macro.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Set.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Use.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParserBroker.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php create mode 100644 vendor/twig/twig/lib/Twig/TokenParserInterface.php create mode 100644 vendor/twig/twig/lib/Twig/TokenStream.php create mode 100644 vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php create mode 100644 vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php create mode 100644 web.config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a3d5bf --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +cache +logs +images +user/pages +node_modules diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..db50159 --- /dev/null +++ b/.htaccess @@ -0,0 +1,63 @@ + + +RewriteEngine On + +## Begin RewriteBase +# If you are getting 404 errors on subpages, you may have to uncomment the RewriteBase entry +# You should change the '/' to your appropriate subfolder. For example if you have +# your Grav install at the root of your site '/' should work, else it might be something +# along the lines of: RewriteBase / +## + +# RewriteBase / + +## End - RewriteBase + +## Begin - Exploits +# If you experience problems on your site block out the operations listed below +# This attempts to block the most common type of exploit `attempts` to Grav +# +# Block out any script trying to base64_encode data within the URL. +RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] +# Block out any script that includes a ' . "\n"; + } + foreach ($this->js_no_pipeline as $file) { + if ($group && $file['group'] == $group) { + $output .= '' . "\n"; + } + } + } else { + foreach ($this->js as $file) { + if ($group && $file['group'] == $group) { + $output .= '' . "\n"; + } + } + } + + // Render Inline JS + foreach ($this->inline_js as $inline) { + if ($group && $inline['group'] == $group) { + $inline_js .= $inline['asset'] . "\n"; + } + } + + if ($inline_js) { + $output .= "\n\n"; + } + + return $output; + } + + /** + * Minify and concatenate CSS. + * + * @return string + */ + protected function pipelineCss($group = 'head') + { + /** @var Cache $cache */ + $cache = self::getGrav()['cache']; + $key = '?' . $cache->getKey(); + + // temporary list of assets to pipeline + $temp_css = []; + + // clear no-pipeline assets lists + $this->css_no_pipeline = []; + + $file = md5(json_encode($this->css) . $this->css_minify . $this->css_rewrite . $group) . '.css'; + + $relative_path = "{$this->base_url}{$this->assets_url}/{$file}"; + $absolute_path = $this->assets_dir . $file; + + // If pipeline exist return it + if (file_exists($absolute_path)) { + return $relative_path . $key; + } + + // Remove any non-pipeline files + foreach ($this->css as $id => $asset) { + if ($asset['group'] == $group) { + if (!$asset['pipeline']) { + $this->css_no_pipeline[$id] = $asset; + } else { + $temp_css[$id] = $asset; + } + } + } + + //if nothing found get out of here! + if (count($temp_css) == 0) { + return false; + } + + $css_minify = $this->css_minify; + + // If this is a Windows server, and minify_windows is false (default value) skip the + // minification process because it will cause Apache to die/crash due to insufficient + // ThreadStackSize in httpd.conf - See: https://bugs.php.net/bug.php?id=47689 + if (strtoupper(substr(php_uname('s'), 0, 3)) === 'WIN' && !$this->css_minify_windows) { + $css_minify = false; + } + + // Concatenate files + $buffer = $this->gatherLinks($temp_css, CSS_ASSET); + if ($css_minify) { + $min = new \CSSmin(); + $buffer = $min->run($buffer); + } + + // Write file + if (strlen(trim($buffer)) > 0) { + file_put_contents($absolute_path, $buffer); + return $relative_path . $key; + } else { + return false; + } + } + + /** + * Minify and concatenate JS files. + * + * @return string + */ + protected function pipelineJs($group = 'head') + { + /** @var Cache $cache */ + $cache = self::getGrav()['cache']; + $key = '?' . $cache->getKey(); + + // temporary list of assets to pipeline + $temp_js = []; + + // clear no-pipeline assets lists + $this->js_no_pipeline = []; + + $file = md5(json_encode($this->js) . $this->js_minify . $group) . '.js'; + + $relative_path = "{$this->base_url}{$this->assets_url}/{$file}"; + $absolute_path = $this->assets_dir . $file; + + // If pipeline exist return it + if (file_exists($absolute_path)) { + return $relative_path . $key; + } + + // Remove any non-pipeline files + foreach ($this->js as $id => $asset) { + if ($asset['group'] == $group) { + if (!$asset['pipeline']) { + $this->js_no_pipeline[] = $asset; + } else { + $temp_js[$id] = $asset; + } + } + } + + //if nothing found get out of here! + if (count($temp_js) == 0) { + return false; + } + + // Concatenate files + $buffer = $this->gatherLinks($temp_js, JS_ASSET); + if ($this->js_minify) { + $buffer = \JSMin::minify($buffer); + } + + // Write file + if (strlen(trim($buffer)) > 0) { + file_put_contents($absolute_path, $buffer); + return $relative_path . $key; + } else { + return false; + } + } + + /** + * Return the array of all the registered CSS assets + * + * @return array + */ + public function getCss() + { + return $this->css; + } + + /** + * Return the array of all the registered JS assets + * + * @return array + */ + public function getJs() + { + return $this->js; + } + + /** + * Return the array of all the registered collections + * + * @return array + */ + public function getCollections() + { + return $this->collections; + } + + /** + * Determines if an asset exists as a collection, CSS or JS reference + * + * @param $asset + * + * @return bool + */ + public function exists($asset) + { + if (isset($this->collections[$asset]) || + isset($this->css[$asset]) || + isset($this->js[$asset])) { + return true; + } else { + return false; + } + } + + /** + * Add/replace collection. + * + * @param string $collectionName + * @param array $assets + * @param bool $overwrite + * + * @return $this + */ + public function registerCollection($collectionName, Array $assets, $overwrite = false) + { + if ($overwrite || !isset($this->collections[$collectionName])) { + $this->collections[$collectionName] = $assets; + } + + return $this; + } + + /** + * Reset all assets. + * + * @return $this + */ + public function reset() + { + return $this->resetCss()->resetJs(); + } + + /** + * Reset JavaScript assets. + * + * @return $this + */ + public function resetJs() + { + $this->js = array(); + + return $this; + } + + /** + * Reset CSS assets. + * + * @return $this + */ + public function resetCss() + { + $this->css = array(); + + return $this; + } + + /** + * Add all CSS assets within $directory (relative to public dir). + * + * @param string $directory Relative to $this->public_dir + * + * @return $this + */ + public function addDirCss($directory) + { + return $this->addDir($directory, self::CSS_REGEX); + } + + /** + * Add all assets matching $pattern within $directory. + * + * @param string $directory Relative to $this->public_dir + * @param string $pattern (regex) + * + * @return $this + * @throws Exception + */ + public function addDir($directory, $pattern = self::DEFAULT_REGEX) + { + // Check if public_dir exists + if (!is_dir($this->assets_dir)) { + throw new Exception('Assets: Public dir not found'); + } + + // Get files + $files = $this->rglob($this->assets_dir . DIRECTORY_SEPARATOR . $directory, $pattern, $this->assets_dir); + + // No luck? Nothing to do + if (!$files) { + return $this; + } + + // Add CSS files + if ($pattern === self::CSS_REGEX) { + $this->css = array_unique(array_merge($this->css, $files)); + return $this; + } + + // Add JavaScript files + if ($pattern === self::JS_REGEX) { + $this->js = array_unique(array_merge($this->js, $files)); + return $this; + } + + // Unknown pattern. We must poll to know the extension :( + foreach ($files as $asset) { + $info = pathinfo($asset); + if (isset($info['extension'])) { + $ext = strtolower($info['extension']); + if ($ext === 'css' && !in_array($asset, $this->css)) { + $this->css[] = $asset; + } elseif ($ext === 'js' && !in_array($asset, $this->js)) { + $this->js[] = $asset; + } + } + } + + return $this; + } + + /** + * Determine whether a link is local or remote. + * + * Understands both "http://" and "https://" as well as protocol agnostic links "//" + * + * @param string $link + * + * @return bool + */ + protected function isRemoteLink($link) + { + return ('http://' === substr($link, 0, 7) || 'https://' === substr($link, 0, 8) + || '//' === substr($link, 0, 2)); + } + + /** + * Build local links including grav asset shortcodes + * + * @param string $asset the asset string reference + * + * @return string the final link url to the asset + */ + protected function buildLocalLink($asset) + { + try { + $asset = self::getGrav()['locator']->findResource($asset, false); + } catch (\Exception $e) { + } + + return $asset ? $this->base_url . ltrim($asset, '/') : false; + } + + /** + * Build an HTML attribute string from an array. + * + * @param array $attributes + * + * @return string + */ + protected function attributes(array $attributes) + { + $html = ''; + + foreach ($attributes as $key => $value) { + // For numeric keys we will assume that the key and the value are the same + // as this will convert HTML attributes such as "required" to a correct + // form like required="required" instead of using incorrect numerics. + if (is_numeric($key)) { + $key = $value; + } + if (is_array($value)) { + $value = implode(' ', $value); + } + + $element = $key . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"'; + $html .= ' ' . $element; + } + + return $html; + } + + /** + * Download and concatenate the content of several links. + * + * @param array $links + * @param bool $css + * + * @return string + */ + protected function gatherLinks(array $links, $css = true) + { + + + $buffer = ''; + $local = true; + + foreach ($links as $asset) { + $link = $asset['asset']; + $relative_path = $link; + + if ($this->isRemoteLink($link)) { + $local = false; + if ('//' === substr($link, 0, 2)) { + $link = 'http:' . $link; + } + } else { + // Fix to remove relative dir if grav is in one + if (($this->base_url != '/') && (strpos($this->base_url, $link) == 0)) { + $base_url = '#' . preg_quote($this->base_url, '#') . '#'; + $relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/'); + } + + $relative_dir = dirname($relative_path); + $link = ROOT_DIR . $relative_path; + } + + $file = ($this->fetch_command instanceof Closure) ? @$this->fetch_command->__invoke($link) : @file_get_contents($link); + + // No file found, skip it... + if ($file === false) { + continue; + } + + // Double check last character being + if (!$css) { + $file = rtrim($file, ' ;') . ';'; + } + + // If this is CSS + the file is local + rewrite enabled + if ($css && $local && $this->css_rewrite) { + $file = $this->cssRewrite($file, $relative_dir); + } + + $buffer .= $file; + } + + // Pull out @imports and move to top + if ($css) { + $buffer = $this->moveImports($buffer); + } + + return $buffer; + } + + /** + * Finds relative CSS urls() and rewrites the URL with an absolute one + * + * @param $file the css source file + * @param $relative_path relative path to the css file + * + * @return mixed + */ + protected function cssRewrite($file, $relative_path) + { + // Strip any sourcemap comments + $file = preg_replace(self::CSS_SOURCEMAP_REGEX, '', $file); + + // Find any css url() elements, grab the URLs and calculate an absolute path + // Then replace the old url with the new one + $file = preg_replace_callback( + self::CSS_URL_REGEX, + function ($matches) use ($relative_path) { + + $old_url = $matches[1]; + + // ensure this is not a data url + if (strpos($old_url, 'data:') === 0) { + return $matches[0]; + } + + $new_url = $this->base_url . ltrim(Utils::normalizePath($relative_path . '/' . $old_url), '/'); + + return str_replace($old_url, $new_url, $matches[0]); + }, + $file + ); + + return $file; + } + + /** + * Moves @import statements to the top of the file per the CSS specification + * + * @param string $file the file containing the combined CSS files + * + * @return string the modified file with any @imports at the top of the file + */ + protected function moveImports($file) + { + $this->imports = array(); + + $file = preg_replace_callback( + self::CSS_IMPORT_REGEX, + function ($matches) { + $this->imports[] = $matches[0]; + return ''; + }, + $file + ); + + return implode("\n", $this->imports) . "\n\n" . $file; + } + + /** + * Recursively get files matching $pattern within $directory. + * + * @param string $directory + * @param string $pattern (regex) + * @param string $ltrim Will be trimmed from the left of the file path + * + * @return array + */ + protected function rglob($directory, $pattern, $ltrim = null) + { + $iterator = new RegexIterator( + new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + $directory, + FilesystemIterator::SKIP_DOTS + ) + ), + $pattern + ); + $offset = strlen($ltrim); + $files = array(); + + foreach ($iterator as $file) { + $files[] = substr($file->getPathname(), $offset); + } + + return $files; + } + + /** + * Add all JavaScript assets within $directory. + * + * @param string $directory Relative to $this->public_dir + * + * @return $this + */ + public function addDirJs($directory) + { + return $this->addDir($directory, self::JS_REGEX); + } + + public function __toString() + { + return ''; + } + + /** + * @param $a + * @param $b + * + * @return mixed + */ + protected function priorityCompare($a, $b) + { + return $a ['priority'] - $b ['priority']; + } + +} diff --git a/system/src/Grav/Common/Backup/ZipBackup.php b/system/src/Grav/Common/Backup/ZipBackup.php new file mode 100644 index 0000000..c73358e --- /dev/null +++ b/system/src/Grav/Common/Backup/ZipBackup.php @@ -0,0 +1,130 @@ +findResource('backup://', true); + + if (!$destination) + throw new \RuntimeException('The backup folder is missing.'); + + Folder::mkdir($destination); + } + + $name = self::getGrav()['config']->get('site.title', basename(GRAV_ROOT)); + + $inflector = new Inflector(); + + if (is_dir($destination)) { + $date = date('YmdHis', time()); + $filename = trim($inflector->hyphenize($name), '-') . '-' . $date . '.zip'; + $destination = rtrim($destination, DS) . DS . $filename; + } + + $messager && $messager([ + 'type' => 'message', + 'level' => 'info', + 'message' => 'Creating new Backup "' . $destination . '"' + ]); + $messager && $messager([ + 'type' => 'message', + 'level' => 'info', + 'message' => '' + ]); + + $zip = new \ZipArchive(); + $zip->open($destination, \ZipArchive::CREATE); + + static::folderToZip(GRAV_ROOT, $zip, strlen(rtrim(GRAV_ROOT, DS) . DS), $messager); + + $messager && $messager([ + 'type' => 'progress', + 'percentage' => false, + 'complete' => true + ]); + + $messager && $messager([ + 'type' => 'message', + 'level' => 'info', + 'message' => '' + ]); + $messager && $messager([ + 'type' => 'message', + 'level' => 'info', + 'message' => 'Saving and compressing archive...' + ]); + + $zip->close(); + + return $destination; + } + + /** + * @param $folder + * @param $zipFile + * @param $exclusiveLength + * @param $messager + */ + private static function folderToZip($folder, \ZipArchive &$zipFile, $exclusiveLength, callable $messager = null) + { + $handle = opendir($folder); + while (false !== $f = readdir($handle)) { + if ($f != '.' && $f != '..') { + $filePath = "$folder/$f"; + // Remove prefix from file path before add to zip. + $localPath = substr($filePath, $exclusiveLength); + + if (in_array($f, static::$ignoreFolders)) { + continue; + } elseif (in_array($localPath, static::$ignorePaths)) { + $zipFile->addEmptyDir($f); + continue; + } + + if (is_file($filePath)) { + $zipFile->addFile($filePath, $localPath); + + $messager && $messager([ + 'type' => 'progress', + 'percentage' => false, + 'complete' => false + ]); + } elseif (is_dir($filePath)) { + // Add sub-directory. + $zipFile->addEmptyDir($localPath); + static::folderToZip($filePath, $zipFile, $exclusiveLength, $messager); + } + } + } + closedir($handle); + } +} diff --git a/system/src/Grav/Common/Browser.php b/system/src/Grav/Common/Browser.php new file mode 100644 index 0000000..4feea46 --- /dev/null +++ b/system/src/Grav/Common/Browser.php @@ -0,0 +1,58 @@ +useragent = parse_user_agent(); + } catch (\InvalidArgumentException $e) { + $this->useragent = parse_user_agent("Mozilla/5.0 (compatible; Unknown;)"); + } + } + + public function getBrowser() + { + return strtolower($this->useragent['browser']); + } + + public function getPlatform() + { + return strtolower($this->useragent['platform']); + } + + public function getLongVersion() + { + return $this->useragent['version']; + } + + public function getVersion() + { + $version = explode('.', $this->getLongVersion()); + return intval($version[0]); + } + + /** + * Determine if the request comes from a human, or from a bot/crawler + */ + public function isHuman() + { + $browser = $this->getBrowser(); + if (empty($browser)) { + return false; + } + + if (preg_match('~(bot|crawl)~i', $browser)) { + return false; + } + + return true; + } +} diff --git a/system/src/Grav/Common/Cache.php b/system/src/Grav/Common/Cache.php new file mode 100644 index 0000000..0445c50 --- /dev/null +++ b/system/src/Grav/Common/Cache.php @@ -0,0 +1,314 @@ +init($grav); + } + + /** + * Initialization that sets a base key and the driver based on configuration settings + * + * @param Grav $grav + * @return void + */ + public function init(Grav $grav) + { + /** @var Config $config */ + $this->config = $grav['config']; + $this->now = time(); + + $this->cache_dir = $grav['locator']->findResource('cache://doctrine', true, true); + + /** @var Uri $uri */ + $uri = $grav['uri']; + + $prefix = $this->config->get('system.cache.prefix'); + + $this->enabled = (bool) $this->config->get('system.cache.enabled'); + + // Cache key allows us to invalidate all cache on configuration changes. + $this->key = ($prefix ? $prefix : 'g') . '-' . substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION), 2, 8); + + $this->driver = $this->getCacheDriver(); + + // Set the cache namespace to our unique key + $this->driver->setNamespace($this->key); + } + + /** + * Automatically picks the cache mechanism to use. If you pick one manually it will use that + * If there is no config option for $driver in the config, or it's set to 'auto', it will + * pick the best option based on which cache extensions are installed. + * + * @return DoctrineCacheDriver The cache driver to use + */ + public function getCacheDriver() + { + $setting = $this->config->get('system.cache.driver'); + $driver_name = 'file'; + + if (!$setting || $setting == 'auto') { + if (extension_loaded('apc')) { + $driver_name = 'apc'; + } elseif (extension_loaded('wincache')) { + $driver_name = 'wincache'; + } elseif (extension_loaded('xcache')) { + $driver_name = 'xcache'; + } + } else { + $driver_name = $setting; + } + + switch ($driver_name) { + case 'apc': + $driver = new \Doctrine\Common\Cache\ApcCache(); + break; + + case 'wincache': + $driver = new \Doctrine\Common\Cache\WinCacheCache(); + break; + + case 'xcache': + $driver = new \Doctrine\Common\Cache\XcacheCache(); + break; + + case 'memcache': + $memcache = new \Memcache(); + $memcache->connect($this->config->get('system.cache.memcache.server','localhost'), + $this->config->get('system.cache.memcache.port', 11211)); + $driver = new \Doctrine\Common\Cache\MemcacheCache(); + $driver->setMemcache($memcache); + break; + + case 'redis': + $redis = new \Redis(); + $redis->connect($this->config->get('system.cache.redis.server','localhost'), + $this->config->get('system.cache.redis.port', 6379)); + + $driver = new \Doctrine\Common\Cache\RedisCache(); + $driver->setRedis($redis); + break; + + default: + $driver = new \Doctrine\Common\Cache\FilesystemCache($this->cache_dir); + break; + } + + return $driver; + } + + /** + * Gets a cached entry if it exists based on an id. If it does not exist, it returns false + * + * @param string $id the id of the cached entry + * @return object returns the cached entry, can be any type, or false if doesn't exist + */ + public function fetch($id) + { + if ($this->enabled) { + return $this->driver->fetch($id); + } else { + return false; + } + } + + /** + * Stores a new cached entry. + * + * @param string $id the id of the cached entry + * @param array|object $data the data for the cached entry to store + * @param int $lifetime the lifetime to store the entry in seconds + */ + public function save($id, $data, $lifetime = null) + { + if ($this->enabled) { + if ($lifetime === null) { + $lifetime = $this->getLifetime(); + } + $this->driver->save($id, $data, $lifetime); + } + } + + /** + * Getter method to get the cache key + */ + public function getKey() + { + return $this->key; + } + + /** + * Helper method to clear all Grav caches + * + * @param string $remove standard|all|assets-only|images-only|cache-only + * + * @return array + */ + public static function clearCache($remove = 'standard') + { + + $output = []; + $user_config = USER_DIR . 'config/system.yaml'; + + switch($remove) { + case 'all': + $remove_paths = self::$all_remove; + break; + case 'assets-only': + $remove_paths = self::$assets_remove; + break; + case 'images-only': + $remove_paths = self::$images_remove; + break; + case 'cache-only': + $remove_paths = self::$cache_remove; + break; + default: + $remove_paths = self::$standard_remove; + } + + + foreach ($remove_paths as $path) { + + $anything = false; + $files = glob(ROOT_DIR . $path . '*'); + + if (is_array($files)) { + foreach ($files as $file) { + if (is_file($file)) { + if (@unlink($file)) { + $anything = true; + } + } elseif (is_dir($file)) { + if (@Folder::delete($file)) { + $anything = true; + } + } + } + } + + if ($anything) { + $output[] = 'Cleared: ' . $path . '*'; + } + } + + $output[] = ''; + + if (($remove == 'all' || $remove == 'standard') && file_exists($user_config)) { + touch($user_config); + + $output[] = 'Touched: ' . $user_config; + $output[] = ''; + } + + return $output; + } + + + /** + * Set the cache lifetime programmatically + * + * @param int $future timestamp + */ + public function setLifetime($future) + { + if (!$future) { + return; + } + + $interval = $future - $this->now; + if ($interval > 0 && $interval < $this->getLifetime()) { + $this->lifetime = $interval; + } + } + + + /** + * Retrieve the cache lifetime (in seconds) + * + * @return mixed + */ + public function getLifetime() + { + if ($this->lifetime === null) { + $this->lifetime = $this->config->get('system.cache.lifetime') ?: 604800; // 1 week default + } + + return $this->lifetime; + } +} diff --git a/system/src/Grav/Common/Composer.php b/system/src/Grav/Common/Composer.php new file mode 100644 index 0000000..5efde89 --- /dev/null +++ b/system/src/Grav/Common/Composer.php @@ -0,0 +1,55 @@ +grav = $grav ?: Grav::instance(); + } + + public function init() + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + $blueprints = $locator->findResources('blueprints://config'); + $plugins = $locator->findResources('plugins://'); + + $blueprintFiles = $this->getBlueprintFiles($blueprints, $plugins); + + $this->loadCompiledBlueprints($plugins + $blueprints, $blueprintFiles); + } + + protected function loadCompiledBlueprints($blueprints, $blueprintFiles) + { + $checksum = md5(serialize($blueprints)); + $filename = CACHE_DIR . 'compiled/blueprints/' . $checksum .'.php'; + $checksum .= ':'.md5(serialize($blueprintFiles)); + $class = get_class($this); + $file = PhpFile::instance($filename); + + if ($file->exists()) { + $cache = $file->exists() ? $file->content() : null; + } else { + $cache = null; + } + + + // Load real file if cache isn't up to date (or is invalid). + if ( + !is_array($cache) + || empty($cache['checksum']) + || empty($cache['$class']) + || $cache['checksum'] != $checksum + || $cache['@class'] != $class + ) { + // Attempt to lock the file for writing. + $file->lock(false); + + // Load blueprints. + $this->blueprints = new Blueprints(); + foreach ($blueprintFiles as $key => $files) { + $this->loadBlueprints($key); + } + + $cache = [ + '@class' => $class, + 'checksum' => $checksum, + 'files' => $blueprintFiles, + 'data' => $this->blueprints->toArray() + ]; + + // If compiled file wasn't already locked by another process, save it. + if ($file->locked() !== false) { + $file->save($cache); + $file->unlock(); + } + } else { + $this->blueprints = new Blueprints($cache['data']); + } + } + + /** + * Load global blueprints. + * + * @param string $key + * @param array $files + */ + public function loadBlueprints($key, array $files = null) + { + if (is_null($files)) { + $files = $this->files[$key]; + } + foreach ($files as $name => $item) { + $file = CompiledYamlFile::instance($item['file']); + $this->blueprints->embed($name, $file->content(), '/'); + } + } + + /** + * Get all blueprint files (including plugins). + * + * @param array $blueprints + * @param array $plugins + * @return array + */ + protected function getBlueprintFiles(array $blueprints, array $plugins) + { + $list = []; + foreach (array_reverse($plugins) as $folder) { + $list += $this->detectPlugins($folder, true); + } + foreach (array_reverse($blueprints) as $folder) { + $list += $this->detectConfig($folder, true); + } + return $list; + } + + /** + * Detects all plugins with a configuration file and returns last modification time. + * + * @param string $lookup Location to look up from. + * @param bool $blueprints + * @return array + * @internal + */ + protected function detectPlugins($lookup = SYSTEM_DIR, $blueprints = false) + { + $find = $blueprints ? 'blueprints.yaml' : '.yaml'; + $location = $blueprints ? 'blueprintFiles' : 'configFiles'; + $path = trim(Folder::getRelativePath($lookup), '/'); + if (isset($this->{$location}[$path])) { + return [$path => $this->{$location}[$path]]; + } + + $list = []; + + if (is_dir($lookup)) { + $iterator = new \DirectoryIterator($lookup); + + /** @var \DirectoryIterator $directory */ + foreach ($iterator as $directory) { + if (!$directory->isDir() || $directory->isDot()) { + continue; + } + + $name = $directory->getBasename(); + $filename = "{$path}/{$name}/" . ($find && $find[0] != '.' ? $find : $name . $find); + + if (is_file($filename)) { + $list["plugins/{$name}"] = ['file' => $filename, 'modified' => filemtime($filename)]; + } + } + } + + $this->{$location}[$path] = $list; + + return [$path => $list]; + } + + /** + * Detects all plugins with a configuration file and returns last modification time. + * + * @param string $lookup Location to look up from. + * @param bool $blueprints + * @return array + * @internal + */ + protected function detectConfig($lookup = SYSTEM_DIR, $blueprints = false) + { + $location = $blueprints ? 'blueprintFiles' : 'configFiles'; + $path = trim(Folder::getRelativePath($lookup), '/'); + if (isset($this->{$location}[$path])) { + return [$path => $this->{$location}[$path]]; + } + + if (is_dir($lookup)) { + // Find all system and user configuration files. + $options = [ + 'compare' => 'Filename', + 'pattern' => '|\.yaml$|', + 'filters' => [ + 'key' => '|\.yaml$|', + 'value' => function (\RecursiveDirectoryIterator $file) use ($path) { + return ['file' => "{$path}/{$file->getSubPathname()}", 'modified' => $file->getMTime()]; + }], + 'key' => 'SubPathname' + ]; + + $list = Folder::all($lookup, $options); + } else { + $list = []; + } + + $this->{$location}[$path] = $list; + + return [$path => $list]; + } +} diff --git a/system/src/Grav/Common/Config/Config.php b/system/src/Grav/Common/Config/Config.php new file mode 100644 index 0000000..cc8acc0 --- /dev/null +++ b/system/src/Grav/Common/Config/Config.php @@ -0,0 +1,479 @@ + [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['system'], + ] + ], + 'user' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user'], + ] + ], + 'blueprints' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user://blueprints', 'system/blueprints'], + ] + ], + 'config' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user://config', 'system/config'], + ] + ], + 'plugins' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user://plugins'], + ] + ], + 'plugin' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user://plugins'], + ] + ], + 'themes' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user://themes'], + ] + ], + 'languages' => [ + 'type' => 'ReadOnlyStream', + 'prefixes' => [ + '' => ['user://languages', 'system/languages'], + ] + ], + 'cache' => [ + 'type' => 'Stream', + 'prefixes' => [ + '' => ['cache'], + 'images' => ['images'] + ] + ], + 'log' => [ + 'type' => 'Stream', + 'prefixes' => [ + '' => ['logs'] + ] + ], + 'backup' => [ + 'type' => 'Stream', + 'prefixes' => [ + '' => ['backup'] + ] + ] + ]; + + protected $setup = []; + + protected $blueprintFiles = []; + protected $configFiles = []; + protected $languageFiles = []; + protected $checksum; + protected $timestamp; + + protected $configLookup; + protected $blueprintLookup; + protected $pluginLookup; + protected $languagesLookup; + + protected $finder; + protected $environment; + protected $messages = []; + + protected $languages; + + public function __construct(array $setup = array(), Grav $grav = null, $environment = null) + { + $this->grav = $grav ?: Grav::instance(); + $this->finder = new ConfigFinder; + $this->environment = $environment ?: 'localhost'; + $this->messages[] = 'Environment Name: ' . $this->environment; + + // Make sure that + if (!isset($setup['streams']['schemes'])) { + $setup['streams']['schemes'] = []; + } + $setup['streams']['schemes'] += $this->streams; + + $setup = $this->autoDetectEnvironmentConfig($setup); + + $this->setup = $setup; + parent::__construct($setup); + + $this->check(); + } + + public function key() + { + return $this->checksum(); + } + + public function reload() + { + $this->items = $this->setup; + $this->check(); + $this->init(); + $this->debug(); + + return $this; + } + + protected function check() + { + $streams = isset($this->items['streams']['schemes']) ? $this->items['streams']['schemes'] : null; + if (!is_array($streams)) { + throw new \InvalidArgumentException('Configuration is missing streams.schemes!'); + } + $diff = array_keys(array_diff_key($this->streams, $streams)); + if ($diff) { + throw new \InvalidArgumentException( + sprintf('Configuration is missing keys %s from streams.schemes!', implode(', ', $diff)) + ); + } + } + + public function debug() + { + foreach ($this->messages as $message) { + $this->grav['debugger']->addMessage($message); + } + $this->messages = []; + } + + public function init() + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + $this->configLookup = $locator->findResources('config://'); + $this->blueprintLookup = $locator->findResources('blueprints://config'); + $this->pluginLookup = $locator->findResources('plugins://'); + + + $this->loadCompiledBlueprints($this->blueprintLookup, $this->pluginLookup, 'master'); + $this->loadCompiledConfig($this->configLookup, $this->pluginLookup, 'master'); + + // process languages if supported + if ($this->get('system.languages.translations', true)) { + $this->languagesLookup = $locator->findResources('languages://'); + $this->loadCompiledLanguages($this->languagesLookup, $this->pluginLookup, 'master'); + } + + $this->initializeLocator($locator); + } + + public function checksum() + { + if (empty($this->checksum)) { + $checkBlueprints = $this->get('system.cache.check.blueprints', false); + $checkLanguages = $this->get('system.cache.check.languages', false); + $checkConfig = $this->get('system.cache.check.config', true); + $checkSystem = $this->get('system.cache.check.system', true); + + if (!$checkBlueprints && !$checkLanguages && !$checkConfig && !$checkSystem) { + $this->messages[] = 'Skip configuration timestamp check.'; + return false; + } + + // Generate checksum according to the configuration settings. + if (!$checkConfig) { + // Just check changes in system.yaml files and ignore all the other files. + $cc = $checkSystem ? $this->finder->locateConfigFile($this->configLookup, 'system') : []; + } else { + // Check changes in all configuration files. + $cc = $this->finder->locateConfigFiles($this->configLookup, $this->pluginLookup); + } + + if ($checkBlueprints) { + $cb = $this->finder->locateBlueprintFiles($this->blueprintLookup, $this->pluginLookup); + } else { + $cb = []; + } + + if ($checkLanguages) { + $cl = $this->finder->locateLanguageFiles($this->languagesLookup, $this->pluginLookup); + } else { + $cl = []; + } + + $this->checksum = md5(json_encode([$cc, $cb, $cl])); + } + + return $this->checksum; + } + + protected function autoDetectEnvironmentConfig($items) + { + $environment = $this->environment; + $env_stream = 'user://'.$environment.'/config'; + + if (file_exists(USER_DIR.$environment.'/config')) { + array_unshift($items['streams']['schemes']['config']['prefixes'][''], $env_stream); + } + + return $items; + } + + protected function loadCompiledBlueprints($blueprints, $plugins, $filename = null) + { + $checksum = md5(json_encode($blueprints)); + $filename = $filename + ? CACHE_DIR . 'compiled/blueprints/' . $filename . '-' . $this->environment . '.php' + : CACHE_DIR . 'compiled/blueprints/' . $checksum . '-' . $this->environment . '.php'; + $file = PhpFile::instance($filename); + $cache = $file->exists() ? $file->content() : null; + $blueprintFiles = $this->finder->locateBlueprintFiles($blueprints, $plugins); + $checksum .= ':'.md5(json_encode($blueprintFiles)); + $class = get_class($this); + + // Load real file if cache isn't up to date (or is invalid). + if ( + !is_array($cache) + || !isset($cache['checksum']) + || !isset($cache['@class']) + || $cache['checksum'] != $checksum + || $cache['@class'] != $class + ) { + // Attempt to lock the file for writing. + $file->lock(false); + + // Load blueprints. + $this->blueprints = new Blueprints; + foreach ($blueprintFiles as $files) { + $this->loadBlueprintFiles($files); + } + + $cache = [ + '@class' => $class, + 'checksum' => $checksum, + 'files' => $blueprintFiles, + 'data' => $this->blueprints->toArray() + ]; + // If compiled file wasn't already locked by another process, save it. + if ($file->locked() !== false) { + $this->messages[] = 'Saving compiled blueprints.'; + $file->save($cache); + $file->unlock(); + } + } else { + $this->blueprints = new Blueprints($cache['data']); + } + } + + protected function loadCompiledConfig($configs, $plugins, $filename = null) + { + $filename = $filename + ? CACHE_DIR . 'compiled/config/' . $filename . '-' . $this->environment . '.php' + : CACHE_DIR . 'compiled/config/' . $checksum . '-' . $this->environment . '.php'; + $file = PhpFile::instance($filename); + $cache = $file->exists() ? $file->content() : null; + $class = get_class($this); + $checksum = $this->checksum(); + + if ( + !is_array($cache) + || !isset($cache['checksum']) + || !isset($cache['@class']) + || $cache['@class'] != $class + ) { + $this->messages[] = 'No cached configuration, compiling new configuration..'; + } else if ($cache['checksum'] !== $checksum) { + $this->messages[] = 'Configuration checksum mismatch, reloading configuration..'; + } else { + $this->messages[] = 'Configuration checksum matches, using cached version.'; + + $this->items = $cache['data']; + return; + } + + $configFiles = $this->finder->locateConfigFiles($configs, $plugins); + + // Attempt to lock the file for writing. + $file->lock(false); + + // Load configuration. + foreach ($configFiles as $files) { + $this->loadConfigFiles($files); + } + $cache = [ + '@class' => $class, + 'timestamp' => time(), + 'checksum' => $checksum, + 'data' => $this->toArray() + ]; + + // If compiled file wasn't already locked by another process, save it. + if ($file->locked() !== false) { + $this->messages[] = 'Saving compiled configuration.'; + $file->save($cache); + $file->unlock(); + } + + $this->items = $cache['data']; + } + + /** + * @param $languages + * @param $plugins + * @param null $filename + */ + protected function loadCompiledLanguages($languages, $plugins, $filename = null) + { + $checksum = md5(json_encode($languages)); + $filename = $filename + ? CACHE_DIR . 'compiled/languages/' . $filename . '-' . $this->environment . '.php' + : CACHE_DIR . 'compiled/languages/' . $checksum . '-' . $this->environment . '.php'; + $file = PhpFile::instance($filename); + $cache = $file->exists() ? $file->content() : null; + $languageFiles = $this->finder->locateLanguageFiles($languages, $plugins); + $checksum .= ':' . md5(json_encode($languageFiles)); + $class = get_class($this); + + // Load real file if cache isn't up to date (or is invalid). + if ( + !is_array($cache) + || !isset($cache['checksum']) + || !isset($cache['@class']) + || $cache['checksum'] != $checksum + || $cache['@class'] != $class + ) { + // Attempt to lock the file for writing. + $file->lock(false); + + // Load languages. + $this->languages = new Languages; + $pluginPaths = str_ireplace(GRAV_ROOT . '/', '', array_reverse($plugins)); + foreach ($pluginPaths as $path) { + if (isset($languageFiles[$path])) { + foreach ((array) $languageFiles[$path] as $plugin => $item) { + $lang_file = CompiledYamlFile::instance($item['file']); + $content = $lang_file->content(); + $this->languages->mergeRecursive($content); + } + unset($languageFiles[$path]); + } + } + + foreach ($languageFiles as $location) { + foreach ($location as $lang => $item) { + $lang_file = CompiledYamlFile::instance($item['file']); + $content = $lang_file->content(); + $this->languages->join($lang, $content, '/'); + } + } + + $cache = [ + '@class' => $class, + 'checksum' => $checksum, + 'files' => $languageFiles, + 'data' => $this->languages->toArray() + ]; + // If compiled file wasn't already locked by another process, save it. + if ($file->locked() !== false) { + $this->messages[] = 'Saving compiled languages.'; + $file->save($cache); + $file->unlock(); + } + } else { + $this->languages = new Languages($cache['data']); + } + } + + /** + * Load blueprints. + * + * @param array $files + */ + public function loadBlueprintFiles(array $files) + { + foreach ($files as $name => $item) { + $file = CompiledYamlFile::instance($item['file']); + $this->blueprints->embed($name, $file->content(), '/'); + } + } + + /** + * Load configuration. + * + * @param array $files + */ + public function loadConfigFiles(array $files) + { + foreach ($files as $name => $item) { + $file = CompiledYamlFile::instance($item['file']); + $this->join($name, $file->content(), '/'); + } + } + + /** + * Initialize resource locator by using the configuration. + * + * @param UniformResourceLocator $locator + */ + public function initializeLocator(UniformResourceLocator $locator) + { + $locator->reset(); + + $schemes = (array) $this->get('streams.schemes', []); + + foreach ($schemes as $scheme => $config) { + if (isset($config['paths'])) { + $locator->addPath($scheme, '', $config['paths']); + } + if (isset($config['prefixes'])) { + foreach ($config['prefixes'] as $prefix => $paths) { + $locator->addPath($scheme, $prefix, $paths); + } + } + } + } + + /** + * Get available streams and their types from the configuration. + * + * @return array + */ + public function getStreams() + { + $schemes = []; + foreach ((array) $this->get('streams.schemes') as $scheme => $config) { + $type = !empty($config['type']) ? $config['type'] : 'ReadOnlyStream'; + if ($type[0] != '\\') { + $type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type; + } + + $schemes[$scheme] = $type; + } + + return $schemes; + } + + public function getLanguages() + { + return $this->languages; + } +} diff --git a/system/src/Grav/Common/Config/ConfigFinder.php b/system/src/Grav/Common/Config/ConfigFinder.php new file mode 100644 index 0000000..4606941 --- /dev/null +++ b/system/src/Grav/Common/Config/ConfigFinder.php @@ -0,0 +1,186 @@ +detectInFolder($folder, 'blueprints'); + } + foreach (array_reverse($blueprints) as $folder) { + $list += $this->detectRecursive($folder); + } + return $list; + } + + /** + * Get all locations for configuration files (including plugins). + * + * @param array $configs + * @param array $plugins + * @return array + */ + public function locateConfigFiles(array $configs, array $plugins) + { + $list = []; + foreach (array_reverse($plugins) as $folder) { + $list += $this->detectInFolder($folder); + } + foreach (array_reverse($configs) as $folder) { + $list += $this->detectRecursive($folder); + } + return $list; + } + + public function locateLanguageFiles(array $languages, array $plugins) + { + $list = []; + foreach (array_reverse($plugins) as $folder) { + $list += $this->detectLanguagesInFolder($folder, 'languages'); + } + foreach (array_reverse($languages) as $folder) { + $list += $this->detectRecursive($folder); + } + return $list; + } + + /** + * Get all locations for a single configuration file. + * + * @param array $folders Locations to look up from. + * @param string $name Filename to be located. + * @return array + */ + public function locateConfigFile(array $folders, $name) + { + $filename = "{$name}.yaml"; + + $list = []; + foreach ($folders as $folder) { + $path = trim(Folder::getRelativePath($folder), '/'); + + if (is_file("{$folder}/{$filename}")) { + $modified = filemtime("{$folder}/{$filename}"); + } else { + $modified = 0; + } + $list[$path] = [$name => ['file' => "{$path}/{$filename}", 'modified' => $modified]]; + } + + return $list; + } + + /** + * Detects all plugins with a configuration file and returns them with last modification time. + * + * @param string $folder Location to look up from. + * @param string $lookup Filename to be located. + * @return array + * @internal + */ + protected function detectInFolder($folder, $lookup = null) + { + $path = trim(Folder::getRelativePath($folder), '/'); + + $list = []; + + if (is_dir($folder)) { + $iterator = new \FilesystemIterator($folder); + + /** @var \DirectoryIterator $directory */ + foreach ($iterator as $directory) { + if (!$directory->isDir()) { + continue; + } + + $name = $directory->getBasename(); + $find = ($lookup ?: $name) . '.yaml'; + $filename = "{$path}/{$name}/$find"; + + if (file_exists($filename)) { + $list["plugins/{$name}"] = ['file' => $filename, 'modified' => filemtime($filename)]; + } + } + } + + return [$path => $list]; + } + + protected function detectLanguagesInFolder($folder, $lookup = null) + { + $path = trim(Folder::getRelativePath($folder), '/'); + + $list = []; + + if (is_dir($folder)) { + $iterator = new \FilesystemIterator($folder); + + /** @var \DirectoryIterator $directory */ + foreach ($iterator as $directory) { + if (!$directory->isDir()) { + continue; + } + + $name = $directory->getBasename(); + $find = ($lookup ?: $name) . '.yaml'; + $filename = "{$path}/{$name}/$find"; + + if (file_exists($filename)) { + $list[$name] = ['file' => $filename, 'modified' => filemtime($filename)]; + } + } + } + + return [$path => $list]; + } + + /** + * Detects all plugins with a configuration file and returns them with last modification time. + * + * @param string $folder Location to look up from. + * @return array + * @internal + */ + protected function detectRecursive($folder) + { + $path = trim(Folder::getRelativePath($folder), '/'); + + if (is_dir($folder)) { + // Find all system and user configuration files. + $options = [ + 'compare' => 'Filename', + 'pattern' => '|\.yaml$|', + 'filters' => [ + 'key' => '|\.yaml$|', + 'value' => function (\RecursiveDirectoryIterator $file) use ($path) { + return ['file' => "{$path}/{$file->getSubPathname()}", 'modified' => $file->getMTime()]; + } + ], + 'key' => 'SubPathname' + ]; + + $list = Folder::all($folder, $options); + } else { + $list = []; + } + + return [$path => $list]; + } +} diff --git a/system/src/Grav/Common/Config/Languages.php b/system/src/Grav/Common/Config/Languages.php new file mode 100644 index 0000000..c014129 --- /dev/null +++ b/system/src/Grav/Common/Config/Languages.php @@ -0,0 +1,27 @@ +items['plugins'])) { + $this->items = array_merge_recursive($this->items, $this->items['plugins']); + unset($this->items['plugins']); + } + } + + public function mergeRecursive(array $data) + { + $this->items = array_merge_recursive($this->items, $data); + } +} diff --git a/system/src/Grav/Common/Data/Blueprint.php b/system/src/Grav/Common/Data/Blueprint.php new file mode 100644 index 0000000..15cdce6 --- /dev/null +++ b/system/src/Grav/Common/Data/Blueprint.php @@ -0,0 +1,456 @@ + 1]; + + /** + * @param string $name + * @param array $data + * @param Blueprints $context + */ + public function __construct($name, array $data = array(), Blueprints $context = null) + { + $this->name = $name; + $this->items = $data; + $this->context = $context; + } + + /** + * Set filter for inherited properties. + * + * @param array $filter List of field names to be inherited. + */ + public function setFilter(array $filter) + { + $this->filter = array_flip($filter); + } + + /** + * Return all form fields. + * + * @return array + */ + public function fields() + { + if (!isset($this->fields)) { + $this->fields = []; + $this->embed('', $this->items); + } + + return $this->fields; + } + + /** + * Validate data against blueprints. + * + * @param array $data + * @throws \RuntimeException + */ + public function validate(array $data) + { + // Initialize data + $this->fields(); + + try { + $this->validateArray($data, $this->nested); + } catch (\RuntimeException $e) { + throw new \RuntimeException(sprintf('Validation failed: %s', $e->getMessage())); + } + } + + /** + * Merge two arrays by using blueprints. + * + * @param array $data1 + * @param array $data2 + * @return array + */ + public function mergeData(array $data1, array $data2) + { + // Initialize data + $this->fields(); + return $this->mergeArrays($data1, $data2, $this->nested); + } + + /** + * Filter data by using blueprints. + * + * @param array $data + * @return array + */ + public function filter(array $data) + { + // Initialize data + $this->fields(); + return $this->filterArray($data, $this->nested); + } + + /** + * Return data fields that do not exist in blueprints. + * + * @param array $data + * @param string $prefix + * @return array + */ + public function extra(array $data, $prefix = '') + { + // Initialize data + $this->fields(); + $rules = $this->nested; + + // Drill down to prefix level + if (!empty($prefix)) { + $parts = explode('.', trim($prefix, '.')); + foreach ($parts as $part) { + $rules = isset($rules[$part]) ? $rules[$part] : []; + } + } + + return $this->extraArray($data, $rules, $prefix); + } + + /** + * Extend blueprint with another blueprint. + * + * @param Blueprint $extends + * @param bool $append + */ + public function extend(Blueprint $extends, $append = false) + { + $blueprints = $append ? $this->items : $extends->toArray(); + $appended = $append ? $extends->toArray() : $this->items; + + $bref_stack = array(&$blueprints); + $head_stack = array($appended); + + do { + end($bref_stack); + + $bref = &$bref_stack[key($bref_stack)]; + $head = array_pop($head_stack); + + unset($bref_stack[key($bref_stack)]); + + foreach (array_keys($head) as $key) { + if (isset($key, $bref[$key]) && is_array($bref[$key]) && is_array($head[$key])) { + $bref_stack[] = &$bref[$key]; + $head_stack[] = $head[$key]; + } else { + $bref = array_merge($bref, array($key => $head[$key])); + } + } + } while (count($head_stack)); + + $this->items = $blueprints; + } + + /** + * Convert object into an array. + * + * @return array + */ + public function getState() + { + return ['name' => $this->name, 'items' => $this->items, 'rules' => $this->rules, 'nested' => $this->nested]; + } + + /** + * Embed an array to the blueprint. + * + * @param $name + * @param array $value + * @param string $separator + */ + public function embed($name, array $value, $separator = '.') + { + + if (!isset($value['form']['fields']) || !is_array($value['form']['fields'])) { + return; + } + // Initialize data + $this->fields(); + $prefix = $name ? strtr($name, $separator, '.') . '.' : ''; + $params = array_intersect_key($this->filter, $value); + $this->parseFormFields($value['form']['fields'], $params, $prefix, $this->fields); + } + + /** + * @param array $data + * @param array $rules + * @throws \RuntimeException + * @internal + */ + protected function validateArray(array $data, array $rules) + { + $this->checkRequired($data, $rules); + + foreach ($data as $key => $field) { + $val = isset($rules[$key]) ? $rules[$key] : null; + $rule = is_string($val) ? $this->rules[$val] : null; + + if ($rule) { + // Item has been defined in blueprints. + Validation::validate($field, $rule); + } elseif (is_array($field) && is_array($val)) { + // Array has been defined in blueprints. + $this->validateArray($field, $val); + } elseif (isset($this->items['form']['validation']) && $this->items['form']['validation'] == 'strict') { + // Undefined/extra item. + throw new \RuntimeException(sprintf('%s is not defined in blueprints', $key)); + } + } + } + + /** + * @param array $data + * @param array $rules + * @return array + * @internal + */ + protected function filterArray(array $data, array $rules) + { + $results = array(); + foreach ($data as $key => $field) { + $val = isset($rules[$key]) ? $rules[$key] : null; + $rule = is_string($val) ? $this->rules[$val] : null; + + if ($rule) { + // Item has been defined in blueprints. + if (is_array($field) && count($field) == 1 && reset($field) == '') { + continue; + } + $field = Validation::filter($field, $rule); + } elseif (is_array($field) && is_array($val)) { + // Array has been defined in blueprints. + $field = $this->filterArray($field, $val); + } elseif (isset($this->items['form']['validation']) && $this->items['form']['validation'] == 'strict') { + $field = null; + } + + if (isset($field) && (!is_array($field) || !empty($field))) { + $results[$key] = $field; + } + } + + return $results; + } + + /** + * @param array $data1 + * @param array $data2 + * @param array $rules + * @return array + * @internal + */ + protected function mergeArrays(array $data1, array $data2, array $rules) + { + foreach ($data2 as $key => $field) { + $val = isset($rules[$key]) ? $rules[$key] : null; + $rule = is_string($val) ? $this->rules[$val] : null; + + if (!$rule && array_key_exists($key, $data1) && is_array($field) && is_array($val)) { + // Array has been defined in blueprints. + $data1[$key] = $this->mergeArrays($data1[$key], $field, $val); + } else { + // Otherwise just take value from the data2. + $data1[$key] = $field; + } + } + + return $data1; + } + + /** + * @param array $data + * @param array $rules + * @param string $prefix + * @return array + * @internal + */ + protected function extraArray(array $data, array $rules, $prefix) + { + $array = array(); + foreach ($data as $key => $field) { + $val = isset($rules[$key]) ? $rules[$key] : null; + $rule = is_string($val) ? $this->rules[$val] : null; + + if ($rule) { + // Item has been defined in blueprints. + } elseif (is_array($field) && is_array($val)) { + // Array has been defined in blueprints. + $array += $this->ExtraArray($field, $val, $prefix . $key . '.'); + } else { + // Undefined/extra item. + $array[$prefix.$key] = $field; + } + } + return $array; + } + + /** + * Gets all field definitions from the blueprints. + * + * @param array $fields + * @param array $params + * @param string $prefix + * @param array $current + * @internal + */ + protected function parseFormFields(array &$fields, $params, $prefix, array &$current) + { + // Go though all the fields in current level. + foreach ($fields as $key => &$field) { + $current[$key] = &$field; + // Set name from the array key. + $field['name'] = $prefix . $key; + $field += $params; + + if (isset($field['fields']) && (!isset($field['type']) || $field['type'] !== 'list')) { + // Recursively get all the nested fields. + $newParams = array_intersect_key($this->filter, $field); + $this->parseFormFields($field['fields'], $newParams, $prefix, $current[$key]['fields']); + } else if ($field['type'] !== 'ignore') { + // Add rule. + $this->rules[$prefix . $key] = &$field; + $this->addProperty($prefix . $key); + + foreach ($field as $name => $value) { + // Support nested blueprints. + if ($this->context && $name == '@import') { + $values = (array) $value; + if (!isset($field['fields'])) { + $field['fields'] = array(); + } + foreach ($values as $bname) { + $b = $this->context->get($bname); + $field['fields'] = array_merge($field['fields'], $b->fields()); + } + } + + // Support for callable data values. + elseif (substr($name, 0, 6) == '@data-') { + $property = substr($name, 6); + if (is_array($value)) { + $func = array_shift($value); + } else { + $func = $value; + $value = array(); + } + list($o, $f) = preg_split('/::/', $func); + if (!$f && function_exists($o)) { + $data = call_user_func_array($o, $value); + } elseif ($f && method_exists($o, $f)) { + $data = call_user_func_array(array($o, $f), $value); + } + + // If function returns a value, + if (isset($data)) { + if (isset($field[$property]) && is_array($field[$property]) && is_array($data)) { + // Combine field and @data-field together. + $field[$property] += $data; + } else { + // Or create/replace field with @data-field. + $field[$property] = $data; + } + } + } + + elseif (substr($name, 0, 8) == '@config-') { + $property = substr($name, 8); + $default = isset($field[$property]) ? $field[$property] : null; + $config = self::getGrav()['config']->get($value, $default); + + if (!is_null($config)) { + $field[$property] = $config; + } + } + } + + // Initialize predefined validation rule. + if (isset($field['validate']['rule']) && $field['type'] !== 'ignore') { + $field['validate'] += $this->getRule($field['validate']['rule']); + } + } + } + } + + /** + * Add property to the definition. + * + * @param string $path Comma separated path to the property. + * @internal + */ + protected function addProperty($path) + { + $parts = explode('.', $path); + $item = array_pop($parts); + + $nested = &$this->nested; + foreach ($parts as $part) { + if (!isset($nested[$part])) { + $nested[$part] = array(); + } + $nested = &$nested[$part]; + } + + if (!isset($nested[$item])) { + $nested[$item] = $path; + } + } + + /** + * @param $rule + * @return array + * @internal + */ + protected function getRule($rule) + { + if (isset($this->items['rules'][$rule]) && is_array($this->items['rules'][$rule])) { + return $this->items['rules'][$rule]; + } + return array(); + } + + /** + * @param array $data + * @param array $fields + * @throws \RuntimeException + * @internal + */ + protected function checkRequired(array $data, array $fields) + { + foreach ($fields as $name => $field) { + if (!is_string($field)) { + continue; + } + $field = $this->rules[$field]; + if (isset($field['validate']['required']) + && $field['validate']['required'] === true + && empty($data[$name])) { + throw new \RuntimeException("Missing required field: {$field['name']}"); + } + } + } +} diff --git a/system/src/Grav/Common/Data/Blueprints.php b/system/src/Grav/Common/Data/Blueprints.php new file mode 100644 index 0000000..4c144a3 --- /dev/null +++ b/system/src/Grav/Common/Data/Blueprints.php @@ -0,0 +1,145 @@ +search = $search; + } + + /** + * Get blueprint. + * + * @param string $type Blueprint type. + * @return Blueprint + * @throws \RuntimeException + */ + public function get($type) + { + if (!isset($this->instances[$type])) { + $parents = []; + if (is_string($this->search)) { + $filename = $this->search . $type . YAML_EXT; + + // Check if search is a stream and resolve the path. + if (strpos($filename, '://')) { + $grav = static::getGrav(); + /** @var UniformResourceLocator $locator */ + $locator = $grav['locator']; + $parents = $locator->findResources($filename); + $filename = array_shift($parents); + } + } else { + $filename = isset($this->search[$type]) ? $this->search[$type] : ''; + } + + if ($filename && is_file($filename)) { + $file = CompiledYamlFile::instance($filename); + $blueprints = $file->content(); + } else { + $blueprints = []; + } + + $blueprint = new Blueprint($type, $blueprints, $this); + + if (isset($blueprints['@extends'])) { + // Extend blueprint by other blueprints. + $extends = (array) $blueprints['@extends']; + + if (is_string(key($extends))) { + $extends = [ $extends ]; + } + + foreach ($extends as $extendConfig) { + $extendType = !is_string($extendConfig) ? empty($extendConfig['type']) ? false : $extendConfig['type'] : $extendConfig; + + if (!$extendType) { + continue; + } elseif ($extendType === '@parent') { + $parentFile = array_shift($parents); + if (!$parentFile || !is_file($parentFile)) { + continue; + } + $blueprints = CompiledYamlFile::instance($parentFile)->content(); + $parent = new Blueprint($type.'-parent', $blueprints, $this); + $blueprint->extend($parent); + continue; + } + + if (is_string($extendConfig) || empty($extendConfig['context'])) { + $context = $this; + } else { + // Load blueprints from external context. + $array = explode('://', $extendConfig['context'], 2); + $scheme = array_shift($array); + $path = array_shift($array); + if ($path) { + $scheme .= '://'; + $extendType = $path ? "{$path}/{$extendType}" : $extendType; + } + $context = new self($scheme); + } + $blueprint->extend($context->get($extendType)); + } + } + + $this->instances[$type] = $blueprint; + } + + return $this->instances[$type]; + } + + /** + * Get all available blueprint types. + * + * @return array List of type=>name + */ + public function types() + { + if ($this->types === null) { + $this->types = array(); + + // Check if search is a stream. + if (strpos($this->search, '://')) { + // Stream: use UniformResourceIterator. + $grav = static::getGrav(); + /** @var UniformResourceLocator $locator */ + $locator = $grav['locator']; + $iterator = $locator->getIterator($this->search, null); + } else { + // Not a stream: use DirectoryIterator. + $iterator = new \DirectoryIterator($this->search); + } + + /** @var \DirectoryIterator $file */ + foreach ($iterator as $file) { + if (!$file->isFile() || '.' . $file->getExtension() != YAML_EXT) { + continue; + } + $name = $file->getBasename(YAML_EXT); + $this->types[$name] = ucfirst(strtr($name, '_', ' ')); + } + } + return $this->types; + } +} diff --git a/system/src/Grav/Common/Data/Data.php b/system/src/Grav/Common/Data/Data.php new file mode 100644 index 0000000..6a35fbc --- /dev/null +++ b/system/src/Grav/Common/Data/Data.php @@ -0,0 +1,240 @@ +items = $items; + + $this->blueprints = $blueprints; + } + + /** + * Get value by using dot notation for nested arrays/objects. + * + * @example $value = $data->value('this.is.my.nested.variable'); + * + * @param string $name Dot separated path to the requested value. + * @param mixed $default Default value (or null). + * @param string $separator Separator, defaults to '.' + * @return mixed Value. + */ + public function value($name, $default = null, $separator = '.') + { + return $this->get($name, $default, $separator); + } + + /** + * Set default value by using dot notation for nested arrays/objects. + * + * @example $data->def('this.is.my.nested.variable', 'default'); + * + * @param string $name Dot separated path to the requested value. + * @param mixed $default Default value (or null). + * @param string $separator Separator, defaults to '.' + */ + public function def($name, $default = null, $separator = '.') + { + $this->set($name, $this->get($name, $default, $separator), $separator); + } + + /** + * Join two values together by using blueprints if available. + * + * @param string $name Dot separated path to the requested value. + * @param mixed $value Value to be joined. + * @param string $separator Separator, defaults to '.' + */ + public function join($name, $value, $separator = '.') + { + $old = $this->get($name, null, $separator); + if ($old === null) { + // Variable does not exist yet: just use the incoming value. + } elseif ($this->blueprints) { + // Blueprints: join values by using blueprints. + $value = $this->blueprints->mergeData($old, $value, $name, $separator); + } else { + // No blueprints: replace existing top level variables with the new ones. + $value = array_merge($old, $value); + } + + $this->set($name, $value, $separator); + } + + /** + * Join two values together by using blueprints if available. + * + * @param string $name Dot separated path to the requested value. + * @param mixed $value Value to be joined. + * @param string $separator Separator, defaults to '.' + */ + public function joinDefaults($name, $value, $separator = '.') + { + $old = $this->get($name, null, $separator); + if ($old === null) { + // Variable does not exist yet: just use the incoming value. + } elseif ($this->blueprints) { + // Blueprints: join values by using blueprints. + $value = $this->blueprints->mergeData($value, $old, $name, $separator); + } else { + // No blueprints: replace existing top level variables with the new ones. + $value = array_merge($value, $old); + } + + $this->set($name, $value, $separator); + } + + + /** + * Merge two sets of data together. + * + * @param array $data + * @return void + */ + public function merge(array $data) + { + if ($this->blueprints) { + $this->items = $this->blueprints->mergeData($this->items, $data); + } else { + $this->items = array_merge($this->items, $data); + } + } + + /** + * Add default data to the set. + * + * @param array $data + * @return void + */ + public function setDefaults(array $data) + { + if ($this->blueprints) { + $this->items = $this->blueprints->mergeData($data, $this->items); + } else { + $this->items = array_merge($data, $this->items); + } + } + + /** + * Return blueprints. + * + * @return Blueprint + */ + public function blueprints() + { + return $this->blueprints; + } + + /** + * Validate by blueprints. + * + * @throws \Exception + */ + public function validate() + { + if ($this->blueprints) { + $this->blueprints->validate($this->items); + } + } + + /** + * Filter all items by using blueprints. + */ + public function filter() + { + if ($this->blueprints) { + $this->items = $this->blueprints->filter($this->items); + } + } + + /** + * Get extra items which haven't been defined in blueprints. + * + * @return array + */ + public function extra() + { + return $this->blueprints ? $this->blueprints->extra($this->items) : array(); + } + + /** + * Save data if storage has been defined. + */ + public function save() + { + $file = $this->file(); + if ($file) { + $file->save($this->items); + } + } + + /** + * Returns whether the data already exists in the storage. + * + * NOTE: This method does not check if the data is current. + * + * @return bool + */ + public function exists() + { + return $this->file()->exists(); + } + + /** + * Return unmodified data as raw string. + * + * NOTE: This function only returns data which has been saved to the storage. + * + * @return string + */ + public function raw() + { + return $this->file()->raw(); + } + + /** + * Set or get the data storage. + * + * @param FileInterface $storage Optionally enter a new storage. + * @return FileInterface + */ + public function file(FileInterface $storage = null) + { + if ($storage) { + $this->storage = $storage; + } + return $this->storage; + } +} diff --git a/system/src/Grav/Common/Data/DataInterface.php b/system/src/Grav/Common/Data/DataInterface.php new file mode 100644 index 0000000..85d2fb6 --- /dev/null +++ b/system/src/Grav/Common/Data/DataInterface.php @@ -0,0 +1,68 @@ +value('this.is.my.nested.variable'); + * + * @param string $name Dot separated path to the requested value. + * @param mixed $default Default value (or null). + * @param string $separator Separator, defaults to '.' + * @return mixed Value. + */ + public function value($name, $default = null, $separator = '.'); + + /** + * Merge external data. + * + * @param array $data + * @return mixed + */ + public function merge(array $data); + + /** + * Return blueprints. + */ + public function blueprints(); + + /** + * Validate by blueprints. + * + * @throws \Exception + */ + public function validate(); + + /** + * Filter all items by using blueprints. + */ + public function filter(); + + /** + * Get extra items which haven't been defined in blueprints. + */ + public function extra(); + + /** + * Save data into the file. + */ + public function save(); + + /** + * Set or get the data storage. + * + * @param FileInterface $storage Optionally enter a new storage. + * @return FileInterface + */ + public function file(FileInterface $storage = null); +} diff --git a/system/src/Grav/Common/Data/DataMutatorTrait.php b/system/src/Grav/Common/Data/DataMutatorTrait.php new file mode 100644 index 0000000..707b507 --- /dev/null +++ b/system/src/Grav/Common/Data/DataMutatorTrait.php @@ -0,0 +1,68 @@ +get('this.is.my.nested.variable'); + * + * @param string $name Dot separated path to the requested value. + * @param mixed $default Default value (or null). + * @param string $separator Separator, defaults to '.' + * @return mixed Value. + */ + public function get($name, $default = null, $separator = '.') + { + $path = explode($separator, $name); + $current = $this->items; + foreach ($path as $field) { + if (is_object($current) && isset($current->{$field})) { + $current = $current->{$field}; + } elseif (is_array($current) && isset($current[$field])) { + $current = $current[$field]; + } else { + return $default; + } + } + + return $current; + } + + /** + * Set value by using dot notation for nested arrays/objects. + * + * @example $value = $data->set('this.is.my.nested.variable', true); + * + * @param string $name Dot separated path to the requested value. + * @param mixed $value New value. + * @param string $separator Separator, defaults to '.' + */ + public function set($name, $value, $separator = '.') + { + $path = explode($separator, $name); + $current = &$this->items; + foreach ($path as $field) { + if (is_object($current)) { + // Handle objects. + if (!isset($current->{$field})) { + $current->{$field} = array(); + } + $current = &$current->{$field}; + } else { + // Handle arrays and scalars. + if (!is_array($current)) { + $current = array($field => array()); + } elseif (!isset($current[$field])) { + $current[$field] = array(); + } + $current = &$current[$field]; + } + } + + $current = $value; + } + +} diff --git a/system/src/Grav/Common/Data/Validation.php b/system/src/Grav/Common/Data/Validation.php new file mode 100644 index 0000000..3382a72 --- /dev/null +++ b/system/src/Grav/Common/Data/Validation.php @@ -0,0 +1,672 @@ +translate($name) . '""'; + + if (method_exists(__CLASS__, $method)) { + $success = self::$method($value, $validate, $field); + } else { + $success = self::typeText($value, $validate, $field); + } + if (!$success) { + throw new \RuntimeException($message); + } + + // Check individual rules + foreach ($validate as $rule => $params) { + $method = 'validate'.strtr($rule, '-', '_'); + if (method_exists(__CLASS__, $method)) { + $success = self::$method($value, $params); + + if (!$success) { + throw new \RuntimeException($message); + } + } + } + } + + /** + * Filter value against a blueprint field definition. + * + * @param mixed $value + * @param array $field + * @return mixed Filtered value. + */ + public static function filter($value, array $field) + { + $validate = isset($field['validate']) ? (array) $field['validate'] : array(); + + // If value isn't required, we will return null if empty value is given. + if (empty($validate['required']) && ($value === null || $value === '')) { + return null; + } + + // if this is a YAML field, simply parse it and return the value + if (isset($field['yaml']) && $field['yaml'] === true) { + try { + $yaml = new Parser(); + return $yaml->parse($value); + } catch (ParseException $e) { + throw new \RuntimeException($e->getMessage()); + } + } + + // Validate type with fallback type text. + $type = (string) isset($field['validate']['type']) ? $field['validate']['type'] : $field['type']; + $method = 'filter'.strtr($type, '-', '_'); + if (method_exists(__CLASS__, $method)) { + $value = self::$method($value, $validate, $field); + } else { + $value = self::filterText($value, $validate, $field); + } + + return $value; + } + + /** + * HTML5 input: text + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeText($value, array $params, array $field) + { + if (!is_string($value)) { + return false; + } + + if (isset($params['min']) && strlen($value) < $params['min']) { + return false; + } + + if (isset($params['max']) && strlen($value) > $params['max']) { + return false; + } + + $min = isset($params['min']) ? $params['min'] : 0; + if (isset($params['step']) && (strlen($value) - $min) % $params['step'] == 0) { + return false; + } + + if ((!isset($params['multiline']) || !$params['multiline']) && preg_match('/\R/um', $value)) { + return false; + } + + return true; + } + + protected static function filterText($value, array $params, array $field) + { + return (string) $value; + } + + protected static function filterCommaList($value, array $params, array $field) + { + return is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY); + } + + protected static function typeCommaList($value, array $params, array $field) + { + return is_array($value) ? true : self::typeText($value, $params, $field); + } + + /** + * HTML5 input: textarea + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeTextarea($value, array $params, array $field) + { + if (!isset($params['multiline'])) { + $params['multiline'] = true; + } + + return self::typeText($value, $params, $field); + } + + /** + * HTML5 input: password + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typePassword($value, array $params, array $field) + { + return self::typeText($value, $params, $field); + } + + /** + * HTML5 input: hidden + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeHidden($value, array $params, array $field) + { + return self::typeText($value, $params, $field); + } + + /** + * Custom input: checkbox list + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeCheckboxes($value, array $params, array $field) + { + return self::typeArray((array) $value, $params, $field); + } + + protected static function filterCheckboxes($value, array $params, array $field) + { + return self::filterArray($value, $params, $field); + } + + /** + * HTML5 input: checkbox + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeCheckbox($value, array $params, array $field) + { + $value = (string) $value; + + if (!isset($field['value'])) { + $field['value'] = 1; + } + if ($value && $value != $field['value']) { + return false; + } + + return true; + } + + /** + * HTML5 input: radio + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeRadio($value, array $params, array $field) + { + return self::typeArray((array) $value, $params, $field); + } + + /** + * Custom input: toggle + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeToggle($value, array $params, array $field) + { + return self::typeArray((array) $value, $params, $field); + } + + /** + * HTML5 input: select + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeSelect($value, array $params, array $field) + { + return self::typeArray((array) $value, $params, $field); + } + + /** + * HTML5 input: number + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + + public static function typeNumber($value, array $params, array $field) + { + if (!is_numeric($value)) { + return false; + } + + if (isset($params['min']) && $value < $params['min']) { + return false; + } + + if (isset($params['max']) && $value > $params['max']) { + return false; + } + + $min = isset($params['min']) ? $params['min'] : 0; + if (isset($params['step']) && fmod($value - $min, $params['step']) == 0) { + return false; + } + + return true; + } + + protected static function filterNumber($value, array $params, array $field) + { + return (int) $value; + } + + protected static function filterDateTime($value, array $params, array $field) + { + $format = self::getGrav()['config']->get('system.pages.dateformat.default'); + if ($format) { + $converted = new \DateTime($value); + return $converted->format($format); + } + return $value; + } + + + /** + * HTML5 input: range + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeRange($value, array $params, array $field) + { + return self::typeNumber($value, $params, $field); + } + + protected static function filterRange($value, array $params, array $field) + { + return self::filterNumber($value, $params, $field); + } + + /** + * HTML5 input: color + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeColor($value, array $params, array $field) + { + return preg_match('/^\#[0-9a-fA-F]{3}[0-9a-fA-F]{3}?$/u', $value); + } + + /** + * HTML5 input: email + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeEmail($value, array $params, array $field) + { + return self::typeText($value, $params, $field) && filter_var($value, FILTER_VALIDATE_EMAIL); + } + + /** + * HTML5 input: url + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + + public static function typeUrl($value, array $params, array $field) + { + return self::typeText($value, $params, $field) && filter_var($value, FILTER_VALIDATE_URL); + } + + /** + * HTML5 input: datetime + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeDatetime($value, array $params, array $field) + { + if ($value instanceof \DateTime) { + return true; + } elseif (!is_string($value)) { + return false; + } elseif (!isset($params['format'])) { + return false !== strtotime($value); + } + + $dateFromFormat = \DateTime::createFromFormat($params['format'], $value); + + return $dateFromFormat && $value === date($params['format'], $dateFromFormat->getTimestamp()); + } + + /** + * HTML5 input: datetime-local + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeDatetimeLocal($value, array $params, array $field) + { + return self::typeDatetime($value, $params, $field); + } + + /** + * HTML5 input: date + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeDate($value, array $params, array $field) + { + $params = array($params); + if (!isset($params['format'])) { + $params['format'] = 'Y-m-d'; + } + return self::typeDatetime($value, $params, $field); + } + + /** + * HTML5 input: time + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeTime($value, array $params, array $field) + { + $params = array($params); + if (!isset($params['format'])) { + $params['format'] = 'H:i'; + } + return self::typeDatetime($value, $params, $field); + } + + /** + * HTML5 input: month + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeMonth($value, array $params, array $field) + { + $params = array($params); + if (!isset($params['format'])) { + $params['format'] = 'Y-m'; + } + return self::typeDatetime($value, $params, $field); + } + + /** + * HTML5 input: week + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeWeek($value, array $params, array $field) + { + if (!isset($params['format']) && !preg_match('/^\d{4}-W\d{2}$/u', $value)) { + return false; + } + return self::typeDatetime($value, $params, $field); + } + + /** + * Custom input: array + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeArray($value, array $params, array $field) + { + if (!is_array($value)) { + return false; + } + + if (isset($field['multiple'])) { + if (isset($params['min']) && count($value) < $params['min']) { + return false; + } + + if (isset($params['max']) && count($value) > $params['max']) { + return false; + } + + $min = isset($params['min']) ? $params['min'] : 0; + if (isset($params['step']) && (count($value) - $min) % $params['step'] == 0) { + return false; + } + } + + $options = isset($field['options']) ? array_keys($field['options']) : array(); + $values = isset($field['use']) && $field['use'] == 'keys' ? array_keys($value) : $value; + if ($options && array_diff($values, $options)) { + return false; + } + + return true; + } + + protected static function filterArray($value, $params, $field) + { + $values = (array) $value; + $options = isset($field['options']) ? array_keys($field['options']) : array(); + $multi = isset($field['multiple']) ? $field['multiple'] : false; + + if ($options) { + $useKey = isset($field['use']) && $field['use'] == 'keys'; + foreach ($values as $key => $value) { + $values[$key] = $useKey ? (bool) $value : $value; + } + } + + if ($multi) { + foreach ($values as $key => $value) { + if (is_array($value)) { + $value = implode(',', $value); + } + + $values[$key] = array_map('trim', explode(',', $value)); + } + } + + return $values; + } + + public static function typeList($value, array $params, array $field) + { + if (!is_array($value)) { + return false; + } + + if (isset($field['fields'])) { + foreach ($value as $key => $item) { + foreach ($field['fields'] as $subKey => $subField) { + $subKey = trim($subKey, '.'); + $subValue = isset($item[$subKey]) ? $item[$subKey] : null; + self::validate($subValue, $subField); + } + } + } + + return true; + } + + protected static function filterList($value, array $params, array $field) + { + return (array) $value; + } + + /** + * Custom input: ignore (will not validate) + * + * @param mixed $value Value to be validated. + * @param array $params Validation parameters. + * @param array $field Blueprint for the field. + * @return bool True if validation succeeded. + */ + public static function typeIgnore($value, array $params, array $field) + { + return true; + } + + public static function filterIgnore($value, array $params, array $field) + { + return $value; + } + + // HTML5 attributes (min, max and range are handled inside the types) + + public static function validateRequired($value, $params) + { + if (is_string($value)) { + $value = trim($value); + } + + return (bool) $params !== true || !empty($value); + } + + public static function validatePattern($value, $params) + { + return (bool) preg_match("`^{$params}$`u", $value); + } + + + // Internal types + + public static function validateAlpha($value, $params) + { + return ctype_alpha($value); + } + + public static function validateAlnum($value, $params) + { + return ctype_alnum($value); + } + + public static function typeBool($value, $params) + { + return is_bool($value) || $value == 1 || $value == 0; + } + + public static function validateBool($value, $params) + { + return is_bool($value) || $value == 1 || $value == 0; + } + + protected static function filterBool($value, $params) + { + return (bool) $value; + } + + public static function validateDigit($value, $params) + { + return ctype_digit($value); + } + + public static function validateFloat($value, $params) + { + return is_float(filter_var($value, FILTER_VALIDATE_FLOAT)); + } + + protected static function filterFloat($value, $params) + { + return (float) $value; + } + + public static function validateHex($value, $params) + { + return ctype_xdigit($value); + } + + public static function validateInt($value, $params) + { + return is_numeric($value) && (int) $value == $value; + } + + protected static function filterInt($value, $params) + { + return (int) $value; + } + + public static function validateArray($value, $params) + { + return is_array($value) || ($value instanceof \ArrayAccess + && $value instanceof \Traversable + && $value instanceof \Countable); + } + + public static function validateJson($value, $params) + { + return (bool) (json_decode($value)); + } +} diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php new file mode 100644 index 0000000..a996a7d --- /dev/null +++ b/system/src/Grav/Common/Debugger.php @@ -0,0 +1,121 @@ +debugbar = new StandardDebugBar(); + $this->debugbar['time']->addMeasure('Loading', $this->debugbar['time']->getRequestStartTime(), microtime(true)); + } + + public function init() + { + $this->grav = Grav::instance(); + + if ($this->enabled()) { + $this->debugbar->addCollector(new \DebugBar\DataCollector\ConfigCollector((array)$this->grav['config']->get('system'))); + } + return $this; + } + + public function enabled($state = null) + { + if (isset($state)) { + $this->enabled = $state; + } else { + if (!isset($this->enabled)) { + $this->enabled = $this->grav['config']->get('system.debugger.enabled'); + } + } + return $this->enabled; + } + + public function addAssets() + { + if ($this->enabled()) { + $assets = $this->grav['assets']; + + // Add jquery library + $assets->add('jquery', 101); + + $this->renderer = $this->debugbar->getJavascriptRenderer(); + $this->renderer->setIncludeVendors(false); + + // Get the required CSS files + list($css_files, $js_files) = $this->renderer->getAssets(null, JavascriptRenderer::RELATIVE_URL); + foreach ($css_files as $css) { + $assets->addCss($css); + } + + $assets->addCss('/system/assets/debugger.css'); + + foreach ($js_files as $js) { + $assets->addJs($js); + } + } + return $this; + } + + public function addCollector($collector) + { + $this->debugbar->addCollector($collector); + return $this; + } + + public function getCollector($collector) + { + return $this->debugbar->getCollector($collector); + } + + public function render() + { + if ($this->enabled()) { + echo $this->renderer->render(); + } + return $this; + } + + public function sendDataInHeaders() + { + $this->debugbar->sendDataInHeaders(); + return $this; + } + + public function startTimer($name, $description = null) + { + if ($name[0] == '_' || $this->grav['config']->get('system.debugger.enabled')) { + $this->debugbar['time']->startMeasure($name, $description); + } + return $this; + } + + public function stopTimer($name) + { + if ($name[0] == '_' || $this->grav['config']->get('system.debugger.enabled')) { + $this->debugbar['time']->stopMeasure($name); + } + return $this; + } + + + public function addMessage($message, $label = 'info', $isString = true) + { + if ($this->enabled()) { + $this->debugbar['messages']->addMessage($message, $label, $isString); + } + return $this; + } +} diff --git a/system/src/Grav/Common/Errors/Errors.php b/system/src/Grav/Common/Errors/Errors.php new file mode 100644 index 0000000..e135e6f --- /dev/null +++ b/system/src/Grav/Common/Errors/Errors.php @@ -0,0 +1,52 @@ +handlerStack[$key] = $handler; + } else { + $this->handlerStack[] = $handler; + } + + return $this; + } + + public function resetHandlers() + { + $grav = Grav::instance(); + $config = $grav['config']->get('system.errors'); + if (isset($config['display']) && !$config['display']) { + unset($this->handlerStack['pretty']); + $this->handlerStack = array('simple' => new SimplePageHandler()) + $this->handlerStack; + } + if (isset($config['log']) && !$config['log']) { + unset($this->handlerStack['log']); + } + } + +} diff --git a/system/src/Grav/Common/Errors/Resources/error.css b/system/src/Grav/Common/Errors/Resources/error.css new file mode 100644 index 0000000..11ce3fd --- /dev/null +++ b/system/src/Grav/Common/Errors/Resources/error.css @@ -0,0 +1,52 @@ +html, body { + height: 100% +} +body { + margin:0 3rem; + padding:0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 1.5rem; + line-height: 1.4; + display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ + display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */ + display: -ms-flexbox; /* TWEENER - IE 10 */ + display: -webkit-flex; /* NEW - Chrome */ + display: flex; + -webkit-align-items: center; + align-items: center; + -webkit-justify-content: center; + justify-content: center; +} +.container { + margin: 0rem; + max-width: 600px; + padding-bottom:5rem; +} + +header { + color: #000; + font-size: 4rem; + letter-spacing: 2px; + line-height: 1.1; + margin-bottom: 2rem; +} +p { + font-family: Optima, Segoe, "Segoe UI", Candara, Calibri, Arial, sans-serif; + color: #666; +} + +h5 { + font-weight: normal; + color: #999; + font-size: 1rem; +} + +h6 { + font-weight: normal; + color: #999; +} + +code { + font-weight: bold; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} diff --git a/system/src/Grav/Common/Errors/Resources/layout.html.php b/system/src/Grav/Common/Errors/Resources/layout.html.php new file mode 100644 index 0000000..6699959 --- /dev/null +++ b/system/src/Grav/Common/Errors/Resources/layout.html.php @@ -0,0 +1,30 @@ + + + + + + Whoops there was an error! + + + +
+
+
+ Server Error +
+ + + +

Sorry, something went terribly wrong!

+ +

-

+ +
For further details please review your logs/ folder, or enable displaying of errors in your system configuration.
+
+
+ + diff --git a/system/src/Grav/Common/Errors/SimplePageHandler.php b/system/src/Grav/Common/Errors/SimplePageHandler.php new file mode 100644 index 0000000..16d0a88 --- /dev/null +++ b/system/src/Grav/Common/Errors/SimplePageHandler.php @@ -0,0 +1,96 @@ +searchPaths[] = __DIR__ . "/Resources"; + } + + /** + * @return int|null + */ + public function handle() + { + $inspector = $this->getInspector(); + + $helper = new TemplateHelper(); + $templateFile = $this->getResource("layout.html.php"); + $cssFile = $this->getResource("error.css"); + + $code = $inspector->getException()->getCode(); + $message = $inspector->getException()->getMessage(); + + if ($inspector->getException() instanceof \ErrorException) { + $code = Misc::translateErrorCode($code); + } + + $vars = array( + "stylesheet" => file_get_contents($cssFile), + "code" => $code, + "message" => $message, + ); + + $helper->setVariables($vars); + $helper->render($templateFile); + + return Handler::QUIT; + } + + /** + * @param $resource + * + * @return string + */ + protected function getResource($resource) + { + // If the resource was found before, we can speed things up + // by caching its absolute, resolved path: + if (isset($this->resourceCache[$resource])) { + return $this->resourceCache[$resource]; + } + + // Search through available search paths, until we find the + // resource we're after: + foreach ($this->searchPaths as $path) { + $fullPath = $path . "/$resource"; + + if (is_file($fullPath)) { + // Cache the result: + $this->resourceCache[$resource] = $fullPath; + return $fullPath; + } + } + + // If we got this far, nothing was found. + throw new \RuntimeException( + "Could not find resource '$resource' in any resource paths." + . "(searched: " . join(", ", $this->searchPaths). ")" + ); + } + + public function addResourcePath($path) + { + if (!is_dir($path)) { + throw new \InvalidArgumentException( + "'$path' is not a valid directory" + ); + } + + array_unshift($this->searchPaths, $path); + } + + public function getResourcePaths() + { + return $this->searchPaths; + } +} diff --git a/system/src/Grav/Common/File/CompiledFile.php b/system/src/Grav/Common/File/CompiledFile.php new file mode 100644 index 0000000..7120c9c --- /dev/null +++ b/system/src/Grav/Common/File/CompiledFile.php @@ -0,0 +1,73 @@ +settings(['native' => true, 'compat' => true]); + + // If nothing has been loaded, attempt to get pre-compiled version of the file first. + if ($var === null && $this->raw === null && $this->content === null) { + $key = md5($this->filename); + $file = PhpFile::instance(CACHE_DIR . "compiled/files/{$key}{$this->extension}.php"); + $modified = $this->modified(); + + if (!$modified) { + return $this->decode($this->raw()); + } + + $class = get_class($this); + + $cache = $file->exists() ? $file->content() : null; + + // Load real file if cache isn't up to date (or is invalid). + if ( + !isset($cache['@class']) + || $cache['@class'] != $class + || $cache['modified'] != $modified + || $cache['filename'] != $this->filename + ) { + // Attempt to lock the file for writing. + $file->lock(false); + + // Decode RAW file into compiled array. + $data = (array) $this->decode($this->raw()); + $cache = [ + '@class' => $class, + 'filename' => $this->filename, + 'modified' => $modified, + 'data' => $data + ]; + + // If compiled file wasn't already locked by another process, save it. + if ($file->locked() !== false) { + $file->save($cache); + $file->unlock(); + } + } + + $this->content = $cache['data']; + } + + return parent::content($var); + } +} diff --git a/system/src/Grav/Common/File/CompiledMarkdownFile.php b/system/src/Grav/Common/File/CompiledMarkdownFile.php new file mode 100644 index 0000000..669a4eb --- /dev/null +++ b/system/src/Grav/Common/File/CompiledMarkdownFile.php @@ -0,0 +1,9 @@ +getMTime(); + if ($dir_modified > $last_modified) { + $last_modified = $dir_modified; + } + } + + return $last_modified; + } + + /** + * Recursively find the last modified time under given path by file. + * + * @param string $path + * @param string $extensions which files to search for specifically + * + * @return int + */ + public static function lastModifiedFile($path, $extensions = 'md|yaml') + { + $last_modified = 0; + + $dirItr = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS); + $itrItr = new \RecursiveIteratorIterator($dirItr, \RecursiveIteratorIterator::SELF_FIRST); + $itr = new \RegexIterator($itrItr, '/^.+\.'.$extensions.'$/i'); + + /** @var \RecursiveDirectoryIterator $file */ + foreach ($itr as $filepath => $file) { + $file_modified = $file->getMTime(); + if ($file_modified > $last_modified) { + $last_modified = $file_modified; + } + } + + return $last_modified; + } + + /** + * Get relative path between target and base path. If path isn't relative, return full path. + * + * @param string $path + * @param string $base + * @return string + */ + public static function getRelativePath($path, $base = GRAV_ROOT) + { + if ($base) { + $base = preg_replace('![\\\/]+!', '/', $base); + $path = preg_replace('![\\\/]+!', '/', $path); + if (strpos($path, $base) === 0) { + $path = ltrim(substr($path, strlen($base)), '/'); + } + } + + return $path; + } + + /** + * Shift first directory out of the path. + * + * @param string $path + * @return string + */ + public static function shift(&$path) + { + $parts = explode('/', trim($path, '/'), 2); + $result = array_shift($parts); + $path = array_shift($parts); + + return $result ?: null; + } + + + + /** + * Return recursive list of all files and directories under given path. + * + * @param string $path + * @param array $params + * @return array + * @throws \RuntimeException + */ + public static function all($path, array $params = array()) + { + if ($path === false) { + throw new \RuntimeException("Path to {$path} doesn't exist."); + } + + $compare = isset($params['compare']) ? 'get' . $params['compare'] : null; + $pattern = isset($params['pattern']) ? $params['pattern'] : null; + $filters = isset($params['filters']) ? $params['filters'] : null; + $recursive = isset($params['recursive']) ? $params['recursive'] : true; + $key = isset($params['key']) ? 'get' . $params['key'] : null; + $value = isset($params['value']) ? 'get' . $params['value'] : ($recursive ? 'getSubPathname' : 'getFilename'); + + if ($recursive) { + $directory = new \RecursiveDirectoryIterator($path, + \RecursiveDirectoryIterator::SKIP_DOTS + \FilesystemIterator::UNIX_PATHS + \FilesystemIterator::CURRENT_AS_SELF); + $iterator = new \RecursiveIteratorIterator($directory, \RecursiveIteratorIterator::SELF_FIRST); + } else { + $iterator = new \FilesystemIterator($path); + } + + $results = array(); + + /** @var \RecursiveDirectoryIterator $file */ + foreach ($iterator as $file) { + if ($compare && $pattern && !preg_match($pattern, $file->{$compare}())) { + continue; + } + $fileKey = $key ? $file->{$key}() : null; + $filePath = $file->{$value}(); + if ($filters) { + if (isset($filters['key'])) { + $fileKey = preg_replace($filters['key'], '', $fileKey); + } + if (isset($filters['value'])) { + $filter = $filters['value']; + if (is_callable($filter)) { + $filePath = call_user_func($filter, $file); + } else { + $filePath = preg_replace($filter, '', $filePath); + } + } + } + + if ($fileKey !== null) { + $results[$fileKey] = $filePath; + } else { + $results[] = $filePath; + } + } + + return $results; + } + + /** + * Recursively copy directory in filesystem. + * + * @param string $source + * @param string $target + * @throws \RuntimeException + */ + public static function copy($source, $target) + { + $source = rtrim($source, '\\/'); + $target = rtrim($target, '\\/'); + + if (!is_dir($source)) { + throw new \RuntimeException('Cannot copy non-existing folder.'); + } + + // Make sure that path to the target exists before copying. + self::mkdir($target); + + $success = true; + + // Go through all sub-directories and copy everything. + $files = self::all($source); + foreach ($files as $file) { + $src = $source .'/'. $file; + $dst = $target .'/'. $file; + + if (is_dir($src)) { + // Create current directory. + $success &= @mkdir($dst); + } else { + // Or copy current file. + $success &= @copy($src, $dst); + } + } + + if (!$success) { + $error = error_get_last(); + throw new \RuntimeException($error['message']); + } + + // Make sure that the change will be detected when caching. + @touch(dirname($target)); + } + + /** + * Move directory in filesystem. + * + * @param string $source + * @param string $target + * @throws \RuntimeException + */ + public static function move($source, $target) + { + if (!is_dir($source)) { + throw new \RuntimeException('Cannot move non-existing folder.'); + } + + // Make sure that path to the target exists before moving. + self::mkdir(dirname($target)); + + // Just rename the directory. + $success = @rename($source, $target); + + if (!$success) { + $error = error_get_last(); + throw new \RuntimeException($error['message']); + } + + // Make sure that the change will be detected when caching. + @touch(dirname($source)); + @touch(dirname($target)); + } + + /** + * Recursively delete directory from filesystem. + * + * @param string $target + * @throws \RuntimeException + * @return bool + */ + public static function delete($target) + { + if (!is_dir($target)) { + return; + } + + $success = self::doDelete($target); + + if (!$success) { + $error = error_get_last(); + throw new \RuntimeException($error['message']); + } + + // Make sure that the change will be detected when caching. + @touch(dirname($target)); + return $success; + } + + /** + * @param string $folder + * @throws \RuntimeException + * @internal + */ + public static function mkdir($folder) + { + if (is_dir($folder)) { + return; + } + + $success = @mkdir($folder, 0777, true); + + if (!$success) { + $error = error_get_last(); + throw new \RuntimeException($error['message']); + } + } + + /** + * Recursive copy of one directory to another + * + * @param $src + * @param $dest + * + * @return bool + */ + public static function rcopy($src, $dest) + { + + // If the src is not a directory do a simple file copy + if (!is_dir($src)) { + copy($src, $dest); + return true; + } + + // If the destination directory does not exist create it + if (!is_dir($dest)) { + if (!mkdir($dest)) { + // If the destination directory could not be created stop processing + return false; + } + } + + // Open the source directory to read in files + $i = new \DirectoryIterator($src); + /** @var \DirectoryIterator $f */ + foreach ($i as $f) { + if ($f->isFile()) { + copy($f->getRealPath(), "$dest/" . $f->getFilename()); + } else { + if (!$f->isDot() && $f->isDir()) { + static::rcopy($f->getRealPath(), "$dest/$f"); + } + } + } + return true; + } + + /** + * @param string $folder + * @return bool + * @internal + */ + protected static function doDelete($folder) + { + // Special case for symbolic links. + if (is_link($folder)) { + return @unlink($folder); + } + + $files = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($folder, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + /** @var \DirectoryIterator $fileinfo */ + foreach ($files as $fileinfo) { + if ($fileinfo->isDir()) { + if (false === rmdir($fileinfo->getRealPath())) { + return false; + } + } else { + if (false === unlink($fileinfo->getRealPath())) { + return false; + } + } + } + + return rmdir($folder); + } +} diff --git a/system/src/Grav/Common/Filesystem/RecursiveFolderFilterIterator.php b/system/src/Grav/Common/Filesystem/RecursiveFolderFilterIterator.php new file mode 100644 index 0000000..aa9fd4a --- /dev/null +++ b/system/src/Grav/Common/Filesystem/RecursiveFolderFilterIterator.php @@ -0,0 +1,31 @@ +get('system.pages.ignore_folders'); + } + } + + public function accept() + { + + /** @var $current \SplFileInfo */ + $current = $this->current(); + + if ($current->isDir() && !in_array($current->getFilename(), $this::$folder_ignores)) { + return true; + } + return false; + } +} diff --git a/system/src/Grav/Common/GPM/AbstractCollection.php b/system/src/Grav/Common/GPM/AbstractCollection.php new file mode 100644 index 0000000..7c1974d --- /dev/null +++ b/system/src/Grav/Common/GPM/AbstractCollection.php @@ -0,0 +1,32 @@ +items as $name => $package) { + $items[$name] = $package->toArray(); + } + + return json_encode($items); + } + + public function toArray() + { + $items = []; + + foreach ($this->items as $name => $package) { + $items[$name] = $package->toArray(); + } + + return $items; + } +} diff --git a/system/src/Grav/Common/GPM/Common/AbstractPackageCollection.php b/system/src/Grav/Common/GPM/Common/AbstractPackageCollection.php new file mode 100644 index 0000000..46c9e89 --- /dev/null +++ b/system/src/Grav/Common/GPM/Common/AbstractPackageCollection.php @@ -0,0 +1,34 @@ +items as $name => $package) { + $items[$name] = $package->toArray(); + } + + return json_encode($items); + } + + public function toArray() + { + $items = []; + + foreach ($this->items as $name => $package) { + $items[$name] = $package->toArray(); + } + + return $items; + } +} diff --git a/system/src/Grav/Common/GPM/Common/CachedCollection.php b/system/src/Grav/Common/GPM/Common/CachedCollection.php new file mode 100644 index 0000000..fd6ae94 --- /dev/null +++ b/system/src/Grav/Common/GPM/Common/CachedCollection.php @@ -0,0 +1,21 @@ + $item) { + $this->append([$name => $item]); + } + } +} diff --git a/system/src/Grav/Common/GPM/Common/Package.php b/system/src/Grav/Common/GPM/Common/Package.php new file mode 100644 index 0000000..ff9a087 --- /dev/null +++ b/system/src/Grav/Common/GPM/Common/Package.php @@ -0,0 +1,42 @@ +data = $package; + + if ($type) { + $this->data->set('package_type', $type); + } + } + + public function getData() { + return $this->data; + } + + public function __get($key) { + return $this->data->get($key); + } + + public function __isset($key) { + return isset($this->data->$key); + } + + public function __toString() { + return $this->toJson(); + } + + public function toJson() { + return $this->data->toJson(); + } + + public function toArray() { + return $this->data->toArray(); + } + +} diff --git a/system/src/Grav/Common/GPM/GPM.php b/system/src/Grav/Common/GPM/GPM.php new file mode 100644 index 0000000..fa1c808 --- /dev/null +++ b/system/src/Grav/Common/GPM/GPM.php @@ -0,0 +1,398 @@ + 'user/plugins/%name%', 'themes' => 'user/themes/%name%', 'skeletons' => 'user/']; + + /** + * Creates a new GPM instance with Local and Remote packages available + * @param boolean $refresh Applies to Remote Packages only and forces a refetch of data + * @param callable $callback Either a function or callback in array notation + */ + public function __construct($refresh = false, $callback = null) + { + $this->installed = new Local\Packages(); + try { + $this->repository = new Remote\Packages($refresh, $callback); + $this->grav = new Remote\Grav($refresh, $callback); + } catch (\Exception $e) { + } + } + + /** + * Returns the Locally installed packages + * @return Iterator The installed packages + */ + public function getInstalled() + { + return $this->installed; + } + + /** + * Returns the amount of locally installed packages + * @return integer Amount of installed packages + */ + public function countInstalled() + { + $installed = $this->getInstalled(); + + return count($installed['plugins']) + count($installed['themes']); + } + + /** + * Return the instance of a specific Plugin + * @param string $slug The slug of the Plugin + * @return Local\Package The instance of the Plugin + */ + public function getInstalledPlugin($slug) + { + return $this->installed['plugins'][$slug]; + } + + /** + * Returns the Locally installed plugins + * @return Iterator The installed plugins + */ + public function getInstalledPlugins() + { + return $this->installed['plugins']; + } + + /** + * Checks if a Plugin is installed + * @param string $slug The slug of the Plugin + * @return boolean True if the Plugin has been installed. False otherwise + */ + public function isPluginInstalled($slug) + { + return isset($this->installed['plugins'][$slug]); + } + + /** + * Return the instance of a specific Theme + * @param string $slug The slug of the Theme + * @return Local\Package The instance of the Theme + */ + public function getInstalledTheme($slug) + { + return $this->installed['themes'][$slug]; + } + + /** + * Returns the Locally installed themes + * @return Iterator The installed themes + */ + public function getInstalledThemes() + { + return $this->installed['themes']; + } + + /** + * Checks if a Theme is installed + * @param string $slug The slug of the Theme + * @return boolean True if the Theme has been installed. False otherwise + */ + public function isThemeInstalled($slug) + { + return isset($this->installed['themes'][$slug]); + } + + /** + * Returns the amount of updates available + * @return integer Amount of available updates + */ + public function countUpdates() + { + $count = 0; + + $count += count($this->getUpdatablePlugins()); + $count += count($this->getUpdatableThemes()); + + return $count; + } + + /** + * Returns an array of Plugins and Themes that can be updated. + * Plugins and Themes are extended with the `available` property that relies to the remote version + * @return array Array of updatable Plugins and Themes. + * Format: ['total' => int, 'plugins' => array, 'themes' => array] + */ + public function getUpdatable() + { + $plugins = $this->getUpdatablePlugins(); + $themes = $this->getUpdatableThemes(); + + $items = [ + 'total' => count($plugins)+count($themes), + 'plugins' => $plugins, + 'themes' => $themes + ]; + + return $items; + } + + /** + * Returns an array of Plugins that can be updated. + * The Plugins are extended with the `available` property that relies to the remote version + * @return Iterator Array of updatable Plugins + */ + public function getUpdatablePlugins() + { + $items = []; + $repository = $this->repository['plugins']; + + // local cache to speed things up + if (isset($this->cache[__METHOD__])) { + return $this->cache[__METHOD__]; + } + + foreach ($this->installed['plugins'] as $slug => $plugin) { + if (!isset($repository[$slug]) || $plugin->symlink) { + continue; + } + + $local_version = $plugin->version ? $plugin->version : 'Unknown'; + $remote_version = $repository[$slug]->version; + + if (version_compare($local_version, $remote_version) < 0) { + $repository[$slug]->available = $remote_version; + $repository[$slug]->version = $local_version; + $items[$slug] = $repository[$slug]; + } + } + + $this->cache[__METHOD__] = $items; + + return $items; + } + + /** + * Check if a Plugin or Theme is updatable + * @param string $slug The slug of the package + * @return boolean True if updatable. False otherwise or if not found + */ + public function isUpdatable($slug) + { + return $this->isPluginUpdatable($slug) || $this->isThemeUpdatable($slug); + } + + /** + * Checks if a Plugin is updatable + * @param string $plugin The slug of the Plugin + * @return boolean True if the Plugin is updatable. False otherwise + */ + public function isPluginUpdatable($plugin) + { + return array_key_exists($plugin, (array) $this->getUpdatablePlugins()); + } + + /** + * Returns an array of Themes that can be updated. + * The Themes are extended with the `available` property that relies to the remote version + * @return Iterator Array of updatable Themes + */ + public function getUpdatableThemes() + { + $items = []; + $repository = $this->repository['themes']; + + // local cache to speed things up + if (isset($this->cache[__METHOD__])) { + return $this->cache[__METHOD__]; + } + + foreach ($this->installed['themes'] as $slug => $plugin) { + if (!isset($repository[$slug]) || $plugin->symlink) { + continue; + } + + $local_version = $plugin->version ? $plugin->version : 'Unknown'; + $remote_version = $repository[$slug]->version; + + if (version_compare($local_version, $remote_version) < 0) { + $repository[$slug]->available = $remote_version; + $repository[$slug]->version = $local_version; + $items[$slug] = $repository[$slug]; + } + } + + $this->cache[__METHOD__] = $items; + + return $items; + } + + /** + * Checks if a Theme is Updatable + * @param string $theme The slug of the Theme + * @return boolean True if the Theme is updatable. False otherwise + */ + public function isThemeUpdatable($theme) + { + return array_key_exists($theme, (array) $this->getUpdatableThemes()); + } + + /** + * Returns a Plugin from the repository + * @param string $slug The slug of the Plugin + * @return mixed Package if found, NULL if not + */ + public function getRepositoryPlugin($slug) + { + return @$this->repository['plugins'][$slug]; + } + + /** + * Returns the list of Plugins available in the repository + * @return Iterator The Plugins remotely available + */ + public function getRepositoryPlugins() + { + return $this->repository['plugins']; + } + + /** + * Returns a Theme from the repository + * @param string $slug The slug of the Theme + * @return mixed Package if found, NULL if not + */ + public function getRepositoryTheme($slug) + { + return @$this->repository['themes'][$slug]; + } + + /** + * Returns the list of Themes available in the repository + * @return Iterator The Themes remotely available + */ + public function getRepositoryThemes() + { + return $this->repository['themes']; + } + + /** + * Returns the list of Plugins and Themes available in the repository + * @return array Array of available Plugins and Themes + * Format: ['plugins' => array, 'themes' => array] + */ + public function getRepository() + { + return $this->repository; + } + + /** + * Searches for a Package in the repository + * @param string $search Can be either the slug or the name + * @return Remote\Package Package if found, FALSE if not + */ + public function findPackage($search) + { + $search = strtolower($search); + if ($found = $this->getRepositoryTheme($search)) { + return $found; + } + + if ($found = $this->getRepositoryPlugin($search)) { + return $found; + } + + foreach ($this->getRepositoryThemes() as $slug => $theme) { + if ($search == $slug || $search == $theme->name) { + return $theme; + } + } + + foreach ($this->getRepositoryPlugins() as $slug => $plugin) { + if ($search == $slug || $search == $plugin->name) { + return $plugin; + } + } + + return false; + } + + /** + * Returns the list of Plugins and Themes available in the repository + * @return array Array of available Plugins and Themes + * Format: ['plugins' => array, 'themes' => array] + */ + /** + * Searches for a list of Packages in the repository + * @param array $searches An array of either slugs or names + * @return array Array of found Packages + * Format: ['total' => int, 'not_found' => array, ] + */ + public function findPackages($searches = []) + { + $packages = ['total' => 0, 'not_found' => []]; + $inflector = new Inflector(); + + foreach ($searches as $search) { + $repository = ''; + // if this is an object, get the search data from the key + if (is_object($search)) { + $search = (array) $search; + $key = key($search); + $repository = $search[$key]; + $search = $key; + } + + if ($found = $this->findPackage($search)) { + // set override repository if provided + if ($repository) { + $found->override_repository = $repository; + } + if (!isset($packages[$found->package_type])) { + $packages[$found->package_type] = []; + } + + $packages[$found->package_type][$found->slug] = $found; + $packages['total']++; + } else { + // make a best guess at the type based on the repo URL + if (Utils::contains($repository, '-theme')) { + $type = 'themes'; + } else { + $type = 'plugins'; + } + + $not_found = new \stdClass(); + $not_found->name = $inflector->camelize($search); + $not_found->slug = $search; + $not_found->package_type = $type; + $not_found->install_path = str_replace('%name%', $search, $this->install_paths[$type]); + $not_found->override_repository = $repository; + $packages['not_found'][$search] = $not_found; + } + } + + return $packages; + } +} diff --git a/system/src/Grav/Common/GPM/Installer.php b/system/src/Grav/Common/GPM/Installer.php new file mode 100644 index 0000000..ee9db48 --- /dev/null +++ b/system/src/Grav/Common/GPM/Installer.php @@ -0,0 +1,343 @@ + true, + 'ignore_symlinks' => true, + 'sophisticated' => false, + 'theme' => false, + 'install_path' => '', + 'exclude_checks' => [self::EXISTS, self::NOT_FOUND, self::IS_LINK] + ]; + + /** + * Installs a given package to a given destination. + * + * @param string $package The local path to the ZIP package + * @param string $destination The local path to the Grav Instance + * @param array $options Options to use for installing. ie, ['install_path' => 'user/themes/antimatter'] + * + * @return boolean True if everything went fine, False otherwise. + */ + public static function install($package, $destination, $options = []) + { + $destination = rtrim($destination, DS); + $options = array_merge(self::$options, $options); + $install_path = rtrim($destination . DS . ltrim($options['install_path'], DS), DS); + + if (!self::isGravInstance($destination) || !self::isValidDestination($install_path, $options['exclude_checks'])) { + return false; + } + + if (self::lastErrorCode() == self::IS_LINK && $options['ignore_symlinks'] || + self::lastErrorCode() == self::EXISTS && !$options['overwrite']) { + return false; + } + + // Pre install checks + static::flightProcessing('pre_install', $install_path); + + $zip = new \ZipArchive(); + $archive = $zip->open($package); + $tmp = CACHE_DIR . 'tmp/Grav-' . uniqid(); + + if ($archive !== true) { + self::$error = self::ZIP_OPEN_ERROR; + + return false; + } + + Folder::mkdir($tmp); + + $unzip = $zip->extractTo($tmp); + + if (!$unzip) { + self::$error = self::ZIP_EXTRACT_ERROR; + + $zip->close(); + Folder::delete($tmp); + + return false; + } + + + if (!$options['sophisticated']) { + if ($options['theme']) { + self::copyInstall($zip, $install_path, $tmp); + } else { + self::moveInstall($zip, $install_path, $tmp); + } + } else { + self::sophisticatedInstall($zip, $install_path, $tmp); + } + + Folder::delete($tmp); + $zip->close(); + + // Post install checks + static::flightProcessing('post_install', $install_path); + + self::$error = self::OK; + + return true; + + } + + protected static function flightProcessing($state, $install_path) + { + $blueprints_path = $install_path . DS . 'blueprints.yaml'; + + if (file_exists($blueprints_path)) { + $package_yaml = Yaml::parse(file_get_contents($blueprints_path)); + if (isset($package_yaml['install'][$state]['create'])) { + foreach ((array) $package_yaml['install']['pre_install']['create'] as $file) { + Folder::mkdir($install_path . '/' . ltrim($file, '/')); + } + } + if (isset($package_yaml['install'][$state]['remove'])) { + foreach ((array) $package_yaml['install']['pre_install']['remove'] as $file) { + Folder::delete($install_path . '/' . ltrim($file, '/')); + } + } + } + } + + public static function moveInstall(\ZipArchive $zip, $install_path, $tmp) + { + $container = $zip->getNameIndex(0); + if (file_exists($install_path)) { + Folder::delete($install_path); + } + + Folder::move($tmp . DS . $container, $install_path); + + return true; + } + + public static function copyInstall(\ZipArchive $zip, $install_path, $tmp) + { + $firstDir = $zip->getNameIndex(0); + if (empty($firstDir)) { + throw new \RuntimeException("Directory $firstDir is missing"); + } else { + $tmp = realpath($tmp . DS . $firstDir); + Folder::rcopy($tmp, $install_path); + } + + return true; + } + + public static function sophisticatedInstall(\ZipArchive $zip, $install_path, $tmp) + { + for ($i = 0, $l = $zip->numFiles; $i < $l; $i++) { + $filename = $zip->getNameIndex($i); + $fileinfo = pathinfo($filename); + $depth = count(explode(DS, rtrim($filename, '/'))); + + if ($depth > 2) { + continue; + } + + $path = $install_path . DS . $fileinfo['basename']; + + if (is_link($path)) { + continue; + } else { + if (is_dir($path)) { + Folder::delete($path); + Folder::move($tmp . DS . $filename, $path); + + if ($fileinfo['basename'] == 'bin') { + foreach (glob($path . DS . '*') as $file) { + @chmod($file, 0755); + } + } + } else { + @unlink($path); + @copy($tmp . DS . $filename, $path); + } + } + } + + return true; + } + + /** + * Uninstalls one or more given package + * + * @param string $path The slug of the package(s) + * @param array $options Options to use for uninstalling + * + * @return boolean True if everything went fine, False otherwise. + */ + public static function uninstall($path, $options = []) + { + $options = array_merge(self::$options, $options); + if (!self::isValidDestination($path, $options['exclude_checks']) + ) { + return false; + } + + return Folder::delete($path); + } + + /** + * Runs a set of checks on the destination and sets the Error if any + * + * @param string $destination The directory to run validations at + * @param array $exclude An array of constants to exclude from the validation + * + * @return boolean True if validation passed. False otherwise + */ + public static function isValidDestination($destination, $exclude = []) + { + self::$error = 0; + self::$target = $destination; + + if (is_link($destination)) { + self::$error = self::IS_LINK; + } elseif (file_exists($destination)) { + self::$error = self::EXISTS; + } elseif (!file_exists($destination)) { + self::$error = self::NOT_FOUND; + } elseif (!is_dir($destination)) { + self::$error = self::NOT_DIRECTORY; + } + + if (count($exclude) && in_array(self::$error, $exclude)) { + return true; + } + + return !(self::$error); + } + + /** + * Validates if the given path is a Grav Instance + * + * @param string $target The local path to the Grav Instance + * + * @return boolean True if is a Grav Instance. False otherwise + */ + public static function isGravInstance($target) + { + self::$error = 0; + self::$target = $target; + + if ( + !file_exists($target . DS . 'index.php') || + !file_exists($target . DS . 'bin') || + !file_exists($target . DS . 'user') || + !file_exists($target . DS . 'system' . DS . 'config' . DS . 'system.yaml') + ) { + self::$error = self::NOT_GRAV_ROOT; + } + + return !self::$error; + } + + /** + * Returns the last error occurred in a string message format + * @return string The message of the last error + */ + public static function lastErrorMsg() + { + $msg = 'Unknown Error'; + + switch (self::$error) { + case 0: + $msg = 'No Error'; + break; + + case self::EXISTS: + $msg = 'The target path "' . self::$target . '" already exists'; + break; + + case self::IS_LINK: + $msg = 'The target path "' . self::$target . '" is a symbolic link'; + break; + + case self::NOT_FOUND: + $msg = 'The target path "' . self::$target . '" does not appear to exist'; + break; + + case self::NOT_DIRECTORY: + $msg = 'The target path "' . self::$target . '" does not appear to be a folder'; + break; + + case self::NOT_GRAV_ROOT: + $msg = 'The target path "' . self::$target . '" does not appear to be a Grav instance'; + break; + + case self::ZIP_OPEN_ERROR: + $msg = 'Unable to open the package file'; + break; + + case self::ZIP_EXTRACT_ERROR: + $msg = 'An error occurred while extracting the package'; + break; + + default: + return 'Unknown error'; + break; + } + + return $msg; + } + + /** + * Returns the last error code of the occurred error + * @return integer The code of the last error + */ + public static function lastErrorCode() + { + return self::$error; + } + + /** + * Allows to manually set an error + * @param $error the Error code + */ + + public static function setError($error) + { + self::$error = $error; + } +} diff --git a/system/src/Grav/Common/GPM/Local/AbstractPackageCollection.php b/system/src/Grav/Common/GPM/Local/AbstractPackageCollection.php new file mode 100644 index 0000000..b61f92c --- /dev/null +++ b/system/src/Grav/Common/GPM/Local/AbstractPackageCollection.php @@ -0,0 +1,17 @@ + $data) { + $data->set('slug', $name); + $this->items[$name] = new Package($data, $this->type); + } + } +} diff --git a/system/src/Grav/Common/GPM/Local/Package.php b/system/src/Grav/Common/GPM/Local/Package.php new file mode 100644 index 0000000..6505a59 --- /dev/null +++ b/system/src/Grav/Common/GPM/Local/Package.php @@ -0,0 +1,32 @@ +blueprints()->toArray()); + parent::__construct($data, $package_type); + + $this->settings = $package->toArray(); + + $html_description = \Parsedown::instance()->line($this->description); + $this->data->set('slug', $package->slug); + $this->data->set('description_html', $html_description); + $this->data->set('description_plain', strip_tags($html_description)); + $this->data->set('symlink', is_link(USER_DIR . $package_type . DS . $this->name)); + } + + /** + * @return mixed + */ + public function isEnabled() + { + return $this->settings['enabled']; + } +} diff --git a/system/src/Grav/Common/GPM/Local/Packages.php b/system/src/Grav/Common/GPM/Local/Packages.php new file mode 100644 index 0000000..a8ed6a4 --- /dev/null +++ b/system/src/Grav/Common/GPM/Local/Packages.php @@ -0,0 +1,17 @@ + new Plugins(), + 'themes' => new Themes() + ]; + + parent::__construct($items); + } +} diff --git a/system/src/Grav/Common/GPM/Local/Plugins.php b/system/src/Grav/Common/GPM/Local/Plugins.php new file mode 100644 index 0000000..b1c3c64 --- /dev/null +++ b/system/src/Grav/Common/GPM/Local/Plugins.php @@ -0,0 +1,22 @@ +all()); + } +} diff --git a/system/src/Grav/Common/GPM/Local/Themes.php b/system/src/Grav/Common/GPM/Local/Themes.php new file mode 100644 index 0000000..64d23b9 --- /dev/null +++ b/system/src/Grav/Common/GPM/Local/Themes.php @@ -0,0 +1,22 @@ +all()); + } +} diff --git a/system/src/Grav/Common/GPM/PackageInterface.php b/system/src/Grav/Common/GPM/PackageInterface.php new file mode 100644 index 0000000..ad856c0 --- /dev/null +++ b/system/src/Grav/Common/GPM/PackageInterface.php @@ -0,0 +1,58 @@ +findResource('cache://gpm', true, true); + $this->cache = new FilesystemCache($cache_dir); + + $this->repository = $repository; + $this->raw = $this->cache->fetch(md5($this->repository)); + + $this->fetch($refresh, $callback); + foreach (json_decode($this->raw, true) as $slug => $data) { + $this->items[$slug] = new Package($data, $this->type); + } + } + + public function fetch($refresh = false, $callback = null) + { + if (!$this->raw || $refresh) { + $response = Response::get($this->repository, [], $callback); + $this->raw = $response; + $this->cache->save(md5($this->repository), $this->raw, $this->lifetime); + } + + return $this->raw; + } +} diff --git a/system/src/Grav/Common/GPM/Remote/Grav.php b/system/src/Grav/Common/GPM/Remote/Grav.php new file mode 100644 index 0000000..f8148a5 --- /dev/null +++ b/system/src/Grav/Common/GPM/Remote/Grav.php @@ -0,0 +1,95 @@ +findResource('cache://gpm', true, true); + $this->cache = new FilesystemCache($cache_dir); + $this->raw = $this->cache->fetch(md5($this->repository)); + + $this->fetch($refresh, $callback); + + $this->data = json_decode($this->raw, true); + $this->version = isset($this->data['version']) ? $this->data['version'] : '-'; + $this->date = isset($this->data['date']) ? $this->data['date'] : '-'; + + if (isset($this->data['assets'])) foreach ($this->data['assets'] as $slug => $data) { + $this->items[$slug] = new Package($data); + } + } + + /** + * Returns the list of assets associated to the latest version of Grav + * @return array list of assets + */ + public function getAssets() + { + return $this->data['assets']; + } + + /** + * Returns the changelog list for each version of Grav + * @param string $diff the version number to start the diff from + * + * @return array changelog list for each version + */ + public function getChangelog($diff = null) + { + if (!$diff) { + return $this->data['changelog']; + } + + $diffLog = []; + foreach ($this->data['changelog'] as $version => $changelog) { + preg_match("/[\d\.]+/", $version, $cleanVersion); + + if (!$cleanVersion || version_compare($diff, $cleanVersion[0], ">=")) { continue; } + + $diffLog[$version] = $changelog; + } + + return $diffLog; + } + + /** + * Returns the latest version of Grav available remotely + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Return the release date of the latest Grav + * @return string + */ + public function getDate() + { + return $this->date; + } + + public function isUpdatable() + { + return version_compare(GRAV_VERSION, $this->getVersion(), '<'); + } + + public function isSymlink() + { + return is_link(GRAV_ROOT . DS . 'index.php'); + } +} diff --git a/system/src/Grav/Common/GPM/Remote/Package.php b/system/src/Grav/Common/GPM/Remote/Package.php new file mode 100644 index 0000000..9b0367f --- /dev/null +++ b/system/src/Grav/Common/GPM/Remote/Package.php @@ -0,0 +1,12 @@ + new Plugins($refresh, $callback), + 'themes' => new Themes($refresh, $callback) + ]; + + parent::__construct($items); + } +} diff --git a/system/src/Grav/Common/GPM/Remote/Plugins.php b/system/src/Grav/Common/GPM/Remote/Plugins.php new file mode 100644 index 0000000..ec6d645 --- /dev/null +++ b/system/src/Grav/Common/GPM/Remote/Plugins.php @@ -0,0 +1,24 @@ +repository, $refresh, $callback); + } +} diff --git a/system/src/Grav/Common/GPM/Remote/Themes.php b/system/src/Grav/Common/GPM/Remote/Themes.php new file mode 100644 index 0000000..759b7e1 --- /dev/null +++ b/system/src/Grav/Common/GPM/Remote/Themes.php @@ -0,0 +1,24 @@ +repository, $refresh, $callback); + } +} diff --git a/system/src/Grav/Common/GPM/Response.php b/system/src/Grav/Common/GPM/Response.php new file mode 100644 index 0000000..4f61e2b --- /dev/null +++ b/system/src/Grav/Common/GPM/Response.php @@ -0,0 +1,221 @@ + [ + CURLOPT_REFERER => 'Grav GPM', + CURLOPT_USERAGENT => 'Grav GPM', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_TIMEOUT => 15, + CURLOPT_HEADER => false, + /** + * Example of callback parameters from within your own class + */ + //CURLOPT_NOPROGRESS => false, + //CURLOPT_PROGRESSFUNCTION => [$this, 'progress'] + ], + 'fopen' => [ + 'method' => 'GET', + 'user_agent' => 'Grav GPM', + 'max_redirects' => 5, + 'follow_location' => 1, + 'timeout' => 15, + /** + * Example of callback parameters from within your own class + */ + //'notification' => [$this, 'progress'] + ] + ]; + + /** + * Sets the preferred method to use for making HTTP calls. + * @param string $method Default is `auto` + */ + public static function setMethod($method = 'auto') + { + if (!in_array($method, ['auto', 'curl', 'fopen'])) { + $method = 'auto'; + } + + self::$method = $method; + + return new self(); + } + + /** + * Makes a request to the URL by using the preferred method + * @param string $uri URL to call + * @param array $options An array of parameters for both `curl` and `fopen` + * @return string The response of the request + */ + public static function get($uri = '', $options = [], $callback = null) + { + if (!self::isCurlAvailable() && !self::isFopenAvailable()) { + throw new \RuntimeException('Could not start an HTTP request. `allow_url_open` is disabled and `cURL` is not available'); + } + + $options = array_replace_recursive(self::$defaults, $options); + $method = 'get' . ucfirst(strtolower(self::$method)); + + self::$callback = $callback; + return static::$method($uri, $options, $callback); + } + + /** + * Progress normalized for cURL and Fopen + * @param args Variable length of arguments passed in by stream method + * @return array Normalized array with useful data. + * Format: ['code' => int|false, 'filesize' => bytes, 'transferred' => bytes, 'percent' => int] + */ + public static function progress() + { + static $filesize = null; + + $args = func_get_args(); + $isCurlResource = is_resource($args[0]) && get_resource_type($args[0]) == 'curl'; + + $notification_code = !$isCurlResource ? $args[0] : false; + $bytes_transferred = $isCurlResource ? $args[2] : $args[4]; + + if ($isCurlResource) { + $filesize = $args[1]; + } elseif ($notification_code == STREAM_NOTIFY_FILE_SIZE_IS) { + $filesize = $args[5]; + } + + if ($bytes_transferred > 0) { + if ($notification_code == STREAM_NOTIFY_PROGRESS|STREAM_NOTIFY_COMPLETED || $isCurlResource) { + + $progress = [ + 'code' => $notification_code, + 'filesize' => $filesize, + 'transferred' => $bytes_transferred, + 'percent' => $filesize <= 0 ? '-' : round(($bytes_transferred * 100) / $filesize, 1) + ]; + + if (self::$callback !== null) { + call_user_func_array(self::$callback, [$progress]); + } + } + } + } + + /** + * Checks if cURL is available + * @return boolean + */ + public static function isCurlAvailable() + { + return function_exists('curl_version'); + } + + /** + * Checks if the remote fopen request is enabled in PHP + * @return boolean + */ + public static function isFopenAvailable() + { + return preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); + } + + /** + * Automatically picks the preferred method + * @return string The response of the request + */ + private static function getAuto() + { + if (self::isFopenAvailable()) { + return self::getFopen(func_get_args()); + } + + if (self::isCurlAvailable()) { + return self::getCurl(func_get_args()); + } + } + + /** + * Starts a HTTP request via cURL + * @return string The response of the request + */ + private static function getCurl() + { + $args = func_get_args(); + $args = count($args) > 1 ? $args : array_shift($args); + + $uri = $args[0]; + $options = $args[1]; + $callback = $args[2]; + + $ch = curl_init($uri); + curl_setopt_array($ch, $options['curl']); + + if ($callback) { + curl_setopt_array( + $ch, + [ + CURLOPT_NOPROGRESS => false, + CURLOPT_PROGRESSFUNCTION => ['self', 'progress'] + ] + ); + } + + $response = curl_exec($ch); + + if ($errno = curl_errno($ch)) { + $error_message = curl_strerror($errno); + throw new \RuntimeException("cURL error ({$errno}):\n {$error_message}"); + } + + curl_close($ch); + + return $response; + } + + /** + * Starts a HTTP request via fopen + * @return string The response of the request + */ + private static function getFopen() + { + if (count($args = func_get_args()) == 1) { + $args = $args[0]; + } + + $uri = $args[0]; + $options = $args[1]; + $callback = $args[2]; + + if ($callback) { + $options['fopen']['notification'] = ['self', 'progress']; + } + + $stream = stream_context_create(['http' => $options['fopen']], $options['fopen']); + $content = @file_get_contents($uri, false, $stream); + + if ($content === false) { + throw new \RuntimeException("Error while trying to download '$uri'"); + } + + return $content; + } +} diff --git a/system/src/Grav/Common/GPM/Upgrader.php b/system/src/Grav/Common/GPM/Upgrader.php new file mode 100644 index 0000000..590ad4d --- /dev/null +++ b/system/src/Grav/Common/GPM/Upgrader.php @@ -0,0 +1,93 @@ +remote = new Remote\Grav($refresh, $callback); + } + + /** + * Returns the release date of the latest version of Grav + * @return string + */ + public function getReleaseDate() + { + return $this->remote->getDate(); + } + + /** + * Returns the version of the installed Grav + * @return string + */ + public function getLocalVersion() + { + return GRAV_VERSION; + } + + /** + * Returns the version of the remotely available Grav + * @return string + */ + public function getRemoteVersion() + { + return $this->remote->getVersion(); + } + + /** + * Returns an array of assets available to download remotely + * @return array + */ + public function getAssets() + { + return $this->remote->getAssets(); + } + + /** + * Returns the changelog list for each version of Grav + * @param string $diff the version number to start the diff from + * + * @return array return the changelog list for each version + */ + public function getChangelog($diff = null) + { + return $this->remote->getChangelog($diff); + } + + /** + * Checks if the currently installed Grav is upgradable to a newer version + * @return boolean True if it's upgradable, False otherwise. + */ + public function isUpgradable() + { + return version_compare($this->getLocalVersion(), $this->getRemoteVersion(), "<"); + } + + /** + * Checks if Grav is currently symbolically linked + * @return boolean True if Grav is symlinked, False otherwise. + */ + + public function isSymlink() + { + return $this->remote->isSymlink(); + } +} diff --git a/system/src/Grav/Common/Getters.php b/system/src/Grav/Common/Getters.php new file mode 100644 index 0000000..857dcca --- /dev/null +++ b/system/src/Grav/Common/Getters.php @@ -0,0 +1,150 @@ +offsetSet($offset, $value); + } + + /** + * Magic getter method + * + * @param mixed $offset Medium name value + * @return mixed Medium value + */ + public function __get($offset) + { + return $this->offsetGet($offset); + } + + /** + * Magic method to determine if the attribute is set + * + * @param mixed $offset Medium name value + * @return boolean True if the value is set + */ + public function __isset($offset) + { + return $this->offsetExists($offset); + } + + /** + * Magic method to unset the attribute + * + * @param mixed $offset The name value to unset + */ + public function __unset($offset) + { + $this->offsetUnset($offset); + } + + /** + * @param mixed $offset + * @return bool + */ + public function offsetExists($offset) + { + if ($this->gettersVariable) { + $var = $this->gettersVariable; + return isset($this->{$var}[$offset]); + } else { + return isset($this->{$offset}); + } + } + + /** + * @param mixed $offset + * @return mixed + */ + public function offsetGet($offset) + { + if ($this->gettersVariable) { + $var = $this->gettersVariable; + return isset($this->{$var}[$offset]) ? $this->{$var}[$offset] : null; + } else { + return isset($this->{$offset}) ? $this->{$offset} : null; + } + } + + /** + * @param mixed $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) + { + if ($this->gettersVariable) { + $var = $this->gettersVariable; + $this->{$var}[$offset] = $value; + } else { + $this->{$offset} = $value; + } + } + + /** + * @param mixed $offset + */ + public function offsetUnset($offset) + { + if ($this->gettersVariable) { + $var = $this->gettersVariable; + unset($this->{$var}[$offset]); + } else { + unset($this->{$offset}); + } + } + + /** + * @return int + */ + public function count() + { + if ($this->gettersVariable) { + $var = $this->gettersVariable; + count($this->{$var}); + } else { + count($this->toArray()); + } + } + + /** + * Returns an associative array of object properties. + * + * @return array + */ + public function toArray() + { + if ($this->gettersVariable) { + $var = $this->gettersVariable; + return $this->{$var}; + } else { + $properties = (array) $this; + $list = array(); + foreach ($properties as $property => $value) { + if ($property[0] != "\0") $list[$property] = $value; + } + return $list; + } + } +} diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php new file mode 100644 index 0000000..d60cfd0 --- /dev/null +++ b/system/src/Grav/Common/Grav.php @@ -0,0 +1,510 @@ + $value) { + $instance->offsetSet($key, $value); + } + } + + return self::$instance; + } + + protected static function load(array $values) + { + $container = new static($values); + + $container['grav'] = $container; + + + + $container['debugger'] = new Debugger(); + $container['debugger']->startTimer('_init', 'Initialize'); + + $container->register(new LoggerServiceProvider); + + $container->register(new ErrorServiceProvider); + + $container['uri'] = function ($c) { + return new Uri($c); + }; + + $container['task'] = function ($c) { + return !empty($_POST['task']) ? $_POST['task'] : $c['uri']->param('task'); + }; + + $container['events'] = function ($c) { + return new EventDispatcher; + }; + $container['cache'] = function ($c) { + return new Cache($c); + }; + $container['session'] = function ($c) { + return new Session($c); + }; + $container['plugins'] = function ($c) { + return new Plugins(); + }; + $container['themes'] = function ($c) { + return new Themes($c); + }; + $container['twig'] = function ($c) { + return new Twig($c); + }; + $container['taxonomy'] = function ($c) { + return new Taxonomy($c); + }; + $container['language'] = function ($c) { + return new Language($c); + }; + + $container['pages'] = function ($c) { + return new Page\Pages($c); + }; + + $container['assets'] = new Assets(); + + $container['page'] = function ($c) { + /** @var Pages $pages */ + $pages = $c['pages']; + /** @var Language $language */ + $language = $c['language']; + + /** @var Uri $uri */ + $uri = $c['uri']; + + $path = rtrim($uri->path(), '/'); + $path = $path ?: '/'; + + $page = $pages->dispatch($path); + + // Redirection tests + if ($page) { + // Language-specific redirection scenarios + if ($language->enabled()) { + if ($language->isLanguageInUrl() && !$language->isIncludeDefaultLanguage()) { + $c->redirect($page->route()); + } + if (!$language->isLanguageInUrl() && $language->isIncludeDefaultLanguage()) { + $c->redirectLangSafe($page->route()); + } + } + // Default route test and redirect + if ($c['config']->get('system.pages.redirect_default_route') && $page->route() != $path) { + $c->redirectLangSafe($page->route()); + } + } + + // if page is not found, try some fallback stuff + if (!$page || !$page->routable()) { + + // Try fallback URL stuff... + $c->fallbackUrl($page, $path); + + // If no page found, fire event + $event = $c->fireEvent('onPageNotFound'); + + if (isset($event->page)) { + $page = $event->page; + } else { + throw new \RuntimeException('Page Not Found', 404); + } + } + return $page; + }; + $container['output'] = function ($c) { + return $c['twig']->processSite($c['uri']->extension()); + }; + $container['browser'] = function ($c) { + return new Browser(); + }; + + $container['base_url_absolute'] = function ($c) { + return $c['config']->get('system.base_url_absolute') ?: $c['uri']->rootUrl(true); + }; + $container['base_url_relative'] = function ($c) { + return $c['config']->get('system.base_url_relative') ?: $c['uri']->rootUrl(false); + }; + $container['base_url'] = function ($c) { + return $c['config']->get('system.absolute_urls') ? $c['base_url_absolute'] : $c['base_url_relative']; + }; + + $container->register(new StreamsServiceProvider); + $container->register(new ConfigServiceProvider); + + $container['inflector'] = new Inflector(); + + $container['debugger']->stopTimer('_init'); + + return $container; + } + + public function process() + { + /** @var Debugger $debugger */ + $debugger = $this['debugger']; + + + + // Initialize configuration. + $debugger->startTimer('_config', 'Configuration'); + $this['config']->init(); + $this['errors']->resetHandlers(); + $this['uri']->init(); + $this['session']->init(); + + $debugger->init(); + $this['config']->debug(); + $debugger->stopTimer('_config'); + + // Use output buffering to prevent headers from being sent too early. + ob_start(); + if ($this['config']->get('system.cache.gzip')) { + ob_start('ob_gzhandler'); + } + + // Initialize the timezone + if ($this['config']->get('system.timezone')) { + date_default_timezone_set($this['config']->get('system.timezone')); + } + + // Initialize Locale if set and configured + if ($this['language']->enabled() && $this['config']->get('system.languages.override_locale')) { + setlocale(LC_ALL, $this['language']->getLanguage()); + } elseif ($this['config']->get('system.default_locale')) { + setlocale(LC_ALL, $this['config']->get('system.default_locale')); + } + + $debugger->startTimer('streams', 'Streams'); + $this['streams']; + $debugger->stopTimer('streams'); + + $debugger->startTimer('plugins', 'Plugins'); + $this['plugins']->init(); + $this->fireEvent('onPluginsInitialized'); + $debugger->stopTimer('plugins'); + + $debugger->startTimer('themes', 'Themes'); + $this['themes']->init(); + $this->fireEvent('onThemeInitialized'); + $debugger->stopTimer('themes'); + + $task = $this['task']; + if ($task) { + $this->fireEvent('onTask.' . $task); + } + + $this['assets']->init(); + $this->fireEvent('onAssetsInitialized'); + + $debugger->startTimer('twig', 'Twig'); + $this['twig']->init(); + $debugger->stopTimer('twig'); + + $debugger->startTimer('pages', 'Pages'); + $this['pages']->init(); + $this->fireEvent('onPagesInitialized'); + $debugger->stopTimer('pages'); + $this->fireEvent('onPageInitialized'); + + $debugger->addAssets(); + + // Process whole page as required + $debugger->startTimer('render', 'Render'); + $this->output = $this['output']; + $this->fireEvent('onOutputGenerated'); + $debugger->stopTimer('render'); + + // Set the header type + $this->header(); + echo $this->output; + $debugger->render(); + + $this->fireEvent('onOutputRendered'); + + register_shutdown_function([$this, 'shutdown']); + } + + /** + * Redirect browser to another location. + * + * @param string $route Internal route. + * @param int $code Redirection code (30x) + */ + public function redirect($route, $code = null) + { + /** @var Uri $uri */ + $uri = $this['uri']; + + //Check for code in route + $regex = '/.*(\[(30[1-7])\])$/'; + preg_match($regex, $route, $matches); + if ($matches) { + $route = str_replace($matches[1], '', $matches[0]); + $code = $matches[2]; + } + + if ($code == null) { + $code = $this['config']->get('system.pages.redirect_default_code', 301); + } + + if (isset($this['session'])) { + $this['session']->close(); + } + + if ($uri->isExternal($route)) { + $url = $route; + } else { + $url = rtrim($uri->rootUrl(), '/') .'/'. trim($route, '/'); + } + + header("Location: {$url}", true, $code); + exit(); + } + + /** + * Redirect browser to another location taking language into account (preferred) + * + * @param string $route Internal route. + * @param int $code Redirection code (30x) + */ + public function redirectLangSafe($route, $code = null) + { + /** @var Language $language */ + $language = $this['language']; + + if (!$this['uri']->isExternal($route) && $language->enabled() && $language->isIncludeDefaultLanguage()) { + return $this->redirect($language->getLanguage() . $route, $code); + } else { + return $this->redirect($route, $code); + } + } + + /** + * Returns mime type for the file format. + * + * @param string $format + * @return string + */ + public function mime($format) + { + switch ($format) { + case 'json': + return 'application/json'; + case 'html': + return 'text/html'; + case 'atom': + return 'application/atom+xml'; + case 'rss': + return 'application/rss+xml'; + case 'xml': + return 'application/xml'; + } + return 'text/html'; + } + + /** + * Set response header. + */ + public function header() + { + $extension = $this['uri']->extension(); + + /** @var Page $page */ + $page = $this['page']; + + header('Content-type: ' . $this->mime($extension)); + + // Calculate Expires Headers if set to > 0 + $expires = $page->expires(); + + if ($expires > 0) { + $expires_date = gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT'; + header('Cache-Control: max-age=' . $expires); + header('Expires: '. $expires_date); + } + + // Set the last modified time + if ($page->lastModified()) { + $last_modified_date = gmdate('D, d M Y H:i:s', $page->modified()) . ' GMT'; + header('Last-Modified: ' . $last_modified_date); + } + + // Calculate a Hash based on the raw file + if ($page->eTag()) { + header('ETag: ' . md5($page->raw() . $page->modified())); + } + + // Set debugger data in headers + if (!($extension === null || $extension == 'html')) { + $this['debugger']->enabled(false); + } + + // Set HTTP response code + if (isset($this['page']->header()->http_response_code)) { + http_response_code($this['page']->header()->http_response_code); + } + + // Vary: Accept-Encoding + if ($this['config']->get('system.pages.vary_accept_encoding', false)) { + header('Vary: Accept-Encoding'); + } + } + + /** + * Fires an event with optional parameters. + * + * @param string $eventName + * @param Event $event + * @return Event + */ + public function fireEvent($eventName, Event $event = null) + { + /** @var EventDispatcher $events */ + $events = $this['events']; + return $events->dispatch($eventName, $event); + } + + /** + * Set the final content length for the page and flush the buffer + * + */ + public function shutdown() + { + if ($this['config']->get('system.debugger.shutdown.close_connection')) { + //stop user abort + if (function_exists('ignore_user_abort')) { + @ignore_user_abort(true); + } + + // close the session + if (isset($this['session'])) { + $this['session']->close(); + } + + // flush buffer if gzip buffer was started + if ($this['config']->get('system.cache.gzip')) { + ob_end_flush(); // gzhandler buffer + } + + // get lengh and close the connection + header('Content-Length: ' . ob_get_length()); + header("Connection: close"); + + // flush the regular buffer + ob_end_flush(); + @ob_flush(); + flush(); + + // fix for fastcgi close connection issue + if (function_exists('fastcgi_finish_request')) { + @fastcgi_finish_request(); + } + + } + + $this->fireEvent('onShutdown'); + } + + /** + * This attempts to find media, other files, and download them + * @param $page + * @param $path + */ + protected function fallbackUrl($page, $path) + { + /** @var Uri $uri */ + $uri = $this['uri']; + + /** @var Config $config */ + $config = $this['config']; + + $uri_extension = $uri->extension(); + + // Only allow whitelisted types to fallback + if (!in_array($uri_extension, $config->get('system.pages.fallback_types'))) { + return; + } + + $path_parts = pathinfo($path); + $page = $this['pages']->dispatch($path_parts['dirname'], true); + if ($page) { + $media = $page->media()->all(); + + $parsed_url = parse_url(urldecode($uri->basename())); + + $media_file = $parsed_url['path']; + + // if this is a media object, try actions first + if (isset($media[$media_file])) { + $medium = $media[$media_file]; + foreach ($uri->query(null, true) as $action => $params) { + if (in_array($action, ImageMedium::$magic_actions)) { + call_user_func_array(array(&$medium, $action), explode(',', $params)); + } + } + Utils::download($medium->path(), false); + } + + // unsupported media type, try to download it... + if ($uri_extension) { + $extension = $uri_extension; + } else { + if (isset($path_parts['extension'])) { + $extension = $path_parts['extension']; + } else { + $extension = null; + } + } + + if ($extension) { + $download = true; + if (in_array(ltrim($extension, '.'), $config->get('system.media.unsupported_inline_types', []))) { + $download = false; + } + Utils::download($page->path() . DIRECTORY_SEPARATOR . $uri->basename(), $download); + } + } + } +} diff --git a/system/src/Grav/Common/GravTrait.php b/system/src/Grav/Common/GravTrait.php new file mode 100644 index 0000000..1710173 --- /dev/null +++ b/system/src/Grav/Common/GravTrait.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class Truncator { + + public static $default_options = array( + 'ellipsis' => '…', + 'break' => ' ', + 'length_in_chars' => false, + 'word_safe' => false, + ); + + // These tags are allowed to have an ellipsis inside + public static $ellipsable_tags = array( + 'p', 'ol', 'ul', 'li', + 'div', 'header', 'article', 'nav', + 'section', 'footer', 'aside', + 'dd', 'dt', 'dl', + ); + + public static $self_closing_tags = array( + 'br', 'hr', 'img', + ); + + /** + * Truncate given HTML string to specified length. + * If length_in_chars is false it's trimmed by number + * of words, otherwise by number of characters. + * + * @param string $html + * @param integer $length + * @param string|array $opts + * @return string + */ + public static function truncate($html, $length, $opts=array()) + { + if (is_string($opts)) $opts = array('ellipsis' => $opts); + $opts = array_merge(static::$default_options, $opts); + // wrap the html in case it consists of adjacent nodes like

foo

bar

+ $html = mb_convert_encoding("
".$html."
", 'HTML-ENTITIES', 'UTF-8'); + + $root_node = null; + // Parse using HTML5Lib if it's available. + if (class_exists('HTML5Lib\\Parser')) { + try { + $doc = \HTML5Lib\Parser::parse($html); + $root_node = $doc->documentElement->lastChild->lastChild; + } + catch (\Exception $e) { + ; + } + } + if ($root_node === null) { + // HTML5Lib not available so we'll have to use DOMDocument + // We'll only be able to parse HTML5 if it's valid XML + $doc = new DOMDocument('4.01', 'utf-8'); + $doc->formatOutput = false; + $doc->preserveWhiteSpace = true; + // loadHTML will fail with HTML5 tags (article, nav, etc) + // so we need to suppress errors and if it fails to parse we + // retry with the XML parser instead + $prev_use_errors = libxml_use_internal_errors(true); + if ($doc->loadHTML($html)) { + $root_node = $doc->documentElement->lastChild->lastChild; + } + else if ($doc->loadXML($html)) { + $root_node = $doc->documentElement; + } + else { + libxml_use_internal_errors($prev_use_errors); + throw new \RuntimeException; + } + libxml_use_internal_errors($prev_use_errors); + } + list($text, $_, $opts) = static::truncateNode($doc, $root_node, $length, $opts); + + $text = mb_substr(mb_substr($text, 0, -6), 5); + + return $text; + } + + protected static function truncateNode($doc, $node, $length, $opts) + { + if ($length === 0 && !static::ellipsable($node)) { + return array('', 1, $opts); + } + list($inner, $remaining, $opts) = static::innerTruncate($doc, $node, $length, $opts); + if (0 === mb_strlen($inner)) { + return array(in_array(mb_strtolower($node->nodeName), static::$self_closing_tags) ? $doc->saveXML($node) : "", $length - $remaining, $opts); + } + while($node->firstChild) { + $node->removeChild($node->firstChild); + } + $newNode = $doc->createDocumentFragment(); + // handle the ampersand + $newNode->appendXml(static::xmlEscape($inner)); + $node->appendChild($newNode); + return array($doc->saveXML($node), $length - $remaining, $opts); + } + + protected static function innerTruncate($doc, $node, $length, $opts) + { + $inner = ''; + $remaining = $length; + foreach($node->childNodes as $childNode) { + if ($childNode->nodeType === XML_ELEMENT_NODE) { + list($txt, $nb, $opts) = static::truncateNode($doc, $childNode, $remaining, $opts); + } + else if ($childNode->nodeType === XML_TEXT_NODE) { + list($txt, $nb, $opts) = static::truncateText($doc, $childNode, $remaining, $opts); + } else { + $txt = ''; + $nb = 0; + } + + // unhandle the ampersand + $txt = static::xmlUnescape($txt); + + $remaining -= $nb; + $inner .= $txt; + if ($remaining < 0) { + if (static::ellipsable($node)) { + $inner = preg_replace('/(?:[\s\pP]+|(?:&(?:[a-z]+|#[0-9]+);?))*$/', '', $inner).$opts['ellipsis']; + $opts['ellipsis'] = ''; + $opts['was_truncated'] = true; + } + break; + } + } + return array($inner, $remaining, $opts); + } + + protected static function truncateText($doc, $node, $length, $opts) + { + $string = $node->textContent; + + if ($opts['length_in_chars']) { + $count = mb_strlen($string); + if ($count <= $length && $length > 0) { + return array($string, $count, $opts); + } + if ($opts['word_safe']) { + if (false !== ($breakpoint = mb_strpos($string, $opts['break'], $length))) { + if ($breakpoint < mb_strlen($string) - 1) { + $string = mb_substr($string, 0, $breakpoint) . $opts['break']; + } + } + return array($string, $count, $opts); + } + return array(mb_substr($node->textContent, 0, $length), $count, $opts); + } + else { + preg_match_all('/\s*\S+/', $string, $words); + $words = $words[0]; + $count = count($words); + if ($count <= $length && $length > 0) { + return array($xhtml, $count, $opts); + } + return array(implode('', array_slice($words, 0, $length)), $count, $opts); + } + } + + protected static function ellipsable($node) + { + return ($node instanceof DOMDocument) + || in_array(mb_strtolower($node->nodeName), static::$ellipsable_tags) + ; + } + + protected static function xmlEscape($string) + { + $string = str_replace('&', '&', $string); + $string = str_replace('plural)) { + $language = self::getGrav()['language']; + $this->plural = $language->translate('INFLECTOR_PLURALS', null, true); + $this->singular = $language->translate('INFLECTOR_SINGULAR', null, true); + $this->uncountable = $language->translate('INFLECTOR_UNCOUNTABLE', null, true); + $this->irregular = $language->translate('INFLECTOR_IRREGULAR', null, true); + $this->ordinals = $language->translate('INFLECTOR_ORDINALS', null, true); + } + } + + /** + * Pluralizes English nouns. + * + * @param string $word English noun to pluralize + * @return string Plural noun + */ + public function pluralize($word, $count = 2) + { + $this->init(); + + if ($count == 1) { + return $word; + } + + $lowercased_word = strtolower($word); + + foreach ($this->uncountable as $_uncountable) { + if (substr($lowercased_word, (-1*strlen($_uncountable))) == $_uncountable) { + return $word; + } + } + + foreach ($this->irregular as $_plural => $_singular) { + if (preg_match('/('.$_plural.')$/i', $word, $arr)) { + return preg_replace('/('.$_plural.')$/i', substr($arr[0], 0, 1).substr($_singular, 1), $word); + } + } + + foreach ($this->plural as $rule => $replacement) { + if (preg_match($rule, $word)) { + return preg_replace($rule, $replacement, $word); + } + } + return false; + + } + + /** + * Singularizes English nouns. + * + * @param string $word English noun to singularize + * @param int $count + * @return string Singular noun. + */ + public function singularize($word, $count = 1) + { + $this->init(); + + if ($count != 1) { + return $word; + } + + $lowercased_word = strtolower($word); + foreach ($this->uncountable as $_uncountable) { + if (substr($lowercased_word, (-1*strlen($_uncountable))) == $_uncountable) { + return $word; + } + } + + foreach ($this->irregular as $_plural => $_singular) { + if (preg_match('/('.$_singular.')$/i', $word, $arr)) { + return preg_replace('/('.$_singular.')$/i', substr($arr[0], 0, 1).substr($_plural, 1), $word); + } + } + + foreach ($this->singular as $rule => $replacement) { + if (preg_match($rule, $word)) { + return preg_replace($rule, $replacement, $word); + } + } + + return $word; + } + + /** + * Converts an underscored or CamelCase word into a English + * sentence. + * + * The titleize public function converts text like "WelcomePage", + * "welcome_page" or "welcome page" to this "Welcome + * Page". + * If second parameter is set to 'first' it will only + * capitalize the first character of the title. + * + * @param string $word Word to format as tile + * @param string $uppercase If set to 'first' it will only uppercase the + * first character. Otherwise it will uppercase all + * the words in the title. + * @return string Text formatted as title + */ + public function titleize($word, $uppercase = '') + { + $uppercase = $uppercase == 'first' ? 'ucfirst' : 'ucwords'; + return $uppercase($this->humanize($this->underscorize($word))); + } + + /** + * Returns given word as CamelCased + * + * Converts a word like "send_email" to "SendEmail". It + * will remove non alphanumeric character from the word, so + * "who's online" will be converted to "WhoSOnline" + * + * @see variablize + * @param string $word Word to convert to camel case + * @return string UpperCamelCasedWord + */ + public function camelize($word) + { + return str_replace(' ', '', ucwords(preg_replace('/[^A-Z^a-z^0-9]+/', ' ', $word))); + } + + /** + * Converts a word "into_it_s_underscored_version" + * + * Convert any "CamelCased" or "ordinary Word" into an + * "underscored_word". + * + * This can be really useful for creating friendly URLs. + * + * @param string $word Word to underscore + * @return string Underscored word + */ + public function underscorize($word) + { + $regex1 = preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2', $word); + $regex2 = preg_replace('/([a-zd])([A-Z])/', '\1_\2', $regex1); + $regex3 = preg_replace('/[^A-Z^a-z^0-9]+/', '_', $regex2); + return strtolower($regex3); + } + + /** + * Converts a word "into-it-s-hyphenated-version" + * + * Convert any "CamelCased" or "ordinary Word" into an + * "hyphenated-word". + * + * This can be really useful for creating friendly URLs. + * + * @param string $word Word to hyphenate + * @return string hyphenized word + */ + public function hyphenize($word) + { + $regex1 = preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1-\2', $word); + $regex2 = preg_replace('/([a-zd])([A-Z])/', '\1-\2', $regex1); + $regex3 = preg_replace('/[^A-Z^a-z^0-9]+/', '-', $regex2); + return strtolower($regex3); + } + + /** + * Returns a human-readable string from $word + * + * Returns a human-readable string from $word, by replacing + * underscores with a space, and by upper-casing the initial + * character by default. + * + * If you need to uppercase all the words you just have to + * pass 'all' as a second parameter. + * + * @param string $word String to "humanize" + * @param string $uppercase If set to 'all' it will uppercase all the words + * instead of just the first one. + * @return string Human-readable word + */ + public function humanize($word, $uppercase = '') + { + $uppercase = $uppercase == 'all' ? 'ucwords' : 'ucfirst'; + return $uppercase(str_replace('_', ' ', preg_replace('/_id$/', '', $word))); + } + + /** + * Same as camelize but first char is underscored + * + * Converts a word like "send_email" to "sendEmail". It + * will remove non alphanumeric character from the word, so + * "who's online" will be converted to "whoSOnline" + * + * @see camelize + * @param string $word Word to lowerCamelCase + * @return string Returns a lowerCamelCasedWord + */ + public function variablize($word) + { + $word = $this->camelize($word); + return strtolower($word[0]).substr($word, 1); + } + + /** + * Converts a class name to its table name according to rails + * naming conventions. + * + * Converts "Person" to "people" + * + * @see classify + * @param string $class_name Class name for getting related table_name. + * @return string plural_table_name + */ + public function tableize($class_name) + { + return $this->pluralize($this->underscore($class_name)); + } + + /** + * Converts a table name to its class name according to rails + * naming conventions. + * + * Converts "people" to "Person" + * + * @see tableize + * @param string $table_name Table name for getting related ClassName. + * @return string SingularClassName + */ + public function classify($table_name) + { + return $this->camelize($this->singularize($table_name)); + } + + /** + * Converts number to its ordinal English form. + * + * This method converts 13 to 13th, 2 to 2nd ... + * + * @param integer $number Number to get its ordinal value + * @return string Ordinal representation of given string. + */ + public function ordinalize($number) + { + $this->init(); + + if (in_array(($number % 100), range(11, 13))) { + return $number.$this->ordinals['default']; + } else { + switch (($number % 10)) { + case 1: + return $number.$this->ordinals['first']; + break; + case 2: + return $number.$this->ordinals['second']; + break; + case 3: + return $number.$this->ordinals['third']; + break; + default: + return $number.$this->ordinals['default']; + break; + } + } + } + + public function monthize($days) + { + $now = new \DateTime(); + $end = new \DateTime(); + + $duration = new \DateInterval("P{$days}D"); + + $diff = $end->add($duration)->diff($now); + + // handle years + if ($diff->y > 0) { + $diff->m = $diff->m + 12*$diff->y; + } + + return $diff->m; + } +} diff --git a/system/src/Grav/Common/Iterator.php b/system/src/Grav/Common/Iterator.php new file mode 100644 index 0000000..d23f429 --- /dev/null +++ b/system/src/Grav/Common/Iterator.php @@ -0,0 +1,218 @@ +items[$key])) ? $this->items[$key] : null; + } + + /** + * Clone the iterator. + */ + public function __clone() + { + foreach ($this as $key => $value) { + if (is_object($value)) { + $this->$key = clone $this->$key; + } + } + } + + /** + * Convents iterator to a comma separated list. + * + * @return string + */ + public function __toString() + { + return implode(',', $this->items); + } + + /** + * Remove item from the list. + * + * @param $key + */ + public function remove($key) + { + $this->offsetUnset($key); + } + + /** + * Return previous item. + * + * @return mixed + */ + public function prev() + { + return prev($this->items); + } + + /** + * Return nth item. + * + * @param int $key + * @return mixed|bool + */ + public function nth($key) + { + $items = array_keys($this->items); + return (isset($items[$key])) ? $this->offsetGet($items[$key]) : false; + } + + /** + * Get the first item + * + * @return mixed + */ + public function first() + { + $items = array_keys($this->items); + return $this->offsetGet(array_shift($items)); + } + + /** + * Get the last item + * + * @return mixed + */ + public function last() + { + $items = array_keys($this->items); + return $this->offsetGet(array_pop($items)); + } + + /** + * Reverse the Iterator + * + * @return $this + */ + public function reverse() + { + $this->items = array_reverse($this->items); + return $this; + } + + /** + * @param mixed $needle Searched value. + * @return string|bool Key if found, otherwise false. + */ + public function indexOf($needle) + { + foreach (array_values($this->items) as $key => $value) { + if ($value === $needle) { + return $key; + } + } + return false; + } + + /** + * Shuffle items. + * + * @return $this + */ + public function shuffle() + { + $keys = array_keys($this->items); + shuffle($keys); + + $new = array(); + foreach ($keys as $key) { + $new[$key] = $this->items[$key]; + } + + $this->items = $new; + + return $this; + } + + /** + * Slice the list. + * + * @param int $offset + * @param int $length + * @return $this + */ + public function slice($offset, $length = null) + { + $this->items = array_slice($this->items, $offset, $length); + + return $this; + } + + /** + * Pick one or more random entries. + * + * @param int $num Specifies how many entries should be picked. + * @return $this + */ + public function random($num = 1) + { + $this->items = array_intersect_key($this->items, array_flip((array) array_rand($this->items, $num))); + + return $this; + } + + /** + * Append new elements to the list. + * + * @param array|Iterator $items Items to be appended. Existing keys will be overridden with the new values. + * @return $this + */ + public function append($items) + { + if ($items instanceof static) { + $items = $items->toArray(); + } + $this->items = array_merge($this->items, (array) $items); + + return $this; + } + + /** + * Filter elements from the list + * @param callable|null $callback A function the receives ($value, $key) and must return a boolean to indicate filter status + * @return $this + */ + public function filter(callable $callback = null) + { + foreach ($this->items as $key => $value) { + if ( + ($callback && !call_user_func($callback, $value, $key)) || + (!$callback && !(bool) $value) + ) { + unset($this->items[$key]); + } + } + + return $this; + } +} diff --git a/system/src/Grav/Common/Language/Language.php b/system/src/Grav/Common/Language/Language.php new file mode 100644 index 0000000..5dfe343 --- /dev/null +++ b/system/src/Grav/Common/Language/Language.php @@ -0,0 +1,467 @@ +grav = $grav; + $this->config = $grav['config']; + $this->languages = $this->config->get('system.languages.supported', []); + $this->init(); + } + + /** + * Initialize the default and enabled languages + */ + public function init() + { + $this->default = reset($this->languages); + + if (empty($this->languages)) { + $this->enabled = false; + } + } + + /** + * Ensure that languages are enabled + * + * @return bool + */ + public function enabled() + { + return $this->enabled; + } + + /** + * Gets the array of supported languages + * + * @return array + */ + public function getLanguages() + { + return $this->languages; + } + + /** + * Sets the current supported languages manually + * + * @param $langs + */ + public function setLanguages($langs) + { + $this->languages = $langs; + $this->init(); + } + + /** + * Gets a pipe-separated string of available languages + * + * @return string + */ + public function getAvailable() + { + $languagesArray = $this->languages; //Make local copy + sort($languagesArray); + return implode('|', array_reverse($languagesArray)); + } + + /** + * Gets language, active if set, else default + * + * @return mixed + */ + public function getLanguage() + { + return $this->active ? $this->active : $this->default; + } + + /** + * Gets current default language + * + * @return mixed + */ + public function getDefault() + { + return $this->default; + } + + /** + * Sets default language manually + * + * @param $lang + * + * @return bool + */ + public function setDefault($lang) + { + if ($this->validate($lang)) { + $this->default = $lang; + + return $lang; + } + + return false; + } + + /** + * Gets current active language + * + * @return mixed + */ + public function getActive() + { + return $this->active; + } + + /** + * Sets active language manually + * + * @param $lang + * + * @return bool + */ + public function setActive($lang) + { + if ($this->validate($lang)) { + $this->active = $lang; + + return $lang; + } + + return false; + } + + /** + * Sets the active language based on the first part of the URL + * + * @param $uri + * + * @return mixed + */ + public function setActiveFromUri($uri) + { + $regex = '/(^\/(' . $this->getAvailable() . '))(?:\/.*|$)/i'; + + // if languages set + if ($this->enabled()) { + // try setting from prefix of URL (/en/blah/blah) + if (preg_match($regex, $uri, $matches)) { + $this->lang_in_url = true; + $this->active = $matches[2]; + $uri = preg_replace("/\\" . $matches[1] . "/", '', $matches[0], 1); + + // store in session if different + if ($this->config->get('system.session.enabled', false) + && $this->config->get('system.languages.session_store_active', true) + && $this->grav['session']->active_language != $this->active + ) { + $this->grav['session']->active_language = $this->active; + } + } else { + // try getting from session, else no active + if ($this->config->get('system.session.enabled', false) && + $this->config->get('system.languages.session_store_active', true)) { + $this->active = $this->grav['session']->active_language ?: null; + } + // if still null, try from http_accept_language header + if ($this->active === null && $this->config->get('system.languages.http_accept_language')) { + $preferred = $this->getBrowserLanguages(); + foreach ($preferred as $lang) { + if ($this->validate($lang)) { + $this->active = $lang; + break; + } + } + + } + } + } + + return $uri; + } + + /** + * Get's a URL prefix based on configuration + * + * @param null $lang + * @return string + */ + public function getLanguageURLPrefix($lang = null) + { + // if active lang is not passed in, use current active + if (!$lang) { + $lang = $this->getLanguage(); + } + + return $this->isIncludeDefaultLanguage($lang) ? '/' . $lang : ''; + } + + /** + * Test to see if language is default and language should be included in the URL + * + * @param null $lang + * @return bool + */ + public function isIncludeDefaultLanguage($lang = null) + { + // if active lang is not passed in, use current active + if (!$lang) { + $lang = $this->getLanguage(); + } + + if ($this->default == $lang && $this->config->get('system.languages.include_default_lang') === false) { + return false; + } else { + return true; + } + } + + /** + * Simple getter to tell if a language was found in the URL + * + * @return bool + */ + public function isLanguageInUrl() + { + return (bool) $this->lang_in_url; + } + + + /** + * Gets an array of valid extensions with active first, then fallback extensions + * + * @return array + */ + public function getFallbackPageExtensions($file_ext = null) + { + if (empty($this->page_extensions)) { + if (empty($file_ext)) { + $file_ext = CONTENT_EXT; + } + + if ($this->enabled()) { + $valid_lang_extensions = []; + foreach ($this->languages as $lang) { + $valid_lang_extensions[] = '.' . $lang . $file_ext; + } + + if ($this->active) { + $active_extension = '.' . $this->active . $file_ext; + $key = array_search($active_extension, $valid_lang_extensions); + unset($valid_lang_extensions[$key]); + array_unshift($valid_lang_extensions, $active_extension); + } + + $this->page_extensions = array_merge($valid_lang_extensions, (array)$file_ext); + } else { + $this->page_extensions = (array)$file_ext; + } + } + + return $this->page_extensions; + } + + /** + * Gets an array of languages with active first, then fallback languages + * + * @return array + */ + public function getFallbackLanguages() + { + if (empty($this->fallback_languages)) { + if ($this->enabled()) { + $fallback_languages = $this->languages; + + if ($this->active) { + $active_extension = $this->active; + $key = array_search($active_extension, $fallback_languages); + unset($fallback_languages[$key]); + array_unshift($fallback_languages, $active_extension); + } + $this->fallback_languages = $fallback_languages; + } + // always add english in case a translation doesn't exist + $this->fallback_languages[] = 'en'; + } + + return $this->fallback_languages; + } + + /** + * Ensures the language is valid and supported + * + * @param $lang + * + * @return bool + */ + public function validate($lang) + { + if (in_array($lang, $this->languages)) { + return true; + } + + return false; + } + + /** + * Translate a key and possibly arguments into a string using current lang and fallbacks + * + * @param $args first argument is the lookup key value + * other arguments can be passed and replaced in the translation with sprintf syntax + * @param Array $languages + * @param bool $array_support + * @param bool $html_out + * + * @return string + */ + public function translate($args, Array $languages = null, $array_support = false, $html_out = false) + { + if (is_array($args)) { + $lookup = array_shift($args); + } else { + $lookup = $args; + $args = []; + } + + + if ($this->config->get('system.languages.translations', true)) { + if ($this->enabled() && $lookup) { + if (empty($languages)) { + if ($this->config->get('system.languages.translations_fallback', true)) { + $languages = $this->getFallbackLanguages(); + } else { + $languages = (array)$this->getDefault(); + } + } + } else { + $languages = ['en']; + } + + foreach ((array)$languages as $lang) { + $translation = $this->getTranslation($lang, $lookup, $array_support); + + if ($translation) { + if (count($args) >= 1) { + return vsprintf($translation, $args); + } else { + return $translation; + } + } + } + } + + if ($html_out) { + return '' . $lookup . ''; + } else { + return $lookup; + } + } + + /** + * Translate Array + * + * @param $key + * @param $index + * @param null $languages + * @param bool $html_out + * + * @return string + */ + public function translateArray($key, $index, $languages = null, $html_out = false) + { + if ($this->config->get('system.languages.translations', true)) { + if ($this->enabled() && $key) { + if (empty($languages)) { + if ($this->config->get('system.languages.translations_fallback', true)) { + $languages = $this->getFallbackLanguages(); + } else { + $languages = (array)$this->getDefault(); + } + } + } else { + $languages = ['en']; + } + + foreach ((array)$languages as $lang) { + $translation_array = (array)$this->config->getLanguages()->get($lang . '.' . $key, null); + if ($translation_array && array_key_exists($index, $translation_array)) { + return $translation_array[$index]; + } + } + } + + if ($html_out) { + return '' . $key . '[' . $index . ']'; + } else { + return $key . '[' . $index . ']'; + } + } + + /** + * Lookup the translation text for a given lang and key + * + * @param $lang lang code + * @param $key key to lookup with + * @param bool $array_support + * + * @return string + */ + public function getTranslation($lang, $key, $array_support = false) + { + $translation = $this->config->getLanguages()->get($lang . '.' . $key, null); + if (!$array_support && is_array($translation)) { + return (string)array_shift($translation); + } + + return $translation; + } + + public function getBrowserLanguages($accept_langs = []) + { + if (empty($this->http_accept_language)) { + if (empty($accept_langs) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + $accept_langs = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + } else { + return $accept_langs; + } + + foreach (explode(',', $accept_langs) as $k => $pref) { + // split $pref again by ';q=' + // and decorate the language entries by inverted position + if (false !== ($i = strpos($pref, ';q='))) { + $langs[substr($pref, 0, $i)] = array((float)substr($pref, $i + 3), -$k); + } else { + $langs[$pref] = array(1, -$k); + } + } + arsort($langs); + + // no need to undecorate, because we're only interested in the keys + $this->http_accept_language = array_keys($langs); + } + return $this->http_accept_language; + } + +} diff --git a/system/src/Grav/Common/Language/LanguageCodes.php b/system/src/Grav/Common/Language/LanguageCodes.php new file mode 100644 index 0000000..2683c8b --- /dev/null +++ b/system/src/Grav/Common/Language/LanguageCodes.php @@ -0,0 +1,774 @@ + [ + "name" => "Abkhaz", + "nativeName" => "аҧÑуа" + ], + "aa" => [ + "name" => "Afar", + "nativeName" => "Afaraf" + ], + "af" => [ + "name" => "Afrikaans", + "nativeName" => "Afrikaans" + ], + "ak" => [ + "name" => "Akan", + "nativeName" => "Akan" + ], + "sq" => [ + "name" => "Albanian", + "nativeName" => "Shqip" + ], + "am" => [ + "name" => "Amharic", + "nativeName" => "አማርኛ" + ], + "ar" => [ + "name" => "Arabic", + "nativeName" => "العربية" + ], + "an" => [ + "name" => "Aragonese", + "nativeName" => "Aragonés" + ], + "hy" => [ + "name" => "Armenian", + "nativeName" => "Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶" + ], + "as" => [ + "name" => "Assamese", + "nativeName" => "অসমীয়া" + ], + "av" => [ + "name" => "Avaric", + "nativeName" => "авар мацӀ" + ], + "ae" => [ + "name" => "Avestan", + "nativeName" => "avesta" + ], + "ay" => [ + "name" => "Aymara", + "nativeName" => "aymar aru" + ], + "az" => [ + "name" => "Azerbaijani", + "nativeName" => "azÉ™rbaycan dili" + ], + "bm" => [ + "name" => "Bambara", + "nativeName" => "bamanankan" + ], + "ba" => [ + "name" => "Bashkir", + "nativeName" => "башҡорт теле" + ], + "eu" => [ + "name" => "Basque", + "nativeName" => "euskara" + ], + "be" => [ + "name" => "Belarusian", + "nativeName" => "БеларуÑкаÑ" + ], + "bn" => [ + "name" => "Bengali", + "nativeName" => "বাংলা" + ], + "bh" => [ + "name" => "Bihari", + "nativeName" => "भोजपà¥à¤°à¥€" + ], + "bi" => [ + "name" => "Bislama", + "nativeName" => "Bislama" + ], + "bs" => [ + "name" => "Bosnian", + "nativeName" => "bosanski jezik" + ], + "br" => [ + "name" => "Breton", + "nativeName" => "brezhoneg" + ], + "bg" => [ + "name" => "Bulgarian", + "nativeName" => "българÑки език" + ], + "my" => [ + "name" => "Burmese", + "nativeName" => "ဗမာစာ" + ], + "ca" => [ + "name" => "Catalan", + "nativeName" => "Català" + ], + "ch" => [ + "name" => "Chamorro", + "nativeName" => "Chamoru" + ], + "ce" => [ + "name" => "Chechen", + "nativeName" => "нохчийн мотт" + ], + "ny" => [ + "name" => "Chichewa", + "nativeName" => "chiCheŵa" + ], + "zh" => [ + "name" => "Chinese", + "nativeName" => "中文" + ], + "cv" => [ + "name" => "Chuvash", + "nativeName" => "чӑваш чӗлхи" + ], + "kw" => [ + "name" => "Cornish", + "nativeName" => "Kernewek" + ], + "co" => [ + "name" => "Corsican", + "nativeName" => "corsu" + ], + "cr" => [ + "name" => "Cree", + "nativeName" => "á“€á¦áƒá”­ááá£" + ], + "hr" => [ + "name" => "Croatian", + "nativeName" => "hrvatski" + ], + "cs" => [ + "name" => "Czech", + "nativeName" => "Äesky" + ], + "da" => [ + "name" => "Danish", + "nativeName" => "dansk" + ], + "dv" => [ + "name" => "Divehi", + "nativeName" => "Þ‹Þ¨ÞˆÞ¬Þ€Þ¨" + ], + "nl" => [ + "name" => "Dutch", + "nativeName" => "Nederlands" + ], + "en" => [ + "name" => "English", + "nativeName" => "English" + ], + "eo" => [ + "name" => "Esperanto", + "nativeName" => "Esperanto" + ], + "et" => [ + "name" => "Estonian", + "nativeName" => "eesti" + ], + "ee" => [ + "name" => "Ewe", + "nativeName" => "EÊ‹egbe" + ], + "fo" => [ + "name" => "Faroese", + "nativeName" => "føroyskt" + ], + "fj" => [ + "name" => "Fijian", + "nativeName" => "vosa Vakaviti" + ], + "fi" => [ + "name" => "Finnish", + "nativeName" => "suomi" + ], + "fr" => [ + "name" => "French", + "nativeName" => "français" + ], + "ff" => [ + "name" => "Fula", + "nativeName" => "Fulfulde" + ], + "gl" => [ + "name" => "Galician", + "nativeName" => "Galego" + ], + "ka" => [ + "name" => "Georgian", + "nativeName" => "ქáƒáƒ áƒ—ული" + ], + "de" => [ + "name" => "German", + "nativeName" => "Deutsch" + ], + "el" => [ + "name" => "Greek", + "nativeName" => "Ελληνικά" + ], + "gn" => [ + "name" => "Guaraní", + "nativeName" => "Avañeẽ" + ], + "gu" => [ + "name" => "Gujarati", + "nativeName" => "ગà«àªœàª°àª¾àª¤à«€" + ], + "ht" => [ + "name" => "Haitian", + "nativeName" => "Kreyòl ayisyen" + ], + "ha" => [ + "name" => "Hausa", + "nativeName" => "Ù‡ÙŽÙˆÙØ³ÙŽ" + ], + "he" => [ + "name" => "Hebrew", + "nativeName" => "עברית" + ], + "hz" => [ + "name" => "Herero", + "nativeName" => "Otjiherero" + ], + "hi" => [ + "name" => "Hindi", + "nativeName" => "हिनà¥à¤¦à¥€" + ], + "ho" => [ + "name" => "Hiri Motu", + "nativeName" => "Hiri Motu" + ], + "hu" => [ + "name" => "Hungarian", + "nativeName" => "Magyar" + ], + "ia" => [ + "name" => "Interlingua", + "nativeName" => "Interlingua" + ], + "id" => [ + "name" => "Indonesian", + "nativeName" => "Bahasa Indonesia" + ], + "ie" => [ + "name" => "Interlingue", + "nativeName" => "Interlingue" + ], + "ga" => [ + "name" => "Irish", + "nativeName" => "Gaeilge" + ], + "ig" => [ + "name" => "Igbo", + "nativeName" => "Asụsụ Igbo" + ], + "ik" => [ + "name" => "Inupiaq", + "nativeName" => "Iñupiaq" + ], + "io" => [ + "name" => "Ido", + "nativeName" => "Ido" + ], + "is" => [ + "name" => "Icelandic", + "nativeName" => "Ãslenska" + ], + "it" => [ + "name" => "Italian", + "nativeName" => "Italiano" + ], + "iu" => [ + "name" => "Inuktitut", + "nativeName" => "áƒá“„ᒃᑎá‘ᑦ" + ], + "ja" => [ + "name" => "Japanese", + "nativeName" => "日本語" + ], + "jv" => [ + "name" => "Javanese", + "nativeName" => "basa Jawa" + ], + "kl" => [ + "name" => "Kalaallisut", + "nativeName" => "kalaallisut" + ], + "kn" => [ + "name" => "Kannada", + "nativeName" => "ಕನà³à²¨à²¡" + ], + "kr" => [ + "name" => "Kanuri", + "nativeName" => "Kanuri" + ], + "ks" => [ + "name" => "Kashmiri", + "nativeName" => "कशà¥à¤®à¥€à¤°à¥€" + ], + "kk" => [ + "name" => "Kazakh", + "nativeName" => "Қазақ тілі" + ], + "km" => [ + "name" => "Khmer", + "nativeName" => "ភាសាážáŸ’មែរ" + ], + "ki" => [ + "name" => "Kikuyu", + "nativeName" => "GÄ©kÅ©yÅ©" + ], + "rw" => [ + "name" => "Kinyarwanda", + "nativeName" => "Ikinyarwanda" + ], + "ky" => [ + "name" => "Kirghiz", + "nativeName" => "кыргыз тили" + ], + "kv" => [ + "name" => "Komi", + "nativeName" => "коми кыв" + ], + "kg" => [ + "name" => "Kongo", + "nativeName" => "KiKongo" + ], + "ko" => [ + "name" => "Korean", + "nativeName" => "한국어" + ], + "ku" => [ + "name" => "Kurdish", + "nativeName" => "كوردی‎" + ], + "kj" => [ + "name" => "Kwanyama", + "nativeName" => "Kuanyama" + ], + "la" => [ + "name" => "Latin", + "nativeName" => "latine" + ], + "lb" => [ + "name" => "Luxembourgish", + "nativeName" => "Lëtzebuergesch" + ], + "lg" => [ + "name" => "Luganda", + "nativeName" => "Luganda" + ], + "li" => [ + "name" => "Limburgish", + "nativeName" => "Limburgs" + ], + "ln" => [ + "name" => "Lingala", + "nativeName" => "Lingála" + ], + "lo" => [ + "name" => "Lao", + "nativeName" => "ພາສາລາວ" + ], + "lt" => [ + "name" => "Lithuanian", + "nativeName" => "lietuvių kalba" + ], + "lu" => [ + "name" => "Luba-Katanga", + "nativeName" => "Luba-Katanga" + ], + "lv" => [ + "name" => "Latvian", + "nativeName" => "latvieÅ¡u valoda" + ], + "gv" => [ + "name" => "Manx", + "nativeName" => "Gaelg" + ], + "mk" => [ + "name" => "Macedonian", + "nativeName" => "македонÑки јазик" + ], + "mg" => [ + "name" => "Malagasy", + "nativeName" => "Malagasy fiteny" + ], + "ms" => [ + "name" => "Malay", + "nativeName" => "بهاس ملايو‎" + ], + "ml" => [ + "name" => "Malayalam", + "nativeName" => "മലയാളം" + ], + "mt" => [ + "name" => "Maltese", + "nativeName" => "Malti" + ], + "mi" => [ + "name" => "MÄori", + "nativeName" => "te reo MÄori" + ], + "mr" => [ + "name" => "Marathi", + "nativeName" => "मराठी" + ], + "mh" => [ + "name" => "Marshallese", + "nativeName" => "Kajin M̧ajeļ" + ], + "mn" => [ + "name" => "Mongolian", + "nativeName" => "монгол" + ], + "na" => [ + "name" => "Nauru", + "nativeName" => "EkakairÅ© Naoero" + ], + "nv" => [ + "name" => "Navajo", + "nativeName" => "Diné bizaad" + ], + "nb" => [ + "name" => "Norwegian BokmÃ¥l", + "nativeName" => "Norsk bokmÃ¥l" + ], + "nd" => [ + "name" => "North Ndebele", + "nativeName" => "isiNdebele" + ], + "ne" => [ + "name" => "Nepali", + "nativeName" => "नेपाली" + ], + "ng" => [ + "name" => "Ndonga", + "nativeName" => "Owambo" + ], + "nn" => [ + "name" => "Norwegian Nynorsk", + "nativeName" => "Norsk nynorsk" + ], + "no" => [ + "name" => "Norwegian", + "nativeName" => "Norsk" + ], + "ii" => [ + "name" => "Nuosu", + "nativeName" => "ꆈꌠ꒿ Nuosuhxop" + ], + "nr" => [ + "name" => "South Ndebele", + "nativeName" => "isiNdebele" + ], + "oc" => [ + "name" => "Occitan", + "nativeName" => "Occitan" + ], + "oj" => [ + "name" => "Ojibwe, Ojibwa", + "nativeName" => "áŠá“‚ᔑᓈá¯á’§áŽá“" + ], + "cu" => [ + "name" => "Church Slavic", + "nativeName" => "ѩзыкъ ÑловѣньÑкъ" + ], + "om" => [ + "name" => "Oromo", + "nativeName" => "Afaan Oromoo" + ], + "or" => [ + "name" => "Oriya", + "nativeName" => "ଓଡ଼ିଆ" + ], + "os" => [ + "name" => "Ossetian", + "nativeName" => "ирон æвзаг" + ], + "pa" => [ + "name" => "Panjabi", + "nativeName" => "ਪੰਜਾਬੀ" + ], + "pi" => [ + "name" => "PÄli", + "nativeName" => "पाऴि" + ], + "fa" => [ + "name" => "Persian", + "nativeName" => "ÙØ§Ø±Ø³ÛŒ" + ], + "pl" => [ + "name" => "Polish", + "nativeName" => "polski" + ], + "ps" => [ + "name" => "Pashto", + "nativeName" => "پښتو" + ], + "pt" => [ + "name" => "Portuguese", + "nativeName" => "Português" + ], + "qu" => [ + "name" => "Quechua", + "nativeName" => "Runa Simi" + ], + "rm" => [ + "name" => "Romansh", + "nativeName" => "rumantsch grischun" + ], + "rn" => [ + "name" => "Kirundi", + "nativeName" => "kiRundi" + ], + "ro" => [ + "name" => "Romanian", + "nativeName" => "română" + ], + "ru" => [ + "name" => "Russian", + "nativeName" => "РуÑÑкий" + ], + "sa" => [ + "name" => "Sanskrit", + "nativeName" => "संसà¥à¤•ृतमà¥" + ], + "sc" => [ + "name" => "Sardinian", + "nativeName" => "sardu" + ], + "sd" => [ + "name" => "Sindhi", + "nativeName" => "सिनà¥à¤§à¥€" + ], + "se" => [ + "name" => "Northern Sami", + "nativeName" => "Davvisámegiella" + ], + "sm" => [ + "name" => "Samoan", + "nativeName" => "gagana faa Samoa" + ], + "sg" => [ + "name" => "Sango", + "nativeName" => "yângâ tî sängö" + ], + "sr" => [ + "name" => "Serbian", + "nativeName" => "ÑрпÑки језик" + ], + "gd" => [ + "name" => "Scottish Gaelic", + "nativeName" => "Gàidhlig" + ], + "sn" => [ + "name" => "Shona", + "nativeName" => "chiShona" + ], + "si" => [ + "name" => "Sinhala", + "nativeName" => "සිංහල" + ], + "sk" => [ + "name" => "Slovak", + "nativeName" => "slovenÄina" + ], + "sl" => [ + "name" => "Slovene", + "nativeName" => "slovenÅ¡Äina" + ], + "so" => [ + "name" => "Somali", + "nativeName" => "Soomaaliga" + ], + "st" => [ + "name" => "Southern Sotho", + "nativeName" => "Sesotho" + ], + "es" => [ + "name" => "Spanish", + "nativeName" => "Español" + ], + "su" => [ + "name" => "Sundanese", + "nativeName" => "Basa Sunda" + ], + "sw" => [ + "name" => "Swahili", + "nativeName" => "Kiswahili" + ], + "ss" => [ + "name" => "Swati", + "nativeName" => "SiSwati" + ], + "sv" => [ + "name" => "Swedish", + "nativeName" => "svenska" + ], + "ta" => [ + "name" => "Tamil", + "nativeName" => "தமிழà¯" + ], + "te" => [ + "name" => "Telugu", + "nativeName" => "తెలà±à°—à±" + ], + "tg" => [ + "name" => "Tajik", + "nativeName" => "тоҷикӣ" + ], + "th" => [ + "name" => "Thai", + "nativeName" => "ไทย" + ], + "ti" => [ + "name" => "Tigrinya", + "nativeName" => "ትáŒáˆ­áŠ›" + ], + "bo" => [ + "name" => "Tibetan", + "nativeName" => "བོད་ཡིག" + ], + "tk" => [ + "name" => "Turkmen", + "nativeName" => "Türkmen" + ], + "tl" => [ + "name" => "Tagalog", + "nativeName" => "Wikang Tagalog" + ], + "tn" => [ + "name" => "Tswana", + "nativeName" => "Setswana" + ], + "to" => [ + "name" => "Tonga", + "nativeName" => "faka Tonga" + ], + "tr" => [ + "name" => "Turkish", + "nativeName" => "Türkçe" + ], + "ts" => [ + "name" => "Tsonga", + "nativeName" => "Xitsonga" + ], + "tt" => [ + "name" => "Tatar", + "nativeName" => "татарча" + ], + "tw" => [ + "name" => "Twi", + "nativeName" => "Twi" + ], + "ty" => [ + "name" => "Tahitian", + "nativeName" => "Reo Tahiti" + ], + "ug" => [ + "name" => "Uighur", + "nativeName" => "UyÆ£urqÉ™" + ], + "uk" => [ + "name" => "Ukrainian", + "nativeName" => "українÑька" + ], + "ur" => [ + "name" => "Urdu", + "nativeName" => "اردو" + ], + "uz" => [ + "name" => "Uzbek", + "nativeName" => "zbek" + ], + "ve" => [ + "name" => "Venda", + "nativeName" => "Tshivenḓa" + ], + "vi" => [ + "name" => "Vietnamese", + "nativeName" => "Tiếng Việt" + ], + "vo" => [ + "name" => "Volapük", + "nativeName" => "Volapük" + ], + "wa" => [ + "name" => "Walloon", + "nativeName" => "Walon" + ], + "cy" => [ + "name" => "Welsh", + "nativeName" => "Cymraeg" + ], + "wo" => [ + "name" => "Wolof", + "nativeName" => "Wollof" + ], + "fy" => [ + "name" => "Western Frisian", + "nativeName" => "Frysk" + ], + "xh" => [ + "name" => "Xhosa", + "nativeName" => "isiXhosa" + ], + "yi" => [ + "name" => "Yiddish", + "nativeName" => "ייִדיש" + ], + "yo" => [ + "name" => "Yoruba", + "nativeName" => "Yorùbá" + ], + "za" => [ + "name" => "Zhuang", + "nativeName" => "Saɯ cueŋƅ" + ] + ]; + + public static function getName($code) + { + return static::get($code, 'name'); + } + + public static function getNativeName($code) + { + if (strlen($code) == 2) { + return static::get($code, 'nativeName'); + } else { + return static::get(substr($code, 0, 2), 'nativeName') . ' (' . substr($code, -2) . ')'; + } + } + + public static function getNames(array $keys) + { + $results = []; + foreach ($keys as $key) { + if (isset(static::$codes[$key])) { + $results[$key] = static::$codes[$key]; + } + + } + return $results; + } + + protected static function get($code, $type) + { + if (isset(static::$codes[$code][$type])) { + return static::$codes[$code][$type]; + } else { + return false; + } + } +} diff --git a/system/src/Grav/Common/Markdown/Parsedown.php b/system/src/Grav/Common/Markdown/Parsedown.php new file mode 100644 index 0000000..f453a54 --- /dev/null +++ b/system/src/Grav/Common/Markdown/Parsedown.php @@ -0,0 +1,13 @@ +init($page, $defaults); + } + +} diff --git a/system/src/Grav/Common/Markdown/ParsedownExtra.php b/system/src/Grav/Common/Markdown/ParsedownExtra.php new file mode 100644 index 0000000..526e5f9 --- /dev/null +++ b/system/src/Grav/Common/Markdown/ParsedownExtra.php @@ -0,0 +1,13 @@ +init($page, $defaults); + } +} diff --git a/system/src/Grav/Common/Markdown/ParsedownGravTrait.php b/system/src/Grav/Common/Markdown/ParsedownGravTrait.php new file mode 100644 index 0000000..25da6ff --- /dev/null +++ b/system/src/Grav/Common/Markdown/ParsedownGravTrait.php @@ -0,0 +1,220 @@ +page = $page; + $this->pages = self::getGrav()['pages']; + $this->BlockTypes['{'] [] = "TwigTag"; + $this->base_url = rtrim(self::getGrav()['base_url'] . self::getGrav()['pages']->base(), '/'); + $this->pages_dir = self::getGrav()['locator']->findResource('page://'); + $this->special_chars = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); + + if ($defaults === null) { + $defaults = self::getGrav()['config']->get('system.pages.markdown'); + } + + $this->setBreaksEnabled($defaults['auto_line_breaks']); + $this->setUrlsLinked($defaults['auto_url_links']); + $this->setMarkupEscaped($defaults['escape_markup']); + $this->setSpecialChars($defaults['special_chars']); + } + + /** + * Make the element function publicly accessible, Medium uses this to render from Twig + * + * @param array $Element + * @return string markup + */ + public function elementToHtml(array $Element) + { + return $this->element($Element); + } + + /** + * Setter for special chars + * + * @param $special_chars + * + * @return $this + */ + function setSpecialChars($special_chars) + { + $this->special_chars = $special_chars; + + return $this; + } + + /** + * Ensure Twig tags are treated as block level items with no

tags + */ + protected function blockTwigTag($Line) + { + if (preg_match('/[{%|{{|{#].*[#}|}}|%}]/', $Line['body'], $matches)) { + $Block = array( + 'markup' => $Line['body'], + ); + return $Block; + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if ($Excerpt['text'][0] === '&' && ! preg_match('/^&#?\w+;/', $Excerpt['text'])) { + return array( + 'markup' => '&', + 'extent' => 1, + ); + } + + if (isset($this->special_chars[$Excerpt['text'][0]])) { + return array( + 'markup' => '&'.$this->special_chars[$Excerpt['text'][0]].';', + 'extent' => 1, + ); + } + } + + protected function inlineImage($excerpt) + { + if (preg_match($this->twig_link_regex, $excerpt['text'], $matches)) { + $excerpt['text'] = str_replace($matches[1], '/', $excerpt['text']); + $excerpt = parent::inlineImage($excerpt); + $excerpt['element']['attributes']['src'] = $matches[1]; + $excerpt['extent'] = $excerpt['extent'] + strlen($matches[1]) - 1; + return $excerpt; + } else { + $excerpt['type'] = 'image'; + $excerpt = parent::inlineImage($excerpt); + } + + // Some stuff we will need + $actions = array(); + $media = null; + + // if this is an image + if (isset($excerpt['element']['attributes']['src'])) { + $alt = $excerpt['element']['attributes']['alt'] ?: ''; + $title = $excerpt['element']['attributes']['title'] ?: ''; + $class = isset($excerpt['element']['attributes']['class']) ? $excerpt['element']['attributes']['class'] : ''; + + //get the url and parse it + $url = parse_url(htmlspecialchars_decode($excerpt['element']['attributes']['src'])); + + // if there is no host set but there is a path, the file is local + if (!isset($url['host']) && isset($url['path'])) { + $path_parts = pathinfo($url['path']); + + // get the local path to page media if possible + if ($path_parts['dirname'] == $this->page->url(false, false, false)) { + $url['path'] = urldecode($path_parts['basename']); + // get the media objects for this page + $media = $this->page->media(); + } else { + // see if this is an external page to this one + $page_route = str_replace($this->base_url, '', $path_parts['dirname']); + + $ext_page = $this->pages->dispatch($page_route, true); + if ($ext_page) { + $media = $ext_page->media(); + $url['path'] = urldecode($path_parts['basename']); + } + } + + // if there is a media file that matches the path referenced.. + if ($media && isset($media->all()[$url['path']])) { + // get the medium object + $medium = $media->all()[$url['path']]; + + // if there is a query, then parse it and build action calls + if (isset($url['query'])) { + $actions = array_reduce(explode('&', $url['query']), function ($carry, $item) { + $parts = explode('=', $item, 2); + $value = isset($parts[1]) ? $parts[1] : null; + $carry[] = [ 'method' => $parts[0], 'params' => $value ]; + + return $carry; + }, []); + } + + // loop through actions for the image and call them + foreach ($actions as $action) { + $medium = call_user_func_array(array($medium, $action['method']), explode(',', urldecode($action['params']))); + } + + if (isset($url['fragment'])) { + $medium->urlHash($url['fragment']); + } + + $excerpt['element'] = $medium->parseDownElement($title, $alt, $class); + + } else { + // not a current page media file, see if it needs converting to relative + $excerpt['element']['attributes']['src'] = Uri::buildUrl($url); + } + } + } + + return $excerpt; + } + + protected function inlineLink($excerpt) + { + if (isset($excerpt['type'])) { + $type = $excerpt['type']; + } else { + $type = 'link'; + } + + // do some trickery to get around Parsedown requirement for valid URL if its Twig in there + if (preg_match($this->twig_link_regex, $excerpt['text'], $matches)) { + $excerpt['text'] = str_replace($matches[1], '/', $excerpt['text']); + $excerpt = parent::inlineLink($excerpt); + $excerpt['element']['attributes']['href'] = $matches[1]; + $excerpt['extent'] = $excerpt['extent'] + strlen($matches[1]) - 1; + return $excerpt; + } else { + $excerpt = parent::inlineLink($excerpt); + } + + // if this is a link + if (isset($excerpt['element']['attributes']['href'])) { + $url = parse_url(htmlspecialchars_decode($excerpt['element']['attributes']['href'])); + + // if there is no scheme, the file is local + if (!isset($url['scheme']) && (count($url) > 0)) { + // convert the URl is required + $excerpt['element']['attributes']['href'] = Uri::convertUrl($this->page, Uri::buildUrl($url), $type); + } + } + + return $excerpt; + } +} diff --git a/system/src/Grav/Common/Page/Collection.php b/system/src/Grav/Common/Page/Collection.php new file mode 100644 index 0000000..b5836bd --- /dev/null +++ b/system/src/Grav/Common/Page/Collection.php @@ -0,0 +1,458 @@ +params = $params; + $this->pages = $pages ? $pages : Grav::instance()->offsetGet('pages'); + } + + public function params() + { + return $this->params; + } + + /** + * Add a single page to a collection + * + * @param Page $page + * @return $this + */ + public function addPage(Page $page) + { + $this->items[$page->path()] = ['slug' => $page->slug()]; + return $this; + } + + /** + * + * Create a copy of this collection + * + * @return static + */ + public function copy() + { + return new static($this->items, $this->params, $this->pages); + } + + /** + * Set parameters to the Collection + * + * @param array $params + * @return $this + */ + public function setParams(array $params) + { + $this->params = array_merge($this->params, $params); + return $this; + } + + /** + * Returns current page. + * + * @return Page + */ + public function current() + { + $current = parent::key(); + return $this->pages->get($current); + } + + /** + * Returns current slug. + * + * @return mixed + */ + public function key() + { + $current = parent::current(); + return $current['slug']; + } + + /** + * Returns the value at specified offset. + * + * @param mixed $offset The offset to retrieve. + * @return mixed Can return all value types. + */ + public function offsetGet($offset) + { + return !empty($this->items[$offset]) ? $this->pages->get($offset) : null; + } + + /** + * Remove item from the list. + * + * @param Page|string|null $key + * @return $this|void + * @throws \InvalidArgumentException + */ + public function remove($key = null) + { + if ($key instanceof Page) { + $key = $key->path(); + } elseif (is_null($key)) { + $key = key($this->items); + } + if (!is_string($key)) { + throw new \InvalidArgumentException('Invalid argument $key.'); + } + + parent::remove($key); + return $this; + } + + /** + * Reorder collection. + * + * @param string $by + * @param string $dir + * @param array $manual + * @return $this + */ + public function order($by, $dir = 'asc', $manual = null) + { + $this->items = $this->pages->sortCollection($this, $by, $dir, $manual); + + return $this; + } + + /** + * Check to see if this item is the first in the collection. + * + * @param string $path + * @return boolean True if item is first. + */ + public function isFirst($path) + { + if ($this->items && $path == array_keys($this->items)[0]) { + return true; + } else { + return false; + } + } + + /** + * Check to see if this item is the last in the collection. + * + * @param string $path + * @return boolean True if item is last. + */ + public function isLast($path) + { + if ($this->items && $path == array_keys($this->items)[count($this->items)-1]) { + return true; + } else { + return false; + } + } + + /** + * Gets the previous sibling based on current position. + * + * @param string $path + * @return Page The previous item. + */ + public function prevSibling($path) + { + return $this->adjacentSibling($path, -1); + } + + /** + * Gets the next sibling based on current position. + * + * @param string $path + * @return Page The next item. + */ + public function nextSibling($path) + { + return $this->adjacentSibling($path, 1); + } + + /** + * Returns the adjacent sibling based on a direction. + * + * @param string $path + * @param integer $direction either -1 or +1 + * @return Page The sibling item. + */ + public function adjacentSibling($path, $direction = 1) + { + $values = array_keys($this->items); + $keys = array_flip($values); + + if (array_key_exists($path, $keys)) { + $index = $keys[$path] - $direction; + + return isset($values[$index]) ? $this->offsetGet($values[$index]) : $this; + } + return $this; + + } + + /** + * Returns the item in the current position. + * + * @param string $path the path the item + * @return Page Item in the array the the current position. + */ + public function currentPosition($path) + { + return array_search($path, array_keys($this->items)); + } + + /** + * Returns the items between a set of date ranges of either the page date field (default) or + * an arbitrary datetime page field where end date is optional + * Dates can be passed in as text that strtotime() can process + * http://php.net/manual/en/function.strtotime.php + * + * @param $startDate + * @param bool $endDate + * @param $field + * + * @return $this + * @throws \Exception + */ + public function dateRange($startDate, $endDate = false, $field = false) + { + $start = Utils::date2timestamp($startDate); + $end = $endDate ? Utils::date2timestamp($endDate) : strtotime("now +1000 years"); + + $date_range = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null) { + $date = $field ? strtotime($page->value($field)) : $page->date(); + + if ($date > $start && $date < $end) { + $date_range[$path] = $slug; + } + } + } + $this->items = $date_range; + return $this; + } + + /** + * Creates new collection with only visible pages + * + * @return Collection The collection with only visible pages + */ + public function visible() + { + $visible = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && $page->visible()) { + $visible[$path] = $slug; + } + } + $this->items = $visible; + return $this; + } + + /** + * Creates new collection with only non-visible pages + * + * @return Collection The collection with only non-visible pages + */ + public function nonVisible() + { + $visible = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && !$page->visible()) { + $visible[$path] = $slug; + } + } + $this->items = $visible; + return $this; + } + + /** + * Creates new collection with only modular pages + * + * @return Collection The collection with only modular pages + */ + public function modular() + { + $modular = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && $page->modular()) { + $modular[$path] = $slug; + } + } + $this->items = $modular; + return $this; + } + + /** + * Creates new collection with only non-modular pages + * + * @return Collection The collection with only non-modular pages + */ + public function nonModular() + { + $modular = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && !$page->modular()) { + $modular[$path] = $slug; + } + } + $this->items = $modular; + return $this; + } + + /** + * Creates new collection with only published pages + * + * @return Collection The collection with only published pages + */ + public function published() + { + $published = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && $page->published()) { + $published[$path] = $slug; + } + } + $this->items = $published; + return $this; + } + + /** + * Creates new collection with only non-published pages + * + * @return Collection The collection with only non-published pages + */ + public function nonPublished() + { + $published = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && !$page->published()) { + $published[$path] = $slug; + } + } + $this->items = $published; + return $this; + } + + /** + * Creates new collection with only routable pages + * + * @return Collection The collection with only routable pages + */ + public function routable() + { + $routable = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + + if ($page !== null && $page->routable()) { + $routable[$path] = $slug; + } + } + + $this->items = $routable; + return $this; + } + + /** + * Creates new collection with only non-routable pages + * + * @return Collection The collection with only non-routable pages + */ + public function nonRoutable() + { + $routable = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && !$page->routable()) { + $routable[$path] = $slug; + } + } + $this->items = $routable; + return $this; + } + + /** + * Creates new collection with only pages of the specified type + * + * @return Collection The collection + */ + public function ofType($type) + { + $items = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && $page->template() == $type) { + $items[$path] = $slug; + } + } + + $this->items = $items; + return $this; + } + + /** + * Creates new collection with only pages of one of the specified types + * + * @return Collection The collection + */ + public function ofOneOfTheseTypes($types) + { + $items = []; + + foreach ($this->items as $path => $slug) { + $page = $this->pages->get($path); + if ($page !== null && in_array($page->template(), $types)) { + $items[$path] = $slug; + } + } + + $this->items = $items; + return $this; + } + + + +} diff --git a/system/src/Grav/Common/Page/Header.php b/system/src/Grav/Common/Page/Header.php new file mode 100644 index 0000000..4be8262 --- /dev/null +++ b/system/src/Grav/Common/Page/Header.php @@ -0,0 +1,11 @@ +path = $path; + + $iterator = new \FilesystemIterator($path, \FilesystemIterator::UNIX_PATHS | \FilesystemIterator::SKIP_DOTS); + + $media = []; + + /** @var \DirectoryIterator $info */ + foreach ($iterator as $path => $info) { + // Ignore folders and Markdown files. + if (!$info->isFile() || $info->getExtension() == 'md' || $info->getBasename() === '.DS_Store') { + continue; + } + + // Find out what type we're dealing with + list($basename, $ext, $type, $extra) = $this->getFileParts($info->getFilename()); + + $media["{$basename}.{$ext}"] = isset($media["{$basename}.{$ext}"]) ? $media["{$basename}.{$ext}"] : []; + + if ($type === 'alternative') { + $media["{$basename}.{$ext}"][$type] = isset($media["{$basename}.{$ext}"][$type]) ? $media["{$basename}.{$ext}"][$type] : []; + $media["{$basename}.{$ext}"][$type][$extra] = [ 'file' => $path, 'size' => $info->getSize() ]; + } else { + $media["{$basename}.{$ext}"][$type] = [ 'file' => $path, 'size' => $info->getSize() ]; + } + } + + foreach ($media as $name => $types) { + // First prepare the alternatives in case there is no base medium + if (!empty($types['alternative'])) { + foreach ($types['alternative'] as $ratio => &$alt) { + $alt['file'] = MediumFactory::fromFile($alt['file']); + + if (!$alt['file']) { + unset($types['alternative'][$ratio]); + } else { + $alt['file']->set('size', $alt['size']); + } + } + } + + // Create the base medium + if (!empty($types['base'])) { + $medium = MediumFactory::fromFile($types['base']['file']); + $medium && $medium->set('size', $types['base']['size']); + } else if (!empty($types['alternative'])) { + $altMedium = reset($types['alternative']); + $ratio = key($types['alternative']); + + $altMedium = $altMedium['file']; + + $medium = MediumFactory::scaledFromMedium($altMedium, $ratio, 1)['file']; + } + + if (!$medium) { + continue; + } + + if (!empty($types['meta'])) { + $medium->addMetaFile($types['meta']['file']); + } + + if (!empty($types['thumb'])) { + // We will not turn it into medium yet because user might never request the thumbnail + // not wasting any resources on that, maybe we should do this for medium in general? + $medium->set('thumbnails.page', $types['thumb']['file']); + } + + // Build missing alternatives + if (!empty($types['alternative'])) { + $alternatives = $types['alternative']; + + $max = max(array_keys($alternatives)); + + for ($i=2; $i < $max; $i++) { + if (isset($alternatives[$i])) { + continue; + } + + $types['alternative'][$i] = MediumFactory::scaledFromMedium($alternatives[$max]['file'], $max, $i); + } + + foreach ($types['alternative'] as $ratio => $altMedium) { + $medium->addAlternative($ratio, $altMedium['file']); + } + } + + $this->add($name, $medium); + } + } + + /** + * Get medium by filename. + * + * @param string $filename + * @return Medium|null + */ + public function get($filename) + { + return isset($this->instances[$filename]) ? $this->instances[$filename] : null; + } + + /** + * Get a list of all media. + * + * @return array|Medium[] + */ + public function all() + { + ksort($this->instances, SORT_NATURAL | SORT_FLAG_CASE); + return $this->instances; + } + + /** + * Get a list of all image media. + * + * @return array|Medium[] + */ + public function images() + { + ksort($this->images, SORT_NATURAL | SORT_FLAG_CASE); + return $this->images; + } + + /** + * Get a list of all video media. + * + * @return array|Medium[] + */ + public function videos() + { + ksort($this->videos, SORT_NATURAL | SORT_FLAG_CASE); + return $this->videos; + } + + /** + * Get a list of all audio media. + * + * @return array|Medium[] + */ + public function audios() + { + ksort($this->audios, SORT_NATURAL | SORT_FLAG_CASE); + return $this->audios; + } + + /** + * Get a list of all file media. + * + * @return array|Medium[] + */ + public function files() + { + ksort($this->files, SORT_NATURAL | SORT_FLAG_CASE); + return $this->files; + } + + /** + * @internal + */ + protected function add($name, $file) + { + $this->instances[$name] = $file; + switch ($file->type) { + case 'image': + $this->images[$name] = $file; + break; + case 'video': + $this->videos[$name] = $file; + break; + case 'audio': + $this->audios[$name] = $file; + break; + default: + $this->files[$name] = $file; + } + } + + /** + * Get filename, extension and meta part. + * + * @param string $filename + * @return array + */ + protected function getFileParts($filename) + { + $fileParts = explode('.', $filename); + + $name = array_shift($fileParts); + $type = 'base'; + $extra = null; + + if (preg_match('/(.*)@(\d+)x\.(.*)$/', $filename, $matches)) { + $name = $matches[1]; + $extension = $matches[3]; + $extra = (int) $matches[2]; + $type = 'alternative'; + + if ($extra === 1) { + $type = 'base'; + $extra = null; + } + } else { + $extension = null; + while (($part = array_shift($fileParts)) !== null) { + if ($part != 'meta' && $part != 'thumb') { + if (isset($extension)) { + $name .= '.' . $extension; + } + $extension = $part; + } else { + $type = $part; + $extra = '.' . $part . '.' . implode('.', $fileParts); + break; + } + } + } + + return array($name, $extension, $type, $extra); + } +} diff --git a/system/src/Grav/Common/Page/Medium/AudioMedium.php b/system/src/Grav/Common/Page/Medium/AudioMedium.php new file mode 100644 index 0000000..0eaafd6 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/AudioMedium.php @@ -0,0 +1,45 @@ +url($reset); + + return [ + 'name' => 'audio', + 'text' => 'Your browser does not support the audio tag.', + 'attributes' => $attributes + ]; + } + + /** + * Reset medium. + * + * @return $this + */ + public function reset() + { + parent::reset(); + + $this->attributes['controls'] = true; + return $this; + } +} diff --git a/system/src/Grav/Common/Page/Medium/ImageFile.php b/system/src/Grav/Common/Page/Medium/ImageFile.php new file mode 100644 index 0000000..bb9ce59 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/ImageFile.php @@ -0,0 +1,84 @@ +guessType(); + } + + if (!count($this->operations) && $type == $this->guessType() && !$this->forceCache) { + return $this->getFilename($this->getFilePath()); + } + + // Computes the hash + $this->hash = $this->getHash($type, $quality); + + // Generates the cache file + $cacheFile = ''; + + if (!$this->prettyName || $this->prettyPrefix) { + $cacheFile .= $this->hash; + } + + if ($this->prettyPrefix) { + $cacheFile .= '-'; + } + + if ($this->prettyName) { + $cacheFile .= $this->prettyName; + } + + $cacheFile .= '.'.$type; + + // If the files does not exists, save it + $image = $this; + + // Target file should be younger than all the current image + // dependencies + $conditions = array( + 'younger-than' => $this->getDependencies() + ); + + // The generating function + $generate = function ($target) use ($image, $type, $quality) { + $result = $image->save($target, $type, $quality); + + if ($result != $target) { + throw new GenerationError($result); + } + + self::getGrav()->fireEvent('onImageMediumSaved', new Event(['image' => $target])); + }; + + // Asking the cache for the cacheFile + try { + $file = $this->cache->getOrCreateFile($cacheFile, $conditions, $generate, $actual); + } catch (GenerationError $e) { + $file = $e->getNewFile(); + } + + if ($actual) { + return $file; + } else { + return $this->getFilename($file); + } + } +} diff --git a/system/src/Grav/Common/Page/Medium/ImageMedium.php b/system/src/Grav/Common/Page/Medium/ImageMedium.php new file mode 100644 index 0000000..c38d8e8 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/ImageMedium.php @@ -0,0 +1,473 @@ + [ 0, 1 ], + 'forceResize' => [ 0, 1 ], + 'cropResize' => [ 0, 1 ], + 'crop' => [ 0, 1, 2, 3 ], + 'cropResize' => [ 0, 1 ], + 'zoomCrop' => [ 0, 1 ] + ]; + + /** + * @var array + */ + protected $derivatives = []; + + /** + * @var string + */ + protected $sizes = '100vw'; + + /** + * Construct. + * + * @param array $items + * @param Blueprint $blueprint + */ + public function __construct($items = [], Blueprint $blueprint = null) + { + parent::__construct($items, $blueprint); + + $config = self::$grav['config']; + + $image_info = getimagesize($this->get('filepath')); + $this->def('width', $image_info[0]); + $this->def('height', $image_info[1]); + $this->def('mime', $image_info['mime']); + $this->def('debug', $config->get('system.images.debug')); + + $this->set('thumbnails.media', $this->get('filepath')); + + $this->default_quality = $config->get('system.images.default_image_quality', 85); + + $this->reset(); + + if ($config->get('system.images.cache_all', false)) { + $this->cache(); + } + } + + /** + * Add meta file for the medium. + * + * @param $filepath + * @return $this + */ + public function addMetaFile($filepath) + { + parent::addMetaFile($filepath); + + // Apply filters in meta file + $this->reset(); + + return $this; + } + + /** + * Return PATH to image. + * + * @param bool $reset + * @return string path to image + */ + public function path($reset = true) + { + $output = $this->saveImage(); + + if ($reset) { + $this->reset(); + } + + return $output; + } + + /** + * Return URL to image. + * + * @param bool $reset + * @return string + */ + public function url($reset = true) + { + $output = preg_replace('|^' . GRAV_ROOT . '|', '', $this->saveImage()); + + if ($reset) { + $this->reset(); + } + + return self::$grav['base_url'] . $output . $this->querystring() . $this->urlHash(); + } + + /** + * Simply processes with no extra methods. Useful for triggering events. + * + * @return $this + */ + public function cache() + { + if (!$this->image) { + $this->image(); + } + return $this; + } + + + /** + * Return srcset string for this Medium and its alternatives. + * + * @param bool $reset + * @return string + */ + public function srcset($reset = true) + { + if (empty($this->alternatives) && empty($this->derivatives)) { + if ($reset) { + $this->reset(); + } + return ''; + } + + if (!empty($this->derivatives)) { + asort($this->derivatives); + + foreach ($this->derivatives as $url => $width) { + $srcset[] = $url . ' ' . $width . 'w'; + } + + $srcset[] = $this->url($reset) . ' ' . $this->get('width') . 'w'; + } + else { + $srcset = [ $this->url($reset) . ' ' . $this->get('width') . 'w' ]; + foreach ($this->alternatives as $ratio => $medium) { + $srcset[] = $medium->url($reset) . ' ' . $medium->get('width') . 'w'; + } + } + + return implode(', ', $srcset); + } + + /** + * Generate derivatives + * + * @param int $min_width + * @param int $max_width + * @param int $step + * @return $this + */ + public function derivatives($min_width, $max_width, $step = 200) { + $width = $min_width; + + // Do not upscale images. + if ($max_width > $this->get('width')) { + $max_width = $this->get('width'); + } + + while ($width <= $max_width) { + $ratio = $width / $this->get('width'); + $derivative = MediumFactory::scaledFromMedium($this, 1, $ratio); + if (is_array($derivative)) { + $this->addDerivative($derivative['file']); + } + $width += $step; + } + return $this; + } + + /** + * Add a derivative + * + * @param ImageMedium $image + */ + public function addDerivative(ImageMedium $image) { + $this->derivatives[$image->url()] = $image->get('width'); + } + + /** + * Parsedown element for source display mode + * + * @param array $attributes + * @param boolean $reset + * @return array + */ + public function sourceParsedownElement(array $attributes, $reset = true) + { + empty($attributes['src']) && $attributes['src'] = $this->url(false); + + $srcset = $this->srcset($reset); + if ($srcset) { + empty($attributes['srcset']) && $attributes['srcset'] = $srcset; + $attributes['sizes'] = $this->sizes(); + } + + return [ 'name' => 'img', 'attributes' => $attributes ]; + } + + /** + * Reset image. + * + * @return $this + */ + public function reset() + { + parent::reset(); + + if ($this->image) { + $this->image(); + $this->filter(); + } + + $this->format = 'guess'; + $this->quality = $this->default_quality; + + $this->debug_watermarked = false; + + return $this; + } + + /** + * Turn the current Medium into a Link + * + * @param boolean $reset + * @param array $attributes + * @return Link + */ + public function link($reset = true, array $attributes = []) + { + $attributes['href'] = $this->url(false); + $srcset = $this->srcset(false); + if ($srcset) { + $attributes['data-srcset'] = $srcset; + } + + return parent::link($reset, $attributes); + } + + /** + * Turn the current Medium into a Link with lightbox enabled + * + * @param int $width + * @param int $height + * @param boolean $reset + * @return Link + */ + public function lightbox($width = null, $height = null, $reset = true) + { + if ($this->mode !== 'source') { + $this->display('source'); + } + + if ($width && $height) { + $this->cropResize($width, $height); + } + + return parent::lightbox($width, $height, $reset); + } + + /** + * Sets the quality of the image + * + * @param int $quality 0-100 quality + * @return Medium + */ + public function quality($quality) + { + if (!$this->image) { + $this->image(); + } + + $this->quality = $quality; + return $this; + } + + /** + * Sets image output format. + * + * @param string $format + * @return $this + */ + public function format($format) + { + if (!$this->image) { + $this->image(); + } + + $this->format = $format; + return $this; + } + + /** + * Set or get sizes parameter for srcset media action + * + * @param string $sizes + * @return $this + */ + public function sizes($sizes = null) + { + + if ($sizes) { + $this->sizes = $sizes; + return $this; + } + + return empty($this->sizes) ? '100vw' : $this->sizes; + } + + /** + * Forward the call to the image processing method. + * + * @param string $method + * @param mixed $args + * @return $this|mixed + */ + public function __call($method, $args) + { + if ($method == 'cropZoom') { + $method = 'zoomCrop'; + } + + if (!in_array($method, self::$magic_actions)) { + return parent::__call($method, $args); + } + + // Always initialize image. + if (!$this->image) { + $this->image(); + } + + try { + call_user_func_array([$this->image, $method], $args); + + foreach ($this->alternatives as $ratio => $medium) { + $args_copy = $args; + + // regular image: resize 400x400 -> 200x200 + // --> @2x: resize 800x800->400x400 + if (isset(self::$magic_resize_actions[$method])) { + foreach (self::$magic_resize_actions[$method] as $param) { + if (isset($args_copy[$param])) { + $args_copy[$param] = (int) $args_copy[$param] * $ratio; + } + } + } + + call_user_func_array([$medium, $method], $args_copy); + } + } catch (\BadFunctionCallException $e) { + } + + return $this; + } + + /** + * Gets medium image, resets image manipulation operations. + * + * @return $this + */ + protected function image() + { + $locator = self::$grav['locator']; + + $file = $this->get('filepath'); + $cacheDir = $locator->findResource('cache://images', true); + + $this->image = ImageFile::open($file) + ->setCacheDir($cacheDir) + ->setActualCacheDir($cacheDir) + ->setPrettyName(basename($this->get('basename'))); + + $this->filter(); + + return $this; + } + + /** + * Save the image with cache. + * + * @return mixed|string + */ + protected function saveImage() + { + if (!$this->image) { + return parent::path(false); + } + + if (isset($this->result)) { + return $this->result; + } + + if ($this->get('debug') && !$this->debug_watermarked) { + $ratio = $this->get('ratio'); + if (!$ratio) { + $ratio = 1; + } + + $locator = self::$grav['locator']; + $overlay = $locator->findResource("system://assets/responsive-overlays/{$ratio}x.png") ?: $locator->findResource('system://assets/responsive-overlays/unknown.png'); + $this->image->merge(ImageFile::open($overlay)); + } + + return $this->image->cacheFile($this->format, $this->quality); + } + + /** + * Filter image by using user defined filter parameters. + * + * @param string $filter Filter to be used. + */ + public function filter($filter = 'image.filters.default') + { + $filters = (array) $this->get($filter, []); + foreach ($filters as $params) { + $params = (array) $params; + $method = array_shift($params); + $this->__call($method, $params); + } + } +} diff --git a/system/src/Grav/Common/Page/Medium/Link.php b/system/src/Grav/Common/Page/Medium/Link.php new file mode 100644 index 0000000..a92ec22 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/Link.php @@ -0,0 +1,65 @@ +attributes = $attributes; + $this->source = $medium->reset()->thumbnail('auto')->display('thumbnail'); + $this->source->linked = true; + } + + /** + * Get an element (is array) that can be rendered by the Parsedown engine + * + * @param string $title + * @param string $alt + * @param string $class + * @param boolean $reset + * @return array + */ + public function parsedownElement($title = null, $alt = null, $class = null, $reset = true) + { + $innerElement = $this->source->parsedownElement($title, $alt, $class, $reset); + + return [ + 'name' => 'a', + 'attributes' => $this->attributes, + 'handler' => is_string($innerElement) ? 'line' : 'element', + 'text' => $innerElement + ]; + } + + /** + * Forward the call to the source element + * + * @param string $method + * @param mixed $args + * @return $this|mixed + */ + public function __call($method, $args) + { + $this->source = call_user_func_array(array($this->source, $method), $args); + + // Don't start nesting links, if user has multiple link calls in his + // actions, we will drop the previous links. + return $this->source instanceof Link ? $this->source : $this; + } +} diff --git a/system/src/Grav/Common/Page/Medium/Medium.php b/system/src/Grav/Common/Page/Medium/Medium.php new file mode 100644 index 0000000..d3d3e62 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/Medium.php @@ -0,0 +1,443 @@ +get('system.media.enable_media_timestamp', true)) { + $this->querystring('&' . self::getGrav()['cache']->getKey()); + } + + $this->def('mime', 'application/octet-stream'); + $this->reset(); + } + + /** + * Return just metadata from the Medium object + * + * @return $this + */ + public function meta() + { + return new Data($this->items); + } + + /** + * Add meta file for the medium. + * + * @param $filepath + */ + public function addMetaFile($filepath) + { + $this->merge(CompiledYamlFile::instance($filepath)->content()); + } + + /** + * Add alternative Medium to this Medium. + * + * @param $ratio + * @param Medium $alternative + */ + public function addAlternative($ratio, Medium $alternative) + { + if (!is_numeric($ratio) || $ratio === 0) { + return; + } + + $alternative->set('ratio', $ratio); + $this->alternatives[(float) $ratio] = $alternative; + } + + /** + * Return string representation of the object (html). + * + * @return string + */ + public function __toString() + { + return $this->html(); + } + + /** + * Return PATH to file. + * + * @param bool $reset + * @return string path to file + */ + public function path($reset = true) + { + if ($reset) { + $this->reset(); + } + + return $this->get('filepath'); + } + + /** + * Return URL to file. + * + * @param bool $reset + * @return string + */ + public function url($reset = true) + { + $output = preg_replace('|^' . GRAV_ROOT . '|', '', $this->get('filepath')); + + if ($reset) { + $this->reset(); + } + + return self::$grav['base_url'] . $output . $this->querystring() . $this->urlHash(); + } + + /** + * Get/set querystring for the file's url + * + * @param string $hash + * @param boolean $withHash + * @return string + */ + public function querystring($querystring = null, $withQuestionmark = true) + { + if ($querystring) { + $this->set('querystring', ltrim($querystring, '?&')); + + foreach ($this->alternatives as $alt) { + $alt->querystring($querystring, $withQuestionmark); + } + } + + $querystring = $this->get('querystring', ''); + + if ($withQuestionmark && !empty($querystring)) { + return '?' . $querystring; + } else { + return $querystring; + } + } + + /** + * Get/set hash for the file's url + * + * @param string $hash + * @param boolean $withHash + * @return string + */ + public function urlHash($hash = null, $withHash = true) + { + if ($hash) { + $this->set('urlHash', ltrim($hash, '#')); + } + + $hash = $this->get('urlHash', ''); + + if ($withHash && !empty($hash)) { + return '#' . $hash; + } else { + return $hash; + } + } + + /** + * Get an element (is array) that can be rendered by the Parsedown engine + * + * @param string $title + * @param string $alt + * @param string $class + * @param boolean $reset + * @return array + */ + public function parsedownElement($title = null, $alt = null, $class = null, $reset = true) + { + $attributes = $this->attributes; + + $style = ''; + foreach ($this->styleAttributes as $key => $value) { + $style .= $key . ': ' . $value . ';'; + } + $attributes['style'] = $style; + + if (empty($attributes['title'])) { + if (!empty($title)) { + $attributes['title'] = $title; + } elseif (!empty($this->items['title'])) { + $attributes['title'] = $this->items['title']; + } + } + + if (empty($attributes['alt'])) { + if (!empty($alt)) { + $attributes['alt'] = $alt; + } elseif (!empty($this->items['alt'])) { + $attributes['alt'] = $this->items['alt']; + } + } + + if (empty($attributes['class'])) { + if (!empty($class)) { + $attributes['class'] = $class; + } elseif (!empty($this->items['class'])) { + $attributes['class'] = $this->items['class']; + } + } + + switch ($this->mode) { + case 'text': + $element = $this->textParsedownElement($attributes, false); + break; + case 'thumbnail': + $element = $this->getThumbnail()->sourceParsedownElement($attributes, false); + break; + case 'source': + $element = $this->sourceParsedownElement($attributes, false); + break; + } + + if ($reset) { + $this->reset(); + } + + $this->display('source'); + + return $element; + } + + /** + * Parsedown element for source display mode + * + * @param array $attributes + * @param boolean $reset + * @return array + */ + protected function sourceParsedownElement(array $attributes, $reset = true) + { + return $this->textParsedownElement($attributes, $reset); + } + + /** + * Parsedown element for text display mode + * + * @param array $attributes + * @param boolean $reset + * @return array + */ + protected function textParsedownElement(array $attributes, $reset = true) + { + $text = empty($attributes['title']) ? empty($attributes['alt']) ? $this->get('filename') : $attributes['alt'] : $attributes['title']; + + $element = [ + 'name' => 'p', + 'attributes' => $attributes, + 'text' => $text + ]; + + if ($reset) { + $this->reset(); + } + + return $element; + } + + /** + * Reset medium. + * + * @return $this + */ + public function reset() + { + $this->attributes = []; + return $this; + } + + /** + * Switch display mode. + * + * @param string $mode + * + * @return $this + */ + public function display($mode = 'source') + { + if ($this->mode === $mode) { + return $this; + } + + + $this->mode = $mode; + + return $mode === 'thumbnail' ? $this->getThumbnail()->reset() : $this->reset(); + } + + /** + * Switch thumbnail. + * + * @param string $type + * + * @return $this + */ + public function thumbnail($type = 'auto') + { + if ($type !== 'auto' && !in_array($type, $this->thumbnailTypes)) { + return $this; + } + + if ($this->thumbnailType !== $type) { + $this->_thumbnail = null; + } + + $this->thumbnailType = $type; + + return $this; + } + + /** + * Turn the current Medium into a Link + * + * @param boolean $reset + * @param array $attributes + * @return Link + */ + public function link($reset = true, array $attributes = []) + { + if ($this->mode !== 'source') { + $this->display('source'); + } + + foreach ($this->attributes as $key => $value) { + empty($attributes['data-' . $key]) && $attributes['data-' . $key] = $value; + } + + empty($attributes['href']) && $attributes['href'] = $this->url(); + + return new Link($attributes, $this); + } + + /** + * Turn the current Medium into a Link with lightbox enabled + * + * @param int $width + * @param int $height + * @param boolean $reset + * @return Link + */ + public function lightbox($width = null, $height = null, $reset = true) + { + $attributes = ['rel' => 'lightbox']; + + if ($width && $height) { + $attributes['data-width'] = $width; + $attributes['data-height'] = $height; + } + + return $this->link($reset, $attributes); + } + + /** + * Allow any action to be called on this medium from twig or markdown + * + * @param string $method + * @param mixed $args + * @return $this + */ + public function __call($method, $args) + { + $qs = $method; + if (count($args) > 1 || (count($args) == 1 && !empty($args[0]))) { + $qs .= '=' . implode(',', array_map(function ($a) { return urlencode($a); }, $args)); + } + + if (!empty($qs)) { + $this->querystring($this->querystring(null, false) . '&' . $qs); + } + + return $this; + } + + /** + * Get the thumbnail Medium object + * + * @return ThumbnailImageMedium + */ + protected function getThumbnail() + { + if (!$this->_thumbnail) { + $types = $this->thumbnailTypes; + + if ($this->thumbnailType !== 'auto') { + array_unshift($types, $this->thumbnailType); + } + + foreach ($types as $type) { + $thumb = $this->get('thumbnails.' . $type, false); + + if ($thumb) { + $thumb = $thumb instanceof ThumbnailImageMedium ? $thumb : MediumFactory::fromFile($thumb, ['type' => 'thumbnail']); + $thumb->parent = $this; + } + + if ($thumb) { + $this->_thumbnail = $thumb; + break; + } + } + } + + return $this->_thumbnail; + } +} diff --git a/system/src/Grav/Common/Page/Medium/MediumFactory.php b/system/src/Grav/Common/Page/Medium/MediumFactory.php new file mode 100644 index 0000000..aa88db7 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/MediumFactory.php @@ -0,0 +1,148 @@ +get("media.".strtolower($ext)); + if (!$media_params) { + return null; + } + + $params += $media_params; + + // Add default settings for undefined variables. + $params += $config->get('media.defaults'); + $params += [ + 'type' => 'file', + 'thumb' => 'media/thumb.png', + 'mime' => 'application/octet-stream', + 'filepath' => $file, + 'filename' => $filename, + 'basename' => $basename, + 'extension' => $ext, + 'path' => $path, + 'modified' => filemtime($file), + 'thumbnails' => [] + ]; + + $locator = self::getGrav()['locator']; + + $lookup = $locator->findResources('image://'); + foreach ($lookup as $lookupPath) { + if (is_file($lookupPath . '/' . $params['thumb'])) { + $params['thumbnails']['default'] = $lookupPath . '/' . $params['thumb']; + break; + } + } + + return static::fromArray($params); + } + + /** + * Create Medium from array of parameters + * + * @param array $items + * @param Blueprint|null $blueprint + * @return Medium + */ + public static function fromArray(array $items = [], Blueprint $blueprint = null) + { + $type = isset($items['type']) ? $items['type'] : null; + + switch ($type) { + case 'image': + return new ImageMedium($items, $blueprint); + break; + case 'thumbnail': + return new ThumbnailImageMedium($items, $blueprint); + break; + case 'animated': + case 'vector': + return new StaticImageMedium($items, $blueprint); + break; + case 'video': + return new VideoMedium($items, $blueprint); + break; + case 'audio': + return new AudioMedium($items, $blueprint); + break; + default: + return new Medium($items, $blueprint); + break; + } + } + + /** + * Create a new ImageMedium by scaling another ImageMedium object. + * + * @param ImageMedium $medium + * @param int $from + * @param int $to + * @return Medium + */ + public static function scaledFromMedium($medium, $from, $to) + { + if (! $medium instanceof ImageMedium) { + return $medium; + } + + if ($to > $from) { + return $medium; + } + + $ratio = $to / $from; + $width = (int) ($medium->get('width') * $ratio); + $height = (int) ($medium->get('height') * $ratio); + + $basename = $medium->get('basename'); + $basename = str_replace('@'.$from.'x', '@'.$to.'x', $basename); + + $debug = $medium->get('debug'); + $medium->set('debug', false); + + $file = $medium->resize($width, $height)->path(); + + $medium->set('debug', $debug); + + $size = filesize($file); + + $medium = self::fromFile($file); + $medium->set('size', $size); + + return ['file' => $medium, 'size' => $size]; + } +} diff --git a/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php b/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php new file mode 100644 index 0000000..7052dea --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php @@ -0,0 +1,31 @@ +parsedownElement($title, $alt, $class, $reset); + + if (!$this->parsedown) { + $this->parsedown = new Parsedown(null, null); + } + + return $this->parsedown->elementToHtml($element); + } +} diff --git a/system/src/Grav/Common/Page/Medium/RenderableInterface.php b/system/src/Grav/Common/Page/Medium/RenderableInterface.php new file mode 100644 index 0000000..f1ebf0d --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/RenderableInterface.php @@ -0,0 +1,34 @@ +url($reset); + + return [ 'name' => 'image', 'attributes' => $attributes ]; + } +} diff --git a/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php b/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php new file mode 100644 index 0000000..df42dcf --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php @@ -0,0 +1,20 @@ +styleAttributes['width'] = $width . 'px'; + $this->styleAttributes['height'] = $height . 'px'; + + return $this; + } +} diff --git a/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php b/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php new file mode 100644 index 0000000..da63522 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php @@ -0,0 +1,121 @@ +bubble('parsedownElement', [$title, $alt, $class, $reset]); + } + + /** + * Return HTML markup from the medium. + * + * @param string $title + * @param string $alt + * @param string $class + * @param bool $reset + * @return string + */ + public function html($title = null, $alt = null, $class = null, $reset = true) + { + return $this->bubble('html', [$title, $alt, $class, $reset]); + } + + /** + * Switch display mode. + * + * @param string $mode + * + * @return $this + */ + public function display($mode = 'source') + { + return $this->bubble('display', [$mode], false); + } + + /** + * Switch thumbnail. + * + * @param string $type + * + * @return $this + */ + public function thumbnail($type = 'auto') + { + $this->bubble('thumbnail', [$type], false); + return $this->bubble('getThumbnail', [], false); + } + + /** + * Turn the current Medium into a Link + * + * @param boolean $reset + * @param array $attributes + * @return Link + */ + public function link($reset = true, array $attributes = []) + { + return $this->bubble('link', [$reset, $attributes], false); + } + + /** + * Turn the current Medium into a Link with lightbox enabled + * + * @param int $width + * @param int $height + * @param boolean $reset + * @return Link + */ + public function lightbox($width = null, $height = null, $reset = true) + { + return $this->bubble('lightbox', [$width, $height, $reset], false); + } + + /** + * Bubble a function call up to either the superclass function or the parent Medium instance + * + * @param string $method + * @param array $arguments + * @param boolean $testLinked + * @return Medium + */ + protected function bubble($method, array $arguments = [], $testLinked = true) + { + if (!$testLinked || $this->linked) { + return $this->parent ? call_user_func_array(array($this->parent, $method), $arguments) : $this; + } else { + return call_user_func_array(array($this, 'parent::' . $method), $arguments); + } + } +} diff --git a/system/src/Grav/Common/Page/Medium/VideoMedium.php b/system/src/Grav/Common/Page/Medium/VideoMedium.php new file mode 100644 index 0000000..acc9672 --- /dev/null +++ b/system/src/Grav/Common/Page/Medium/VideoMedium.php @@ -0,0 +1,45 @@ +url($reset); + + return [ + 'name' => 'video', + 'text' => 'Your browser does not support the video tag.', + 'attributes' => $attributes + ]; + } + + /** + * Reset medium. + * + * @return $this + */ + public function reset() + { + parent::reset(); + + $this->attributes['controls'] = true; + return $this; + } +} diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php new file mode 100644 index 0000000..f2c6ea2 --- /dev/null +++ b/system/src/Grav/Common/Page/Page.php @@ -0,0 +1,2208 @@ +taxonomy = array(); + $this->process = $config->get('system.pages.process'); + $this->published = true; + } + + /** + * Initializes the page instance variables based on a file + * + * @param \SplFileInfo $file The file information for the .md file that the page represents + * @param string $extension + */ + public function init(\SplFileInfo $file, $extension = null) + { + $this->filePath($file->getPathName()); + $this->modified($file->getMTime()); + $this->id($this->modified().md5($this->filePath())); + $this->routable(true); + $this->header(); + $this->date(); + $this->metadata(); + $this->url(); + $this->visible(); + $this->modularTwig($this->slug[0] == '_'); + $this->setPublishState(); + $this->published(); + + // some extension logic + if (empty($extension)) { + $this->extension('.'.$file->getExtension()); + } else { + $this->extension($extension); + } + + // extract page language from page extension + $language = trim(basename($this->extension(), 'md'), '.') ?: null; + $this->language($language); + } + + /** + * Return an array with the routes of other translated languages + * @return array the page translated languages + */ + public function translatedLanguages() + { + $filename = substr($this->name, 0, -(strlen($this->extension()))); + $config = self::getGrav()['config']; + $languages = $config->get('system.languages.supported', []); + $translatedLanguages = []; + + foreach ($languages as $language) { + $path = $this->path . DS . $this->folder . DS . $filename . '.' . $language .'.md'; + if (file_exists($path)) { + $aPage = new Page(); + $aPage->init(new \SplFileInfo($path), $language .'.md'); + + $route = isset($aPage->header()->routes['default']) ? $aPage->header()->routes['default'] : $aPage->rawRoute(); + if (!$route) $route = $aPage->slug(); + + $translatedLanguages[$language] = $route; + } + } + + return $translatedLanguages; + } + + /** + * Return an array listing untranslated languages available + * @return array the page untranslated languages + */ + public function untranslatedLanguages() + { + $filename = substr($this->name, 0, -(strlen($this->extension()))); + $config = self::getGrav()['config']; + $languages = $config->get('system.languages.supported', []); + $untranslatedLanguages = []; + + foreach ($languages as $language) { + $path = $this->path . DS . $this->folder . DS . $filename . '.' . $language .'.md'; + if (!file_exists($path)) { + $untranslatedLanguages[] = $language; + } + } + + return $untranslatedLanguages; + } + + /** + * Gets and Sets the raw data + * + * @param string $var Raw content string + * @return Object Raw content string + */ + public function raw($var = null) + { + $file = $this->file(); + + if ($var) { + // First update file object. + if ($file) { + $file->raw($var); + } + + // Reset header and content. + $this->modified = time(); + $this->id($this->modified().md5($this->filePath())); + $this->header = null; + $this->content = null; + $this->summary = null; + } + return $file ? $file->raw() : ''; + } + + public function frontmatter($var = null) + { + + if ($var) { + $this->frontmatter = (string) $var; + + // Update also file object. + $file = $this->file(); + if ($file) { + $file->frontmatter((string) $var); + } + + // Force content re-processing. + $this->id(time().md5($this->filePath())); + } + if (!$this->frontmatter) { + $this->header(); + } + return $this->frontmatter; + } + + /** + * Gets and Sets the header based on the YAML configuration at the top of the .md file + * + * @param object|array $var a YAML object representing the configuration for the file + * @return object the current YAML configuration + */ + public function header($var = null) + { + if ($var) { + $this->header = (object) $var; + + // Update also file object. + $file = $this->file(); + if ($file) { + $file->header((array) $var); + } + + // Force content re-processing. + $this->id(time().md5($this->filePath())); + } + if (!$this->header) { + $file = $this->file(); + if ($file) { + // Set some options + $file->settings(['native' => true, 'compat' => true]); + try { + $this->raw_content = $file->markdown(); + $this->frontmatter = $file->frontmatter(); + $this->header = (object)$file->header(); + } catch (ParseException $e) { + $file->raw(self::getGrav()['language']->translate(['FRONTMATTER_ERROR_PAGE', $this->slug(), $file->filename(), $e->getMessage(), $file->raw()])); + $this->raw_content = $file->markdown(); + $this->frontmatter = $file->frontmatter(); + $this->header = (object)$file->header(); + } + $var = true; + } + } + + if ($var) { + if (isset($this->header->slug)) { + $this->slug = trim($this->header->slug); + } + if (isset($this->header->routes)) { + $this->routes = (array)($this->header->routes); + } + if (isset($this->header->title)) { + $this->title = trim($this->header->title); + } + if (isset($this->header->language)) { + $this->language = trim($this->header->language); + } + if (isset($this->header->template)) { + $this->template = trim($this->header->template); + } + if (isset($this->header->menu)) { + $this->menu = trim($this->header->menu); + } + if (isset($this->header->routable)) { + $this->routable = (bool) $this->header->routable; + } + if (isset($this->header->visible)) { + $this->visible = (bool) $this->header->visible; + } + if (isset($this->header->redirect)) { + $this->redirect = trim($this->header->redirect); + } + if (isset($this->header->order_dir)) { + $this->order_dir = trim($this->header->order_dir); + } + if (isset($this->header->order_by)) { + $this->order_by = trim($this->header->order_by); + } + if (isset($this->header->order_manual)) { + $this->order_manual = (array)$this->header->order_manual; + } + if (isset($this->header->date)) { + $this->date($this->header->date); + } + if (isset($this->header->markdown_extra)) { + $this->markdown_extra = (bool)$this->header->markdown_extra; + } + if (isset($this->header->taxonomy)) { + foreach ((array) $this->header->taxonomy as $taxonomy => $taxitems) { + $this->taxonomy[$taxonomy] = (array)$taxitems; + } + } + if (isset($this->header->max_count)) { + $this->max_count = intval($this->header->max_count); + } + if (isset($this->header->process)) { + foreach ((array) $this->header->process as $process => $status) { + $this->process[$process] = (bool) $status; + } + } + if (isset($this->header->published)) { + $this->published = (bool) $this->header->published; + } + if (isset($this->header->publish_date)) { + $this->publishDate($this->header->publish_date); + } + if (isset($this->header->unpublish_date)) { + $this->unpublishDate($this->header->unpublish_date); + } + if (isset($this->header->expires)) { + $this->expires = intval($this->header->expires); + } + if (isset($this->header->etag)) { + $this->etag = (bool) $this->header->etag; + } + if (isset($this->header->last_modified)) { + $this->last_modified = (bool) $this->header->last_modified; + } + + } + + return $this->header; + } + + /** + * Get page language + * + * @param $var + * + * @return mixed + */ + public function language($var = null) + { + if ($var !== null) { + $this->language = $var; + } + + return $this->language; + } + + /** + * Modify a header value directly + * + * @param $key + * @param $value + */ + public function modifyHeader($key, $value) + { + $this->header->$key = $value; + } + + /** + * Get the summary. + * + * @param int $size Max summary size. + * @return string + */ + public function summary($size = null) + { + /** @var Config $config */ + $config = self::getGrav()['config']->get('site.summary'); + if (isset($this->header->summary)) { + $config = array_merge($config, $this->header->summary); + } + + // Return summary based on settings in site config file + if (!$config['enabled']) { + return $this->content(); + } + + // Set up variables to process summary from page or from custom summary + if ($this->summary === null) { + $content = $this->content(); + $summary_size = $this->summary_size; + } else { + $content = $this->summary; + $summary_size = mb_strlen($this->summary); + } + + // Return calculated summary based on summary divider's position + $format = $config['format']; + // Return entire page content on wrong/ unknown format + if (!in_array($format, array('short', 'long'))) { + return $content; + } elseif (($format === 'short') && isset($summary_size)) { + return mb_substr($content, 0, $summary_size); + } + + // Get summary size from site config's file + if (is_null($size)) { + $size = $config['size']; + } + + // If the size is zero, return the entire page content + if ($size === 0) { + return $content; + // Return calculated summary based on defaults + } elseif (!is_numeric($size) || ($size < 0)) { + $size = 300; + } + + return Utils::truncateHTML($content, $size); + } + + /** + * Sets the summary of the page + * + * @param string $var Summary + */ + public function setSummary($summary) + { + $this->summary = $summary; + } + + /** + * Gets and Sets the content based on content portion of the .md file + * + * @param string $var Content + * @return string Content + */ + public function content($var = null) + { + if ($var !== null) { + $this->raw_content = $var; + + // Update file object. + $file = $this->file(); + if ($file) { + $file->markdown($var); + } + + // Force re-processing. + $this->id(time().md5($this->filePath())); + $this->content = null; + } + // If no content, process it + if ($this->content === null) { + // Get media + $this->media(); + + // Load cached content + /** @var Cache $cache */ + $cache = self::getGrav()['cache']; + $cache_id = md5('page'.$this->id()); + $this->content = $cache->fetch($cache_id); + + $process_markdown = $this->shouldProcess('markdown'); + $process_twig = $this->shouldProcess('twig'); + $cache_twig = isset($this->header->cache_enable) ? $this->header->cache_enable : true; + $twig_first = isset($this->header->twig_first) ? $this->header->twig_first : false; + $twig_already_processed = false; + + // if no cached-content run everything + if ($this->content === false) { + $this->content = $this->raw_content; + self::getGrav()->fireEvent('onPageContentRaw', new Event(['page' => $this])); + + if ($twig_first) { + if ($process_twig) { + $this->processTwig(); + $twig_already_processed = true; + } + if ($process_markdown) { + $this->processMarkdown(); + } + if ($cache_twig) { + $this->cachePageContent(); + } + } else { + if ($process_markdown) { + $this->processMarkdown(); + } + if (!$cache_twig) { + $this->cachePageContent(); + } + if ($process_twig) { + $this->processTwig(); + $twig_already_processed = true; + } + if ($cache_twig) { + $this->cachePageContent(); + } + } + // content cached, but twig cache off + } + + // only markdown content cached, process twig if required and not already processed + if ($process_twig && !$cache_twig && !$twig_already_processed) { + $this->processTwig(); + } + + // Handle summary divider + $delimiter = self::getGrav()['config']->get('site.summary.delimiter', '==='); + $divider_pos = mb_strpos($this->content, "

{$delimiter}

"); + if ($divider_pos !== false) { + $this->summary_size = $divider_pos; + $this->content = str_replace("

{$delimiter}

", '', $this->content); + } + + } + + return $this->content; + } + + /** + * Process the Markdown content. Uses Parsedown or Parsedown Extra depending on configuration + */ + protected function processMarkdown() + { + /** @var Config $config */ + $config = self::getGrav()['config']; + + $defaults = (array) $config->get('system.pages.markdown'); + if (isset($this->header()->markdown)) { + $defaults = array_merge($defaults, $this->header()->markdown); + } + + // pages.markdown_extra is deprecated, but still check it... + if (!isset($defaults['extra']) && (isset($this->markdown_extra) || $config->get('system.pages.markdown_extra') !== null)) { + $defaults['extra'] = $this->markdown_extra ?: $config->get('system.pages.markdown_extra'); + } + + // Initialize the preferred variant of Parsedown + if ($defaults['extra']) { + $parsedown = new ParsedownExtra($this, $defaults); + } else { + $parsedown = new Parsedown($this, $defaults); + } + + $this->content = $parsedown->text($this->content); + } + + + /** + * Process the Twig page content. + */ + private function processTwig() + { + $twig = self::getGrav()['twig']; + $this->content = $twig->processPage($this, $this->content); + } + + /** + * Fires the onPageContentProcessed event, and caches the page content using a unique ID for the page + */ + private function cachePageContent() + { + $cache = self::getGrav()['cache']; + $cache_id = md5('page'.$this->id()); + + self::getGrav()->fireEvent('onPageContentProcessed', new Event(['page' => $this])); + $cache->save($cache_id, $this->content); + } + + /** + * Needed by the onPageContentProcessed event to get the raw page content + * + * @return string the current page content + */ + public function getRawContent() + { + return $this->content; + } + + /** + * Needed by the onPageContentProcessed event to set the raw page content + * + * @param $content + */ + public function setRawContent($content) + { + $this->content = $content; + } + + /** + * Get value from a page variable (used mostly for creating edit forms). + * + * @param string $name Variable name. + * @param mixed $default + * @return mixed + */ + public function value($name, $default = null) + { + if ($name == 'content') { + return $this->raw_content; + } + if ($name == 'route') { + return $this->parent()->rawRoute(); + } + if ($name == 'order') { + $order = $this->order(); + return $order ? (int) $this->order() : ''; + } + if ($name == 'ordering') { + return (bool) $this->order(); + } + if ($name == 'folder') { + $regex = '/^[0-9]+\./u'; + return preg_replace($regex, '', $this->folder); + } + if ($name == 'name') { + $language = $this->language() ? '.' . $this->language() : ''; + $name_val = str_replace($language .'.md', '', $this->name()); + if ($this->modular()) { + return 'modular/' . $name_val; + } + return $name_val; + } + if ($name == 'media') { + return $this->media()->all(); + } + if ($name == 'media.file') { + return $this->media()->files(); + } + if ($name == 'media.video') { + return $this->media()->videos(); + } + if ($name == 'media.image') { + return $this->media()->images(); + } + if ($name == 'media.audio') { + return $this->media()->audios(); + } + + $path = explode('.', $name); + $scope = array_shift($path); + + if ($name == 'frontmatter') { + return $this->frontmatter; + } + + if ($scope == 'header') { + $current = $this->header(); + foreach ($path as $field) { + if (is_object($current) && isset($current->{$field})) { + $current = $current->{$field}; + } elseif (is_array($current) && isset($current[$field])) { + $current = $current[$field]; + } else { + return $default; + } + } + + return $current; + } + + return $default; + } + + public function rawMarkdown($var = null) + { + if ($var !== null) { + $this->raw_content = $var; + } + + return $this->raw_content; + } + + /** + * Get file object to the page. + * + * @return MarkdownFile|null + */ + public function file() + { + if ($this->name) { + return MarkdownFile::instance($this->filePath()); + } + return null; + } + + /** + * Save page if there's a file assigned to it. + * @param bool $reorder Internal use. + */ + public function save($reorder = true) + { + // Perform move, copy or reordering if needed. + $this->doRelocation($reorder); + + $file = $this->file(); + if ($file) { + $file->filename($this->filePath()); + $file->header((array) $this->header()); + $file->markdown($this->raw_content); + $file->save(); + } + } + + /** + * Prepare move page to new location. Moves also everything that's under the current page. + * + * You need to call $this->save() in order to perform the move. + * + * @param Page $parent New parent page. + * @return Page + */ + public function move(Page $parent) + { + $clone = clone $this; + $clone->_action = 'move'; + $clone->_original = $this; + $clone->parent($parent); + $clone->id(time().md5($clone->filePath())); + + if ($parent->path()) { + $clone->path($parent->path() . '/' . $clone->folder()); + } + + if ($parent->route()) { + $clone->route($parent->route() . '/'. $clone->slug()); + } else { + $clone->route(self::getGrav()['pages']->root()->route() . '/'. $clone->slug()); + } + + return $clone; + } + + /** + * Prepare a copy from the page. Copies also everything that's under the current page. + * + * Returns a new Page object for the copy. + * You need to call $this->save() in order to perform the move. + * + * @param Page $parent New parent page. + * @return Page + */ + public function copy($parent) + { + $clone = $this->move($parent); + $clone->_action = 'copy'; + + return $clone; + } + + /** + * Get blueprints for the page. + * + * @return Blueprint + */ + public function blueprints() + { + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + + $blueprint = $pages->blueprints($this->blueprintName()); + $fields = $blueprint->fields(); + $edit_mode = isset(self::getGrav()['admin']) ? self::getGrav()['config']->get('plugins.admin.edit_mode') : null; + + // override if you only want 'normal' mode + if (empty($fields) && ($edit_mode == 'auto' || $edit_mode == 'normal')) { + $blueprint = $pages->blueprints('default'); + } + + // override if you only want 'expert' mode + if (!empty($fields) && $edit_mode == 'expert') { + $blueprint = $pages->blueprints(''); + } + + return $blueprint; + } + + /** + * Get the blueprint name for this page. Use the blueprint form field if set + * + * @return string + */ + public function blueprintName() + { + $blueprint_name = filter_input(INPUT_POST, 'blueprint', FILTER_SANITIZE_STRING) ?: $this->template(); + + return $blueprint_name; + } + + /** + * Validate page header. + * + * @throws Exception + */ + public function validate() + { + $blueprints = $this->blueprints(); + $blueprints->validate($this->toArray()); + } + + /** + * Filter page header from illegal contents. + */ + public function filter() + { + $blueprints = $this->blueprints(); + $values = $blueprints->filter($this->toArray()); + if ($values && isset($values['header'])) { + $this->header($values['header']); + } + } + + /** + * Get unknown header variables. + * + * @return array + */ + public function extra() + { + $blueprints = $this->blueprints(); + return $blueprints->extra($this->toArray()['header'], 'header.'); + } + + /** + * Convert page to an array. + * + * @return array + */ + public function toArray() + { + return array( + 'header' => (array) $this->header(), + 'content' => (string) $this->value('content') + ); + } + + /** + * Convert page to YAML encoded string. + * + * @return string + */ + public function toYaml() + { + return Yaml::dump($this->toArray(), 10); + } + + /** + * Convert page to JSON encoded string. + * + * @return string + */ + public function toJson() + { + return json_encode($this->toArray()); + } + + /** + * Gets and sets the associated media as found in the page folder. + * + * @param Media $var Representation of associated media. + * @return Media Representation of associated media. + */ + public function media($var = null) + { + /** @var Cache $cache */ + $cache = self::getGrav()['cache']; + + if ($var) { + $this->media = $var; + } + if ($this->media === null) { + // Use cached media if possible. + $media_cache_id = md5('media'.$this->id()); + if (!$media = $cache->fetch($media_cache_id)) { + $media = new Media($this->path()); + $cache->save($media_cache_id, $media); + } + $this->media = $media; + } + return $this->media; + } + + /** + * Gets and sets the name field. If no name field is set, it will return 'default.md'. + * + * @param string $var The name of this page. + * @return string The name of this page. + */ + public function name($var = null) + { + if ($var !== null) { + $this->name = $var; + } + return empty($this->name) ? 'default.md' : $this->name; + } + + /** + * Returns child page type. + * + * @return string + */ + public function childType() + { + return isset($this->header->child_type) ? (string) $this->header->child_type : 'default'; + } + + /** + * Gets and sets the template field. This is used to find the correct Twig template file to render. + * If no field is set, it will return the name without the .md extension + * + * @param string $var the template name + * @return string the template name + */ + public function template($var = null) + { + if ($var !== null) { + $this->template = $var; + } + if (empty($this->template)) { + $this->template = ($this->modular() ? 'modular/' : '') . str_replace($this->extension(), '', $this->name()); + } + return $this->template; + } + + /** + * Gets and sets the extension field. + * + * @param null $var + * @return null|string + */ + public function extension($var = null) + { + if ($var !== null) { + $this->extension = $var; + } + if (empty($this->extension)) { + $this->extension = '.' . pathinfo($this->name(), PATHINFO_EXTENSION); + } + return $this->extension; + } + + /** + * Gets and sets the expires field. If not set will return the default + * + * @param string $var The name of this page. + * @return string The name of this page. + */ + public function expires($var = null) + { + if ($var !== null) { + $this->expires = $var; + } + return empty($this->expires) ? self::getGrav()['config']->get('system.pages.expires') : $this->expires; + } + + /** + * Gets and sets the title for this Page. If no title is set, it will use the slug() to get a name + * + * @param string $var the title of the Page + * @return string the title of the Page + */ + public function title($var = null) + { + if ($var !== null) { + $this->title = $var; + } + if (empty($this->title)) { + $this->title = ucfirst($this->slug()); + } + return $this->title; + } + + /** + * Gets and sets the menu name for this Page. This is the text that can be used specifically for navigation. + * If no menu field is set, it will use the title() + * + * @param string $var the menu field for the page + * @return string the menu field for the page + */ + public function menu($var = null) + { + if ($var !== null) { + $this->menu = $var; + } + if (empty($this->menu)) { + $this->menu = $this->title(); + } + return $this->menu; + } + + /** + * Gets and Sets whether or not this Page is visible for navigation + * + * @param bool $var true if the page is visible + * @return bool true if the page is visible + */ + public function visible($var = null) + { + if ($var !== null) { + $this->visible = (bool) $var; + } + + if ($this->visible === null) { + // Set item visibility in menu if folder is different from slug + // eg folder = 01.Home and slug = Home + $regex = '/^[0-9]+\./u'; + if (preg_match($regex, $this->folder)) { + $this->visible = true; + } else { + $this->visible = false; + } + } + return $this->visible; + } + + /** + * Gets and Sets whether or not this Page is considered published + * + * @param bool $var true if the page is published + * @return bool true if the page is published + */ + public function published($var = null) + { + if ($var !== null) { + $this->published = (bool) $var; + } + + // If not published, should not be visible in menus either + if ($this->published === false) { + $this->visible = false; + } + + return $this->published; + } + + /** + * Gets and Sets the Page publish date + * + * @param string $var string representation of a date + * @return int unix timestamp representation of the date + */ + public function publishDate($var = null) + { + if ($var !== null) { + $this->publish_date = Utils::date2timestamp($var); + } + + if ($this->publish_date === null) { + $this->publish_date = $this->date(); + } + + return $this->publish_date; + } + + /** + * Gets and Sets the Page unpublish date + * + * @param string $var string representation of a date + * @return int|null unix timestamp representation of the date + */ + public function unpublishDate($var = null) + { + if ($var !== null) { + $this->unpublish_date = Utils::date2timestamp($var); + } + + return $this->unpublish_date; + } + + /** + * Gets and Sets whether or not this Page is routable, ie you can reach it + * via a URL. + * The page must be *routable* and *published* + * + * @param bool $var true if the page is routable + * @return bool true if the page is routable + */ + public function routable($var = null) + { + if ($var !== null) { + $this->routable = (bool) $var; + } + + return $this->routable && $this->published(); + } + + /** + * Gets and Sets the process setup for this Page. This is multi-dimensional array that consists of + * a simple array of arrays with the form array("markdown"=>true) for example + * + * @param array $var an Array of name value pairs where the name is the process and value is true or false + * @return array an Array of name value pairs where the name is the process and value is true or false + */ + public function process($var = null) + { + if ($var !== null) { + $this->process = (array) $var; + } + return $this->process; + } + + /** + * Function to merge page metadata tags and build an array of Metadata objects + * that can then be rendered in the page. + * + * @param array $var an Array of metadata values to set + * @return array an Array of metadata values for the page + */ + public function metadata($var = null) + { + if ($var !== null) { + $this->metadata = (array) $var; + } + + // if not metadata yet, process it. + if (null === $this->metadata) { + $header_tag_http_equivs = ['content-type', 'default-style', 'refresh']; + + $this->metadata = []; + + // Set the Generator tag + $this->metadata['generator'] = array('name'=>'generator', 'content'=>'GravCMS ' . GRAV_VERSION); + + // Get initial metadata for the page + $metadata = self::getGrav()['config']->get('site.metadata'); + + if (isset($this->header->metadata)) { + // Merge any site.metadata settings in with page metadata + $metadata = array_merge($metadata, $this->header->metadata); + } + + // Build an array of meta objects.. + foreach ((array)$metadata as $key => $value) { + // If this is a property type metadata: "og", "twitter", "facebook" etc + if (is_array($value)) { + foreach ($value as $property => $prop_value) { + $prop_key = $key.":".$property; + $this->metadata[$prop_key] = array('property'=>$prop_key, 'content'=>htmlspecialchars($prop_value, ENT_QUOTES)); + } + // If it this is a standard meta data type + } else { + if (in_array($key, $header_tag_http_equivs)) { + $this->metadata[$key] = array('http_equiv'=>$key, 'content'=>htmlspecialchars($value, ENT_QUOTES)); + } else { + $this->metadata[$key] = array('name'=>$key, 'content'=>htmlspecialchars($value, ENT_QUOTES)); + } + } + } + } + + return $this->metadata; + } + + /** + * Gets and Sets the slug for the Page. The slug is used in the URL routing. If not set it uses + * the parent folder from the path + * + * @param string $var the slug, e.g. 'my-blog' + * @return string the slug + */ + public function slug($var = null) + { + if ($var !== null) { + $this->slug = $var; + } + + if (empty($this->slug)) { + $this->slug = preg_replace(PAGE_ORDER_PREFIX_REGEX, '', $this->folder); + } + + return $this->slug; + } + + /** + * Get/set order number of this page. + * + * @param int $var + * @return int|bool + */ + public function order($var = null) + { + if ($var !== null) { + $order = !empty($var) ? sprintf('%02d.', (int)$var) : ''; + $this->folder($order . $this->slug()); + } + preg_match(PAGE_ORDER_PREFIX_REGEX, $this->folder, $order); + + return isset($order[0]) ? $order[0] : false; + } + + /** + * Gets the URL with host information, aka Permalink. + * @return string The permalink. + */ + public function permalink() + { + return $this->url(true); + } + + /** + * Gets the URL for a page - alias of url(). + * + * @param bool $include_host + * @return string the permalink + */ + public function link($include_host = false) + { + return $this->url($include_host); + } + + /** + * Gets the url for the Page. + * + * @param bool $include_host Defaults false, but true would include http://yourhost.com + * @param bool $canonical true to return the canonical URL + * + * @return string The url. + */ + public function url($include_host = false, $canonical = false, $include_lang = true) + { + + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + + /** @var Language $language */ + $language = self::getGrav()['language']; + + // get pre-route + if ($include_lang && $language->enabled()) { + $pre_route = $language->getLanguageURLPrefix(); + } else { + $pre_route = ''; + } + + // get canonical route if requested + if ($canonical) { + $route = $pre_route . $this->routeCanonical(); + } else { + $route = $pre_route . $this->route(); + } + + /** @var Uri $uri */ + $uri = self::getGrav()['uri']; + + $rootUrl = $uri->rootUrl($include_host) . $pages->base(); + + $url = $rootUrl.'/'.trim($route, '/'); + + // trim trailing / if not root + if ($url !== '/') { + $url = rtrim($url, '/'); + } + + return $url; + } + + /** + * Gets the route for the page based on the route headers if available, else from + * the parents route and the current Page's slug. + * + * @param string $var Set new default route. + * + * @return string The route for the Page. + */ + public function route($var = null) + { + if ($var !== null) { + $this->route = $var; + } + + if (empty($this->route)) { + // calculate route based on parent slugs + $baseRoute = $this->parent ? (string) $this->parent()->route() : null; + $this->route = isset($baseRoute) ? $baseRoute . '/'. $this->slug() : null; + + if (!empty($this->routes) && isset($this->routes['default'])) { + $this->routes['aliases'][] = $this->route; + $this->route = $this->routes['default']; + return $this->route; + } + } + + return $this->route; + } + + /** + * Helper method to clear the route out so it regenerates next time you use it + */ + public function unsetRouteSlug() + { + unset($this->route); + unset($this->slug); + } + + public function rawRoute($var = null) + { + if ($var !== null) { + $this->raw_route = $var; + } + + if (empty($this->raw_route)) { + $baseRoute = $this->parent ? (string) $this->parent()->rawRoute() : null; + + $regex = '/^[0-9]+\./u'; + $slug = preg_replace($regex, '', $this->folder); + + $this->raw_route = isset($baseRoute) ? $baseRoute . '/'. $slug : null; + } + + return $this->raw_route; + } + + /** + * Gets the route aliases for the page based on page headers. + * + * @param array $var list of route aliases + * + * @return array The route aliases for the Page. + */ + public function routeAliases($var = null) + { + if ($var !== null) { + $this->routes['aliases'] = (array) $var; + } + + if (!empty($this->routes) && isset($this->routes['aliases'])) { + return $this->routes['aliases']; + } else { + return []; + } + } + + /** + * Gets the canonical route for this page if its set. If provided it will use + * that value, else if it's `true` it will use the default route. + * + * @param null $var + * + * @return bool|string + */ + public function routeCanonical($var = null) + { + if ($var !== null) { + $this->routes['canonical'] = (array)$var; + } + + if (!empty($this->routes) && isset($this->routes['canonical'])) { + return $this->routes['canonical']; + } + + return $this->route(); + } + + /** + * Gets and sets the identifier for this Page object. + * + * @param string $var the identifier + * @return string the identifier + */ + public function id($var = null) + { + if ($var !== null) { + $this->id = $var; + } + return $this->id; + } + + /** + * Gets and sets the modified timestamp. + * + * @param int $var modified unix timestamp + * @return int modified unix timestamp + */ + public function modified($var = null) + { + if ($var !== null) { + $this->modified = $var; + } + return $this->modified; + } + + /** + * Gets the redirect set in the header. + * + * @param string $var redirect url + * @return array + */ + public function redirect($var = null) + { + if ($var !== null) { + $this->redirect = $var; + } + return $this->redirect; + } + + /** + * Gets and sets the option to show the etag header for the page. + * + * @param boolean $var show etag header + * @return boolean show etag header + */ + public function eTag($var = null) + { + if ($var !== null) { + $this->etag = $var; + } + if (!isset($this->etag)) { + $this->etag = (bool) self::getGrav()['config']->get('system.pages.etag'); + } + return $this->etag; + } + + /** + * Gets and sets the option to show the last_modified header for the page. + * + * @param boolean $var show last_modified header + * @return boolean show last_modified header + */ + public function lastModified($var = null) + { + if ($var !== null) { + $this->last_modified = $var; + } + if (!isset($this->last_modified)) { + $this->last_modified = (bool) self::getGrav()['config']->get('system.pages.last_modified'); + } + return $this->last_modified; + } + + /** + * Gets and sets the path to the .md file for this Page object. + * + * @param string $var the file path + * @return string|null the file path + */ + public function filePath($var = null) + { + if ($var !== null) { + // Filename of the page. + $this->name = basename($var); + // Folder of the page. + $this->folder = basename(dirname($var)); + // Path to the page. + $this->path = dirname(dirname($var)); + } + return $this->path . '/' . $this->folder . '/' . ($this->name ?: ''); + } + + /** + * Gets the relative path to the .md file + * + * @return string The relative file path + */ + public function filePathClean() + { + return str_replace(ROOT_DIR, '', $this->filePath()); + } + + /** + * Gets and sets the path to the folder where the .md for this Page object resides. + * This is equivalent to the filePath but without the filename. + * + * @param string $var the path + * @return string|null the path + */ + public function path($var = null) + { + if ($var !== null) { + // Folder of the page. + $this->folder = basename($var); + // Path to the page. + $this->path = dirname($var); + } + return $this->path ? $this->path . '/' . $this->folder : null; + } + + /** + * Get/set the folder. + * + * @param string $var Optional path + * @return string|null + */ + public function folder($var = null) + { + if ($var !== null) { + $this->folder = $var; + } + return $this->folder; + } + + /** + * Gets and sets the date for this Page object. This is typically passed in via the page headers + * + * @param string $var string representation of a date + * @return int unix timestamp representation of the date + */ + public function date($var = null) + { + if ($var !== null) { + $this->date = Utils::date2timestamp($var); + } + + if (!$this->date) { + $this->date = $this->modified; + } + + return $this->date; + } + + /** + * Gets and sets the order by which any sub-pages should be sorted. + * @param string $var the order, either "asc" or "desc" + * @return string the order, either "asc" or "desc" + */ + public function orderDir($var = null) + { + if ($var !== null) { + $this->order_dir = $var; + } + if (empty($this->order_dir)) { + $this->order_dir = 'asc'; + } + return $this->order_dir; + } + + /** + * Gets and sets the order by which the sub-pages should be sorted. + * + * default - is the order based on the file system, ie 01.Home before 02.Advark + * title - is the order based on the title set in the pages + * date - is the order based on the date set in the pages + * folder - is the order based on the name of the folder with any numerics omitted + * + * @param string $var supported options include "default", "title", "date", and "folder" + * @return string supported options include "default", "title", "date", and "folder" + */ + public function orderBy($var = null) + { + if ($var !== null) { + $this->order_by = $var; + } + return $this->order_by; + } + + /** + * Gets the manual order set in the header. + * + * @param string $var supported options include "default", "title", "date", and "folder" + * @return array + */ + public function orderManual($var = null) + { + if ($var !== null) { + $this->order_manual = $var; + } + return (array) $this->order_manual; + } + + /** + * Gets and sets the maxCount field which describes how many sub-pages should be displayed if the + * sub_pages header property is set for this page object. + * + * @param int $var the maximum number of sub-pages + * @return int the maximum number of sub-pages + */ + public function maxCount($var = null) + { + if ($var !== null) { + $this->max_count = (int) $var; + } + if (empty($this->max_count)) { + /** @var Config $config */ + $config = self::getGrav()['config']; + $this->max_count = (int) $config->get('system.pages.list.count'); + } + return $this->max_count; + } + + /** + * Gets and sets the taxonomy array which defines which taxonomies this page identifies itself with. + * + * @param array $var an array of taxonomies + * @return array an array of taxonomies + */ + public function taxonomy($var = null) + { + if ($var !== null) { + $this->taxonomy = $var; + } + return $this->taxonomy; + } + + /** + * Gets and sets the modular var that helps identify this parent page contains modular pages. + * + * @param bool $var true if modular_twig + * @return bool true if modular_twig + */ + public function modular($var = null) + { + return $this->modularTwig($var); + } + + /** + * Gets and sets the modular_twig var that helps identify this page as a modular page that will need + * twig processing handled differently from a regular page. + * + * @param bool $var true if modular_twig + * @return bool true if modular_twig + */ + public function modularTwig($var = null) + { + if ($var !== null) { + $this->modular_twig = (bool) $var; + if ($var) { + $this->process['twig'] = true; + $this->visible(false); + // some routable logic + if (empty($this->header->routable)) { + $this->routable = false; + } + } + } + return $this->modular_twig; + } + + /** + * Gets the configured state of the processing method. + * + * @param string $process the process, eg "twig" or "markdown" + * @return bool whether or not the processing method is enabled for this Page + */ + public function shouldProcess($process) + { + return isset($this->process[$process]) ? (bool) $this->process[$process] : false; + } + + /** + * Gets and Sets the parent object for this page + * + * @param Page $var the parent page object + * @return Page|null the parent page object if it exists. + */ + public function parent(Page $var = null) + { + if ($var) { + $this->parent = $var->path(); + return $var; + } + + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + + return $pages->get($this->parent); + } + + /** + * Returns children of this page. + * + * @return \Grav\Common\Page\Collection + */ + public function children() + { + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + return $pages->children($this->path()); + } + + + /** + * Check to see if this item is the first in an array of sub-pages. + * + * @return boolean True if item is first. + */ + public function isFirst() + { + $collection = $this->parent()->collection('content', false); + if ($collection instanceof Collection) { + return $collection->isFirst($this->path()); + } + return true; + } + + /** + * Check to see if this item is the last in an array of sub-pages. + * + * @return boolean True if item is last + */ + public function isLast() + { + $collection = $this->parent()->collection('content', false); + if ($collection instanceof Collection) { + return $collection->isLast($this->path()); + } + return true; + } + + /** + * Gets the previous sibling based on current position. + * + * @return Page the previous Page item + */ + public function prevSibling() + { + return $this->adjacentSibling(-1); + } + + /** + * Gets the next sibling based on current position. + * + * @return Page the next Page item + */ + public function nextSibling() + { + return $this->adjacentSibling(1); + } + + /** + * Returns the adjacent sibling based on a direction. + * + * @param integer $direction either -1 or +1 + * @return Page the sibling page + */ + public function adjacentSibling($direction = 1) + { + $collection = $this->parent()->collection('content', false); + if ($collection instanceof Collection) { + return $collection->adjacentSibling($this->path(), $direction); + } + return false; + } + + /** + * Returns whether or not this page is the currently active page requested via the URL. + * + * @return bool True if it is active + */ + public function active() + { + $uri_path = rtrim(self::getGrav()['uri']->path(), '/') ?: '/'; + $routes = self::getGrav()['pages']->routes(); + + if (isset($routes[$uri_path])) { + if ($routes[$uri_path] == $this->path()) { + return true; + } + + } + return false; + } + + /** + * Returns whether or not this URI's URL contains the URL of the active page. + * Or in other words, is this page's URL in the current URL + * + * @return bool True if active child exists + */ + public function activeChild() + { + $uri = self::getGrav()['uri']; + $pages = self::getGrav()['pages']; + $uri_path = rtrim($uri->path(), '/'); + $routes = self::getGrav()['pages']->routes(); + + if (isset($routes[$uri_path])) { + $child_page = $pages->dispatch($uri->route())->parent(); + if ($child_page) while (!$child_page->root()) { + if ($this->path() == $child_page->path()) { + return true; + } + $child_page = $child_page->parent(); + } + } + + return false; + } + + /** + * Returns whether or not this page is the currently configured home page. + * + * @return bool True if it is the homepage + */ + public function home() + { + return $this->find('/') == $this; + } + + /** + * Returns whether or not this page is the root node of the pages tree. + * + * @return bool True if it is the root + */ + public function root() + { + if (!$this->parent && !$this->name && !$this->visible) { + return true; + } else { + return false; + } + } + + /** + * Helper method to return a page. + * + * @param string $url the url of the page + * @param bool $all + * + * @return \Grav\Common\Page\Page page you were looking for if it exists + */ + public function find($url, $all = false) + { + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + return $pages->dispatch($url, $all); + } + + /** + * Get a collection of pages in the current context. + * + * @param string|array $params + * @param boolean $pagination + * @return Collection + * @throws \InvalidArgumentException + */ + public function collection($params = 'content', $pagination = true) + { + if (is_string($params)) { + $params = (array) $this->value('header.'.$params); + } elseif (!is_array($params)) { + throw new \InvalidArgumentException('Argument should be either header variable name or array of parameters'); + } + + if (!isset($params['items'])) { + return array(); + } + + $collection = $this->evaluate($params['items']); + if (!$collection instanceof Collection) { + $collection = new Collection(); + } + $collection->setParams($params); + + /** @var Uri $uri */ + $uri = self::getGrav()['uri']; + /** @var Config $config */ + $config = self::getGrav()['config']; + + $process_taxonomy = isset($params['url_taxonomy_filters']) ? $params['url_taxonomy_filters'] : $config->get('system.pages.url_taxonomy_filters'); + + if ($process_taxonomy) { + foreach ((array) $config->get('site.taxonomies') as $taxonomy) { + if ($uri->param($taxonomy)) { + $items = explode(',', $uri->param($taxonomy)); + $collection->setParams(['taxonomies' => [$taxonomy => $items]]); + + foreach ($collection as $page) { + // Don't filter modular pages + if ($page->modular()) { + continue; + } + foreach ($items as $item) { + if (empty($page->taxonomy[$taxonomy]) + || !in_array(htmlspecialchars_decode($item, ENT_QUOTES), $page->taxonomy[$taxonomy])) { + $collection->remove(); + } + } + } + } + } + } + + if (isset($params['dateRange'])) { + $start = isset($params['dateRange']['start']) ? $params['dateRange']['start'] : 0; + $end = isset($params['dateRange']['end']) ? $params['dateRange']['end'] : false; + $field = isset($params['dateRange']['field']) ? $params['dateRange']['field'] : false; + $collection->dateRange($start, $end, $field); + } + + if (isset($params['order'])) { + $by = isset($params['order']['by']) ? $params['order']['by'] : 'default'; + $dir = isset($params['order']['dir']) ? $params['order']['dir'] : 'asc'; + $custom = isset($params['order']['custom']) ? $params['order']['custom'] : null; + $collection->order($by, $dir, $custom); + } + + /** @var Grav $grav */ + $grav = self::getGrav()['grav']; + + // New Custom event to handle things like pagination. + $grav->fireEvent('onCollectionProcessed', new Event(['collection' => $collection])); + + // Slice and dice the collection if pagination is required + if ($pagination) { + $params = $collection->params(); + + $limit = isset($params['limit']) ? $params['limit'] : 0; + $start = !empty($params['pagination']) ? ($uri->currentPage() - 1) * $limit : 0; + + if ($limit && $collection->count() > $limit) { + $collection->slice($start, $limit); + } + } + + return $collection; + } + + /** + * @param string $value + * + * @return mixed + * @internal + */ + protected function evaluate($value) + { + // Parse command. + if (is_string($value)) { + // Format: @command.param + $cmd = $value; + $params = array(); + } elseif (is_array($value) && count($value) == 1 && !is_int(key($value))) { + // Format: @command.param: { attr1: value1, attr2: value2 } + $cmd = (string) key($value); + $params = (array) current($value); + } else { + $result = []; + foreach($value as $key => $val) { + if (is_int($key)) { + $result = $result + $this->evaluate($val)->toArray(); + } else { + $result = $result + $this->evaluate([$key=>$val])->toArray(); + } + + } + return new Collection($result); + } + + // We only evaluate commands which start with @ + if (empty($cmd) || $cmd[0] != '@') { + return $value; + } + + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + + $parts = explode('.', $cmd); + $current = array_shift($parts); + + $results = new Collection(); + switch ($current) { + case '@self': + if (!empty($parts)) { + switch ($parts[0]) { + case 'modular': + // @self.modular: false (alternative to @self.children) + if (!empty($params) && $params[0] === false) { + $results = $this->children()->nonModular(); + break; + } + $results = $this->children()->modular(); + break; + case 'children': + $results = $this->children()->nonModular(); + break; + + case 'parent': + $collection = new Collection(); + $results = $collection->addPage($this->parent()); + break; + + case 'siblings': + $results = $this->parent()->children()->remove($this->path()); + break; + + case 'descendants': + $results = $pages->all($this)->remove($this->path())->nonModular(); + break; + } + } + + $results = $results->published(); + break; + + case '@page': + $page = null; + + if (!empty($params)) { + $page = $this->find($params[0]); + } + + // safety check in case page is not found + if (!isset($page)) { + return $results; + } + + // Handle a @page.descendants + if (!empty($parts)) { + switch ($parts[0]) { + case 'self': + $results = new Collection(); + $results = $results->addPage($page); + break; + + case 'descendants': + $results = $pages->all($page)->remove($page->path()); + break; + + case 'children': + $results = $page->children(); + break; + } + } else { + $results = $page->children(); + } + + $results = $results->nonModular()->published(); + + break; + + case '@root': + if (!empty($parts) && $parts[0] == 'descendants') { + $results = $pages->all($pages->root())->nonModular()->published(); + } else { + $results = $pages->root()->children()->nonModular()->published(); + } + break; + + + case '@taxonomy': + // Gets a collection of pages by using one of the following formats: + // @taxonomy.category: blog + // @taxonomy.category: [ blog, featured ] + // @taxonomy: { category: [ blog, featured ], level: 1 } + + /** @var Taxonomy $taxonomy_map */ + $taxonomy_map = self::getGrav()['taxonomy']; + + if (!empty($parts)) { + $params = [implode('.', $parts) => $params]; + } + $results = $taxonomy_map->findTaxonomy($params)->published(); + break; + } + + return $results; + } + + /** + * Returns whether or not this Page object has a .md file associated with it or if its just a directory. + * + * @return bool True if its a page with a .md file associated + */ + public function isPage() + { + if ($this->name) { + return true; + } + return false; + } + + /** + * Returns whether or not this Page object is a directory or a page. + * + * @return bool True if its a directory + */ + public function isDir() + { + return !$this->isPage(); + } + + /** + * Returns whether the page exists in the filesystem. + * + * @return bool + */ + public function exists() + { + $file = $this->file(); + return $file && $file->exists(); + } + + /** + * Cleans the path. + * + * @param string $path the path + * @return string the path + */ + protected function cleanPath($path) + { + $lastchunk = strrchr($path, DS); + if (strpos($lastchunk, ':') !== false) { + $path = str_replace($lastchunk, '', $path); + } + return $path; + } + + /** + * Moves or copies the page in filesystem. + * + * @internal + */ + protected function doRelocation($reorder) + { + if (empty($this->_original) ) { + return; + } + + // Do reordering. + if ($reorder && $this->order() != $this->_original->order()) { + /** @var Pages $pages */ + $pages = self::getGrav()['pages']; + + $parent = $this->parent(); + + // Extract visible children from the parent page. + $list = array(); + /** @var Page $page */ + foreach ($parent->children()->visible() as $page) { + if ($page->order()) { + $list[$page->slug] = $page->path(); + } + } + + // If page was moved, take it out of the list. + if ($this->_action == 'move') { + unset($list[$this->slug()]); + } + + $list = array_values($list); + + // Then add it back to the new location (if needed). + if ($this->order()) { + array_splice($list, min($this->order()-1, count($list)), 0, array($this->path())); + } + + // Reorder all moved pages. + foreach ($list as $order => $path) { + if ($path == $this->path()) { + // Handle current page; we do want to change ordering number, but nothing else. + $this->order($order+1); + } else { + // Handle all the other pages. + $page = $pages->get($path); + + if ($page && $page->exists() && $page->order() != $order+1) { + $page = $page->move($parent); + $page->order($order+1); + $page->save(false); + } + } + } + } + if ($this->_action == 'move' && $this->_original->exists()) { + Folder::move($this->_original->path(), $this->path()); + } + if ($this->_action == 'copy' && $this->_original->exists()) { + Folder::copy($this->_original->path(), $this->path()); + } + + if ($this->name() != $this->_original->name()) { + $path = $this->path(); + if (is_file($path . '/' . $this->_original->name())) { + rename($path . '/' . $this->_original->name(), $path . '/' . $this->name()); + } + } + + $this->_action = null; + $this->_original = null; + } + + protected function setPublishState() + { + // Handle publishing dates if no explict published option set + if (self::getGrav()['config']->get('system.pages.publish_dates') && !isset($this->header->published)) { + // unpublish if required, if not clear cache right before page should be unpublished + if ($this->unpublishDate()) { + if ($this->unpublishDate() < time()) { + $this->published(false); + } else { + $this->published(); + self::getGrav()['cache']->setLifeTime($this->unpublishDate()); + } + } + // publish if required, if not clear cache right before page is published + if ($this->publishDate() != $this->modified() && $this->publishDate() > time()) { + $this->published(false); + self::getGrav()['cache']->setLifeTime($this->publishDate()); + } + } + } +} diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php new file mode 100644 index 0000000..ccb7530 --- /dev/null +++ b/system/src/Grav/Common/Page/Pages.php @@ -0,0 +1,915 @@ +grav = $c; + $this->base = ''; + } + + /** + * Get or set base path for the pages. + * + * @param string $path + * @return string + */ + public function base($path = null) + { + if ($path !== null) { + $path = trim($path, '/'); + $this->base = $path ? '/' . $path : null; + } + + return $this->base; + } + + /** + * Class initialization. Must be called before using this class. + */ + public function init() + { + $config = $this->grav['config']; + $this->ignore_files = $config->get('system.pages.ignore_files'); + $this->ignore_folders = $config->get('system.pages.ignore_folders'); + $this->ignore_hidden = $config->get('system.pages.ignore_hidden'); + + $this->buildPages(); + } + + /** + * Get or set last modification time. + * + * @param int $modified + * @return int|null + */ + public function lastModified($modified = null) + { + if ($modified && $modified > $this->last_modified) { + $this->last_modified = $modified; + } + return $this->last_modified; + } + + /** + * Returns a list of all pages. + * + * @return Page + */ + public function instances() + { + return $this->instances; + } + + /** + * Returns a list of all routes. + * + * @return array + */ + public function routes() + { + return $this->routes; + } + + /** + * Adds a page and assigns a route to it. + * + * @param Page $page Page to be added. + * @param string $route Optional route (uses route from the object if not set). + */ + public function addPage(Page $page, $route = null) + { + if (!isset($this->instances[$page->path()])) { + $this->instances[$page->path()] = $page; + } + $route = $page->route($route); + if ($page->parent()) { + $this->children[$page->parent()->path()][$page->path()] = array('slug' => $page->slug()); + } + $this->routes[$route] = $page->path(); + } + + /** + * Sort sub-pages in a page. + * + * @param Page $page + * @param string $order_by + * @param string $order_dir + * + * @return array + */ + public function sort(Page $page, $order_by = null, $order_dir = null) + { + if ($order_by === null) { + $order_by = $page->orderBy(); + } + if ($order_dir === null) { + $order_dir = $page->orderDir(); + } + + $path = $page->path(); + $children = isset($this->children[$path]) ? $this->children[$path] : array(); + + if (!$children) { + return $children; + } + + if (!isset($this->sort[$path][$order_by])) { + $this->buildSort($path, $children, $order_by, $page->orderManual()); + } + + $sort = $this->sort[$path][$order_by]; + + if ($order_dir != 'asc') { + $sort = array_reverse($sort); + } + + return $sort; + } + + /** + * @param Collection $collection + * @param $orderBy + * @param string $orderDir + * @param null $orderManual + * @return array + * @internal + */ + public function sortCollection(Collection $collection, $orderBy, $orderDir = 'asc', $orderManual = null) + { + $items = $collection->toArray(); + if (!$items) { + return []; + } + + $lookup = md5(json_encode($items)); + if (!isset($this->sort[$lookup][$orderBy])) { + $this->buildSort($lookup, $items, $orderBy, $orderManual); + } + + $sort = $this->sort[$lookup][$orderBy]; + + if ($orderDir != 'asc') { + $sort = array_reverse($sort); + } + + return $sort; + + } + + /** + * Get a page instance. + * + * @param string $path + * @return Page + * @throws \Exception + */ + public function get($path) + { + if (!is_null($path) && !is_string($path)) { + throw new \Exception(); + } + return isset($this->instances[(string) $path]) ? $this->instances[(string) $path] : null; + } + + /** + * Get children of the path. + * + * @param string $path + * @return Collection + */ + public function children($path) + { + $children = isset($this->children[(string) $path]) ? $this->children[(string) $path] : array(); + return new Collection($children, array(), $this); + } + + /** + * Dispatch URI to a page. + * + * @param $url + * @param bool $all + * @return Page|null + */ + public function dispatch($url, $all = false) + { + // Fetch page if there's a defined route to it. + $page = isset($this->routes[$url]) ? $this->get($this->routes[$url]) : null; + + // Are we in the admin? this is important! + $not_admin = !isset($this->grav['admin']); + + // If the page cannot be reached, look into site wide redirects, routes + wildcards + if (!$all && $not_admin && (!$page || ($page && !$page->routable()) || ($page && $page->redirect()))) { + + // If the page is a simple redirect, just do it. + if ($page && $page->redirect()) { + $this->grav->redirectLangSafe($page->redirect()); + } + + /** @var Config $config */ + $config = $this->grav['config']; + + // See if route matches one in the site configuration + $route = $config->get("site.routes.{$url}"); + if ($route) { + $page = $this->dispatch($route, $all); + } else { + // Try Regex style redirects + foreach ((array)$config->get("site.redirects") as $pattern => $replace) { + $pattern = '#' . $pattern . '#'; + try { + $found = preg_replace($pattern, $replace, $url); + if ($found != $url) { + $this->grav->redirectLangSafe($found); + } + } catch (ErrorException $e) { + $this->grav['log']->error('site.redirects: ' . $pattern . '-> ' . $e->getMessage()); + } + } + + // Try Regex style routes + foreach ((array)$config->get("site.routes") as $pattern => $replace) { + $pattern = '#' . $pattern . '#'; + try { + $found = preg_replace($pattern, $replace, $url); + if ($found != $url) { + $page = $this->dispatch($found, $all); + } + } catch (ErrorException $e) { + $this->grav['log']->error('site.routes: '. $pattern . '-> ' . $e->getMessage()); + } + } + } + } + + return $page; + } + + /** + * Get root page. + * + * @return Page + */ + public function root() + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + return $this->instances[rtrim($locator->findResource('page://'), DS)]; + } + + /** + * Get a blueprint for a page type. + * + * @param string $type + * @return Blueprint + */ + public function blueprints($type) + { + if (!isset($this->blueprints)) { + $this->blueprints = new Blueprints(self::getTypes()); + } + + try { + $blueprint = $this->blueprints->get($type); + } catch (\RuntimeException $e) { + $blueprint = $this->blueprints->get('default'); + } + + if (!$blueprint->initialized) { + $this->grav->fireEvent('onBlueprintCreated', new Event(['blueprint' => $blueprint])); + $blueprint->initialized = true; + } + + return $blueprint; + } + + /** + * Get all pages + * + * @param \Grav\Common\Page\Page $current + * @return \Grav\Common\Page\Collection + */ + public function all(Page $current = null) + { + $all = new Collection(); + + /** @var Page $current */ + $current = $current ?: $this->root(); + + if (!$current->root()) { + $all[$current->path()] = [ 'slug' => $current->slug() ]; + } + + foreach ($current->children() as $next) { + $all->append($this->all($next)); + } + + return $all; + } + + /** + * Get list of route/title of all pages. + * + * @param Page $current + * @param int $level + * @return array + * @throws \RuntimeException + */ + public function getList(Page $current = null, $level = 0) + { + if (!$current) { + if ($level) { + throw new \RuntimeException('Internal error'); + } + + $current = $this->root(); + } + + $list = array(); + + if (!$current->root()) { + $list[$current->route()] = str_repeat('  ', ($level-1)*2) . $current->title(); + } + + foreach ($current->children() as $next) { + $list = array_merge($list, $this->getList($next, $level + 1)); + } + + return $list; + } + + /** + * Get available page types. + * + * @return Types + */ + public static function getTypes() + { + $locator = Grav::instance()['locator']; + if (!self::$types) { + self::$types = new Types(); + file_exists('theme://blueprints/') && self::$types->scanBlueprints($locator->findResources('theme://blueprints/')); + file_exists('theme://templates/') && self::$types->scanTemplates($locator->findResources('theme://templates/')); + + $event = new Event(); + $event->types = self::$types; + Grav::instance()->fireEvent('onGetPageTemplates', $event); + } + + return self::$types; + } + + /** + * Get available page types. + * + * @return array + */ + public static function types() + { + $types = self::getTypes(); + + return $types->pageSelect(); + } + + /** + * Get available page types. + * + * @return array + */ + public static function modularTypes() + { + $types = self::getTypes(); + + return $types->modularSelect(); + } + + /** + * Get template types based on page type (standard or modular) + * + * @return array + */ + public static function pageTypes() + { + /** @var Admin $admin */ + $admin = Grav::instance()['admin']; + + /** @var Page $page */ + $page = $admin->getPage($admin->route); + + if ($page && $page->modular()) { + return static::modularTypes(); + } + + return static::types(); + } + + /** + * Get available parents. + * + * @return array + */ + public static function parents() + { + $grav = Grav::instance(); + + /** @var Pages $pages */ + $pages = $grav['pages']; + + return $pages->getList(); + } + + /** + * Get's the home route + * + * @return string + */ + public static function getHomeRoute() + { + if (empty(self::$home)) { + $grav = Grav::instance(); + + /** @var Config $config */ + $config = $grav['config']; + + /** @var Language $language */ + $language = $grav['language']; + + $home = $config->get('system.home.alias'); + + if ($language->enabled()) { + $home_aliases = $config->get('system.home.aliases'); + if ($home_aliases) { + $active = $language->getActive(); + $default = $language->getDefault(); + + try { + if ($active) { + $home = $home_aliases[$active]; + } else { + $home = $home_aliases[$default]; + } + } catch (ErrorException $e) { + $home = $home_aliases[$default]; + } + + } + } + + self::$home_route = trim($home, '/'); + } + return self::$home_route; + } + + /** + * Builds pages. + * + * @internal + */ + protected function buildPages() + { + $this->sort = array(); + + /** @var Config $config */ + $config = $this->grav['config']; + + /** @var Language $language */ + $language = $this->grav['language']; + + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + $pages_dir = $locator->findResource('page://'); + + if ($config->get('system.cache.enabled')) { + /** @var Cache $cache */ + $cache = $this->grav['cache']; + /** @var Taxonomy $taxonomy */ + $taxonomy = $this->grav['taxonomy']; + + // how should we check for last modified? Default is by file + switch (strtolower($config->get('system.cache.check.method', 'file'))) { + case 'none': + case 'off': + $last_modified = 0; + break; + case 'folder': + $last_modified = Folder::lastModifiedFolder($pages_dir); + break; + default: + $last_modified = Folder::lastModifiedFile($pages_dir); + } + + $page_cache_id = md5(USER_DIR.$last_modified.$language->getActive().$config->checksum()); + + list($this->instances, $this->routes, $this->children, $taxonomy_map, $this->sort) = $cache->fetch($page_cache_id); + if (!$this->instances) { + $this->grav['debugger']->addMessage('Page cache missed, rebuilding pages..'); + + // recurse pages and cache result + $this->resetPages($pages_dir, $page_cache_id); + + } else { + // If pages was found in cache, set the taxonomy + $this->grav['debugger']->addMessage('Page cache hit.'); + $taxonomy->taxonomy($taxonomy_map); + } + } else { + $this->recurse($pages_dir); + $this->buildRoutes(); + } + } + + /** + * Accessible method to manually reset the pages cache + * + * @param $pages_dir + * @param $page_cache_id + */ + public function resetPages($pages_dir, $page_cache_id) + { + $this->recurse($pages_dir); + $this->buildRoutes(); + + // cache if needed + if ($this->grav['config']->get('system.cache.enabled')) { + /** @var Cache $cache */ + $cache = $this->grav['cache']; + /** @var Taxonomy $taxonomy */ + $taxonomy = $this->grav['taxonomy']; + + // save pages, routes, taxonomy, and sort to cache + $cache->save( + $page_cache_id, + array($this->instances, $this->routes, $this->children, $taxonomy->taxonomy(), $this->sort) + ); + } + } + + /** + * Recursive function to load & build page relationships. + * + * @param string $directory + * @param Page|null $parent + * @return Page + * @throws \RuntimeException + * @internal + */ + protected function recurse($directory, Page &$parent = null) + { + $directory = rtrim($directory, DS); + $page = new Page; + + /** @var Config $config */ + $config = $this->grav['config']; + + /** @var Language $language */ + $language = $this->grav['language']; + + // stuff to do at root page + if ($parent === null) { + + // Fire event for memory and time consuming plugins... + if ($config->get('system.pages.events.page')) { + $this->grav->fireEvent('onBuildPagesInitialized'); + } + } + + $page->path($directory); + if ($parent) { + $page->parent($parent); + } + + $page->orderDir($config->get('system.pages.order.dir')); + $page->orderBy($config->get('system.pages.order.by')); + + // Add into instances + if (!isset($this->instances[$page->path()])) { + $this->instances[$page->path()] = $page; + if ($parent && $page->path()) { + $this->children[$parent->path()][$page->path()] = array('slug' => $page->slug()); + } + } else { + throw new \RuntimeException('Fatal error when creating page instances.'); + } + + $content_exists = false; + $pages_found = glob($directory.'/*'.CONTENT_EXT); + $page_extensions = $language->getFallbackPageExtensions(); + + if ($pages_found) { + foreach ($page_extensions as $extension) { + foreach ($pages_found as $found) { + if (preg_match('/^.*\/[0-9A-Za-z\-\_]+('.$extension.')$/', $found)) { + $page_found = $found; + $page_extension = $extension; + break 2; + } + } + } + } + + if ($parent && !empty($page_found)) { + $file = new \SplFileInfo($page_found); + $page->init($file, $page_extension); + + $content_exists = true; + + if ($config->get('system.pages.events.page')) { + $this->grav->fireEvent('onPageProcessed', new Event(['page' => $page])); + } + } + + // set current modified of page + $last_modified = $page->modified(); + + /** @var \DirectoryIterator $file */ + foreach (new \FilesystemIterator($directory) as $file) { + $name = $file->getFilename(); + + // Ignore all hidden files if set. + if ($this->ignore_hidden) { + if ($name && $name[0] == '.') { + continue; + } + } + + if ($file->isFile()) { + // Update the last modified if it's newer than already found + if (!in_array($file->getBasename(), $this->ignore_files) && ($modified = $file->getMTime()) > $last_modified) { + $last_modified = $modified; + } + } elseif ($file->isDir() && !in_array($file->getFilename(), $this->ignore_folders)) { + if (!$page->path()) { + $page->path($file->getPath()); + } + + $path = $directory.DS.$name; + $child = $this->recurse($path, $page); + + if (Utils::startsWith($name, '_')) { + $child->routable(false); + } + + $this->children[$page->path()][$child->path()] = array('slug' => $child->slug()); + + if ($config->get('system.pages.events.page')) { + $this->grav->fireEvent('onFolderProcessed', new Event(['page' => $page])); + } + } + } + + // Set routability to false if no page found + if (!$content_exists) { + $page->routable(false); + } + + // Override the modified and ID so that it takes the latest change into account + $page->modified($last_modified); + $page->id($last_modified.md5($page->filePath())); + + // Sort based on Defaults or Page Overridden sort order + $this->children[$page->path()] = $this->sort($page); + + return $page; + } + + /** + * @internal + */ + protected function buildRoutes() + { + /** @var $taxonomy Taxonomy */ + $taxonomy = $this->grav['taxonomy']; + + // Get the home route + $home = self::getHomeRoute(); + + // Build routes and taxonomy map. + /** @var $page Page */ + foreach ($this->instances as $page) { + if (!$page->root()) { + // process taxonomy + $taxonomy->addTaxonomy($page); + + $route = $page->route(); + $raw_route = $page->rawRoute(); + $page_path = $page->path(); + + // add regular route + $this->routes[$route] = $page_path; + + // add raw route + if ($raw_route != $route) { + $this->routes[$raw_route] = $page_path; + } + + // add canonical route + $route_canonical = $page->routeCanonical(); + if ($route_canonical && ($route !== $route_canonical)) { + $this->routes[$route_canonical] = $page_path; + } + + // add aliases to routes list if they are provided + $route_aliases = $page->routeAliases(); + if ($route_aliases) { + foreach ($route_aliases as $alias) { + $this->routes[$alias] = $page_path; + } + } + } + } + + // Alias and set default route to home page. + if ($home && isset($this->routes['/' . $home])) { + $this->routes['/'] = $this->routes['/' . $home]; + $this->get($this->routes['/' . $home])->route('/'); + } + } + + /** + * @param string $path + * @param array $pages + * @param string $order_by + * @param array $manual + * @throws \RuntimeException + * @internal + */ + protected function buildSort($path, array $pages, $order_by = 'default', $manual = null) + { + $list = array(); + $header_default = null; + $header_query = null; + + // do this headery query work only once + if (strpos($order_by, 'header.') === 0) { + $header_query = explode('|', str_replace('header.', '', $order_by)); + if (isset($header_query[1])) { + $header_default = $header_query[1]; + } + } + + foreach ($pages as $key => $info) { + $child = isset($this->instances[$key]) ? $this->instances[$key] : null; + if (!$child) { + throw new \RuntimeException("Page does not exist: {$key}"); + } + + switch ($order_by) { + case 'title': + $list[$key] = $child->title(); + break; + case 'date': + $list[$key] = $child->date(); + break; + case 'modified': + $list[$key] = $child->modified(); + break; + case 'slug': + $list[$key] = $child->slug(); + break; + case 'basename': + $list[$key] = basename($key); + break; + case (is_string($header_query[0])): + $child_header = new Header((array)$child->header()); + $header_value = $child_header->get($header_query[0]); + if ($header_value) { + $list[$key] = $header_value; + } else { + $list[$key] = $header_default ?: $key; + } + break; + case 'manual': + case 'default': + default: + $list[$key] = $key; + } + } + + // handle special case when order_by is random + if ($order_by == 'random') { + $list = $this->arrayShuffle($list); + } else { + // else just sort the list according to specified key + asort($list); + } + + + // Move manually ordered items into the beginning of the list. Order of the unlisted items does not change. + if (is_array($manual) && !empty($manual)) { + $new_list = array(); + $i = count($manual); + + foreach ($list as $key => $dummy) { + $info = $pages[$key]; + $order = array_search($info['slug'], $manual); + if ($order === false) { + $order = $i++; + } + $new_list[$key] = (int) $order; + } + + $list = $new_list; + + // Apply manual ordering to the list. + asort($list); + } + + foreach ($list as $key => $sort) { + $info = $pages[$key]; + $this->sort[$path][$order_by][$key] = $info; + } + } + + // Shuffles and associative array + protected function arrayShuffle($list) + { + $keys = array_keys($list); + shuffle($keys); + + $new = array(); + foreach ($keys as $key) { + $new[$key] = $list[$key]; + } + + return $new; + } +} diff --git a/system/src/Grav/Common/Page/Types.php b/system/src/Grav/Common/Page/Types.php new file mode 100644 index 0000000..6ef1191 --- /dev/null +++ b/system/src/Grav/Common/Page/Types.php @@ -0,0 +1,110 @@ +systemBlueprints && isset($this->systemBlueprints[$type])) { + $useBlueprint = $this->systemBlueprints[$type]; + } else { + $useBlueprint = $blueprint; + } + + if ($blueprint || empty($this->items[$type])) { + $this->items[$type] = $useBlueprint; + } + } + + public function scanBlueprints($paths) + { + $this->items = $this->findBlueprints($paths) + $this->items; + } + + public function scanTemplates($paths) + { + $options = [ + 'compare' => 'Filename', + 'pattern' => '|\.html\.twig$|', + 'filters' => [ + 'value' => '|\.html\.twig$|' + ], + 'value' => 'Filename', + 'recursive' => false + ]; + + if (!$this->systemBlueprints) { + $this->systemBlueprints = $this->findBlueprints('blueprints://pages'); + } + + // register default by default + $this->register('default'); + + foreach ((array) $paths as $path) { + foreach (Folder::all($path, $options) as $type) { + $this->register($type); + } + $modular_path = rtrim($path, '/') . '/modular'; + if (file_exists($modular_path)) { + foreach (Folder::all($modular_path, $options) as $type) { + $this->register('modular/' . $type); + } + } + } + } + + public function pageSelect() + { + $list = []; + foreach ($this->items as $name => $file) { + if (strpos($name, '/')) { + continue; + } + $list[$name] = ucfirst(strtr($name, '_', ' ')); + } + ksort($list); + return $list; + } + + public function modularSelect() + { + $list = []; + foreach ($this->items as $name => $file) { + if (strpos($name, 'modular/') !== 0) { + continue; + } + $list[$name] = trim(ucfirst(strtr(basename($name), '_', ' '))); + } + ksort($list); + return $list; + } + + private function findBlueprints($paths) + { + $options = [ + 'compare' => 'Filename', + 'pattern' => '|\.yaml$|', + 'filters' => [ + 'key' => '|\.yaml$|' + ], + 'key' => 'SubPathName', + 'value' => 'PathName', + ]; + + foreach ((array) $paths as $path) { + return Folder::all($path, $options); + } + } +} diff --git a/system/src/Grav/Common/Plugin.php b/system/src/Grav/Common/Plugin.php new file mode 100644 index 0000000..3f2f90a --- /dev/null +++ b/system/src/Grav/Common/Plugin.php @@ -0,0 +1,185 @@ +grav = $grav; + $this->config = $config; + $this->name = $name; + } + + public function isAdmin() + { + if (isset($this->grav['admin'])) { + return true; + } + return false; + } + + /** + * @param array $events + */ + protected function enable(array $events) + { + /** @var EventDispatcher $dispatcher */ + $dispatcher = $this->grav['events']; + + foreach ($events as $eventName => $params) { + if (is_string($params)) { + $dispatcher->addListener($eventName, array($this, $params)); + } elseif (is_string($params[0])) { + $dispatcher->addListener($eventName, array($this, $params[0]), isset($params[1]) ? $params[1] : 0); + } else { + foreach ($params as $listener) { + $dispatcher->addListener($eventName, array($this, $listener[0]), isset($listener[1]) ? $listener[1] : 0); + } + } + } + } + + /** + * @param array $events + */ + protected function disable(array $events) + { + /** @var EventDispatcher $dispatcher */ + $dispatcher = $this->grav['events']; + + foreach ($events as $eventName => $params) { + if (is_string($params)) { + $dispatcher->removeListener($eventName, array($this, $params)); + } elseif (is_string($params[0])) { + $dispatcher->removeListener($eventName, array($this, $params[0])); + } else { + foreach ($params as $listener) { + $dispatcher->removeListener($eventName, array($this, $listener[0])); + } + } + } + } + + /** + * This function will search a string for markdown links in a specific format. The link value can be + * optionally compared against via the $internal_regex and operated on by the callback $function + * provided. + * + * format: [plugin:myplugin_name](function_data) + * + * @param $content The string to perform operations upon + * @param $function The anonymous callback function + * @param string $internal_regex Optional internal regex to extra data from + * + * @return string + */ + protected function parseLinks($content, $function, $internal_regex = '(.*)') + { + $regex = '/\[plugin:(?:'.$this->name.')\]\('.$internal_regex.'\)/i'; + return preg_replace_callback($regex, $function, $content); + } + + /** + * Merge global and page configurations. + * + * @param Page $page The page to merge the configurations with the + * plugin settings. + * @param bool $deep Should you use deep or shallow merging + * @param array $params Array of additional configuration options to + * merge with the plugin settings. + * + * @return \Grav\Common\Data\Data + */ + protected function mergeConfig(Page $page, $deep = false, $params = []) + { + $class_name = $this->name; + $class_name_merged = $class_name . '.merged'; + $defaults = $this->config->get('plugins.'. $class_name, []); + $page_header = $page->header(); + $header = []; + if (!isset($page_header->$class_name_merged) && isset($page_header->$class_name)) { + // Get default plugin configurations and retrieve page header configuration + $config = $page_header->$class_name; + if (is_bool($config)) { + // Overwrite enabled option with boolean value in page header + $config = ['enabled' => $config]; + } + // Merge page header settings using deep or shallow merging technique + if ($deep) { + $header = array_replace_recursive($defaults, $config); + } else { + $header = array_merge($defaults, $config); + } + // Create new config object and set it on the page object so it's cached for next time + $page->modifyHeader($class_name_merged, new Data($header)); + } else if (isset($page_header->$class_name_merged)) { + $merged = $page_header->$class_name_merged; + $header = $merged->toArray(); + } + if (empty($header)) { + $header = $defaults; + } + // Merge additional parameter with configuration options + if ($deep) { + $header = array_replace_recursive($header, $params); + } else { + $header = array_merge($header, $params); + } + // Return configurations as a new data config class + return new Data($header); + } +} diff --git a/system/src/Grav/Common/Plugins.php b/system/src/Grav/Common/Plugins.php new file mode 100644 index 0000000..93da156 --- /dev/null +++ b/system/src/Grav/Common/Plugins.php @@ -0,0 +1,137 @@ +get('plugins'); + + $inflector = self::getGrav()['inflector']; + + /** @var EventDispatcher $events */ + $events = self::getGrav()['events']; + + foreach ($plugins as $plugin => $data) { + if (empty($data['enabled'])) { + // Only load enabled plugins. + continue; + } + + $locator = self::getGrav()['locator']; + $filePath = $locator->findResource('plugins://' . $plugin . DS . $plugin . PLUGIN_EXT); + if (!is_file($filePath)) { + self::getGrav()['log']->addWarning(sprintf("Plugin '%s' enabled but not found! Try clearing cache with `bin/grav clear-cache`", $plugin)); + continue; + } + + require_once $filePath; + + $pluginClassFormat = [ + 'Grav\\Plugin\\'.ucfirst($plugin).'Plugin', + 'Grav\\Plugin\\'.$inflector->camelize($plugin).'Plugin' + ]; + $pluginClassName = false; + + foreach ($pluginClassFormat as $pluginClass) { + if (class_exists($pluginClass)) { + $pluginClassName = $pluginClass; + break; + } + } + + if (false === $pluginClassName) { + throw new \RuntimeException(sprintf("Plugin '%s' class not found! Try reinstalling this plugin.", $plugin)); + } + + $instance = new $pluginClassName($plugin, self::getGrav(), $config); + if ($instance instanceof EventSubscriberInterface) { + $events->addSubscriber($instance); + } + } + + return $this->items; + } + + public function add($plugin) + { + if (is_object($plugin)) { + $this->items[get_class($plugin)] = $plugin; + } + } + + /** + * Return list of all plugin data with their blueprints. + * + * @return array + */ + public static function all() + { + $list = array(); + $locator = Grav::instance()['locator']; + + $plugins = (array) $locator->findResources('plugins://', false); + foreach ($plugins as $path) { + $iterator = new \DirectoryIterator($path); + + /** @var \DirectoryIterator $directory */ + foreach ($iterator as $directory) { + if (!$directory->isDir() || $directory->isDot()) { + continue; + } + + $type = $directory->getBasename(); + $list[$type] = self::get($type); + } + } + ksort($list); + + return $list; + } + + public static function get($name) + { + $blueprints = new Blueprints('plugins://'); + $blueprint = $blueprints->get("{$name}/blueprints"); + $blueprint->name = $name; + + // Load default configuration. + $file = CompiledYamlFile::instance("plugins://{$name}/{$name}.yaml"); + $obj = new Data($file->content(), $blueprint); + + // Override with user configuration. + $obj->merge(self::getGrav()['config']->get('plugins.' . $name) ?: []); + + // Save configuration always to user/config. + $file = CompiledYamlFile::instance("config://plugins/{$name}.yaml"); + $obj->file($file); + + return $obj; + } + +} diff --git a/system/src/Grav/Common/Service/ConfigServiceProvider.php b/system/src/Grav/Common/Service/ConfigServiceProvider.php new file mode 100644 index 0000000..28a6ac4 --- /dev/null +++ b/system/src/Grav/Common/Service/ConfigServiceProvider.php @@ -0,0 +1,64 @@ +setup = is_file($file) ? (array) include $file : []; + $this->environment = isset($this->setup['environment']) ? $this->setup['environment'] : null; + + $container['blueprints'] = function ($c) use ($self) { + return $self->loadMasterBlueprints($c); + }; + + $container['config'] = function ($c) use ($self) { + return $self->loadMasterConfig($c); + }; + } + + public function loadMasterConfig(Container $container) + { + $environment = $this->getEnvironment($container); + + $config = new Config($this->setup, $container, $environment); + + return $config; + } + + public function loadMasterBlueprints(Container $container) + { + $environment = $this->getEnvironment($container); + $file = CACHE_DIR . 'compiled/blueprints/master-'.$environment.'.php'; + $data = is_file($file) ? (array) include $file : []; + + return new Blueprints($data, $container); + } + + public function getEnvironment(Container $container) + { + if (!isset($this->environment)) { + $this->environment = $container['uri']->environment(); + } + + return $this->environment; + } +} diff --git a/system/src/Grav/Common/Service/ErrorServiceProvider.php b/system/src/Grav/Common/Service/ErrorServiceProvider.php new file mode 100644 index 0000000..ac676ad --- /dev/null +++ b/system/src/Grav/Common/Service/ErrorServiceProvider.php @@ -0,0 +1,44 @@ +setPageTitle('Crikey! There was an error...'); + $error_page->setEditor('sublime'); + $error_page->addResourcePath(GRAV_ROOT . '/system/assets'); + $error_page->addCustomCss('whoops.css'); + + $json_page = new JsonResponseHandler; + $json_page->onlyForAjaxRequests(true); + + $errors->pushHandler($error_page, 'pretty'); + $errors->pushHandler(new PlainTextHandler, 'text'); + $errors->pushHandler($json_page, 'json'); + + $logger = $container['log']; + $errors->pushHandler(function (\Exception $exception, $inspector, $run) use ($logger) { + try { + $logger->addCritical($exception->getMessage() . ' - Trace: ' . $exception->getTraceAsString()); + } catch (\Exception $e) { + echo $e; + } + }, 'log'); + + $errors->register(); + + $container['errors'] = $errors; + } +} diff --git a/system/src/Grav/Common/Service/LoggerServiceProvider.php b/system/src/Grav/Common/Service/LoggerServiceProvider.php new file mode 100644 index 0000000..edaf921 --- /dev/null +++ b/system/src/Grav/Common/Service/LoggerServiceProvider.php @@ -0,0 +1,20 @@ +pushHandler(new StreamHandler($log_file, Logger::DEBUG)); + + $container['log'] = $log; + } +} diff --git a/system/src/Grav/Common/Service/StreamsServiceProvider.php b/system/src/Grav/Common/Service/StreamsServiceProvider.php new file mode 100644 index 0000000..d8f7dff --- /dev/null +++ b/system/src/Grav/Common/Service/StreamsServiceProvider.php @@ -0,0 +1,40 @@ +initializeLocator($locator); + + return $locator; + }; + + $container['streams'] = function($c) { + /** @var Config $config */ + $config = $c['config']; + + /** @var UniformResourceLocator $locator */ + $locator = $c['locator']; + + // Set locator to both streams. + Stream::setLocator($locator); + ReadOnlyStream::setLocator($locator); + + return new StreamBuilder($config->getStreams($c)); + }; + } +} diff --git a/system/src/Grav/Common/Session.php b/system/src/Grav/Common/Session.php new file mode 100644 index 0000000..5be15ec --- /dev/null +++ b/system/src/Grav/Common/Session.php @@ -0,0 +1,53 @@ +grav = $grav; + } + + public function init() + { + /** @var Uri $uri */ + $uri = $this->grav['uri']; + $config = $this->grav['config']; + + $is_admin = false; + + $session_timeout = $config->get('system.session.timeout', 1800); + $session_path = $config->get('system.session.path', '/' . ltrim($uri->rootUrl(false), '/')); + + // Activate admin if we're inside the admin path. + if ($config->get('plugins.admin.enabled')) { + $route = $config->get('plugins.admin.route'); + $base = '/' . trim($route, '/'); + if (substr($uri->route(), 0, strlen($base)) == $base) { + $session_timeout = $config->get('plugins.admin.session.timeout', 1800); + $is_admin = true; + } + } + + if ($config->get('system.session.enabled') || $is_admin) { + + + // Define session service. + parent::__construct( + $session_timeout, + $session_path + ); + + $unique_identifier = GRAV_ROOT; + $this->setName($config->get('system.session.name', 'grav_site') . '-' . substr(md5($unique_identifier), 0, 7) . ($is_admin ? '-admin' : '')); + $this->start(); + setcookie(session_name(), session_id(), time() + $session_timeout, $session_path); + } + } +} diff --git a/system/src/Grav/Common/Taxonomy.php b/system/src/Grav/Common/Taxonomy.php new file mode 100644 index 0000000..e280e81 --- /dev/null +++ b/system/src/Grav/Common/Taxonomy.php @@ -0,0 +1,120 @@ +taxonomy_map = array(); + $this->grav = $grav; + } + + /** + * Takes an individual page and processes the taxonomies configured in its header. It + * then adds those taxonomies to the map + * + * @param Page $page the page to process + * @param array $page_taxonomy + */ + public function addTaxonomy(Page $page, $page_taxonomy = null) + { + if (!$page_taxonomy) { + $page_taxonomy = $page->taxonomy(); + } + + if (!$page->published() || empty($page_taxonomy)) { + return; + } + + /** @var Config $config */ + $config = $this->grav['config']; + if ($config->get('site.taxonomies')) { + foreach ((array) $config->get('site.taxonomies') as $taxonomy) { + if (isset($page_taxonomy[$taxonomy])) { + foreach ((array) $page_taxonomy[$taxonomy] as $item) { + $this->taxonomy_map[$taxonomy][(string) $item][$page->path()] = array('slug' => $page->slug()); + } + } + } + } + } + + /** + * Returns a new Page object with the sub-pages containing all the values set for a + * particular taxonomy. + * + * @param array $taxonomies taxonomies to search, eg ['tag'=>['animal','cat']] + * @param string $operator can be 'or' or 'and' (defaults to 'or') + * @return Collection Collection object set to contain matches found in the taxonomy map + */ + public function findTaxonomy($taxonomies, $operator = 'and') + { + $matches = []; + $results = []; + + foreach ((array)$taxonomies as $taxonomy => $items) { + foreach ((array) $items as $item) { + if (isset($this->taxonomy_map[$taxonomy][$item])) { + $matches[] = $this->taxonomy_map[$taxonomy][$item]; + } + } + } + + if (strtolower($operator) == 'or') { + foreach ($matches as $match) { + $results = array_merge($results, $match); + } + } else { + $results = $matches ? array_pop($matches) : []; + foreach ($matches as $match) { + $results = array_intersect_key($results, $match); + } + } + + return new Collection($results, ['taxonomies' => $taxonomies]); + } + + /** + * Gets and Sets the taxonomy map + * + * @param array $var the taxonomy map + * @return array the taxonomy map + */ + public function taxonomy($var = null) + { + if ($var) { + $this->taxonomy_map = $var; + } + return $this->taxonomy_map; + } +} diff --git a/system/src/Grav/Common/Theme.php b/system/src/Grav/Common/Theme.php new file mode 100644 index 0000000..1219512 --- /dev/null +++ b/system/src/Grav/Common/Theme.php @@ -0,0 +1,23 @@ +name = $name; + + parent::__construct($name, $grav, $config); + } +} diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php new file mode 100644 index 0000000..1b9051c --- /dev/null +++ b/system/src/Grav/Common/Themes.php @@ -0,0 +1,296 @@ +grav = $grav; + $this->config = $grav['config']; + + // Register instance as autoloader for theme inheritance + spl_autoload_register([$this, 'autoloadTheme']); + } + + public function init() + { + /** @var EventDispatcher $events */ + $events = $this->grav['events']; + + /** @var Themes $themes */ + $themes = $this->grav['themes']; + $themes->configure(); + + try { + $instance = $themes->load(); + } catch (\InvalidArgumentException $e) { + throw new \RuntimeException($this->current(). ' theme could not be found'); + } + + if ($instance instanceof EventSubscriberInterface) { + $events->addSubscriber($instance); + } + + $this->grav['theme'] = $instance; + } + + /** + * Return list of all theme data with their blueprints. + * + * @return array + */ + public function all() + { + $list = array(); + $locator = Grav::instance()['locator']; + + $themes = (array) $locator->findResources('themes://', false); + foreach ($themes as $path) { + $iterator = new \DirectoryIterator($path); + + /** @var \DirectoryIterator $directory */ + foreach ($iterator as $directory) { + if (!$directory->isDir() || $directory->isDot()) { + continue; + } + + $type = $directory->getBasename(); + $list[$type] = self::get($type); + } + } + ksort($list); + + return $list; + } + + /** + * Get theme configuration or throw exception if it cannot be found. + * + * @param string $name + * @return Data + * @throws \RuntimeException + */ + public function get($name) + { + if (!$name) { + throw new \RuntimeException('Theme name not provided.'); + } + + $blueprints = new Blueprints('themes://'); + $blueprint = $blueprints->get("{$name}/blueprints"); + $blueprint->name = $name; + + // Find thumbnail. + $thumb = "themes://{$name}/thumbnail.jpg"; + if ($path = $this->grav['locator']->findResource($thumb, false)) { + $blueprint->set('thumbnail', $this->grav['base_url'] . '/' . $path); + } + + // Load default configuration. + $file = CompiledYamlFile::instance("themes://{$name}/{$name}" . YAML_EXT); + $obj = new Data($file->content(), $blueprint); + + // Override with user configuration. + $obj->merge($this->grav['config']->get('themes.' . $name) ?: []); + + // Save configuration always to user/config. + $file = CompiledYamlFile::instance("config://themes/{$name}" . YAML_EXT); + $obj->file($file); + + return $obj; + } + + /** + * Return name of the current theme. + * + * @return string + */ + public function current() + { + return (string) $this->config->get('system.pages.theme'); + } + + /** + * Load current theme. + * + * @return Theme|object + */ + public function load() + { + // NOTE: ALL THE LOCAL VARIABLES ARE USED INSIDE INCLUDED FILE, DO NOT REMOVE THEM! + $grav = $this->grav; + $config = $this->config; + $name = $this->current(); + + /** @var UniformResourceLocator $locator */ + $locator = $grav['locator']; + $file = $locator('theme://theme.php') ?: $locator("theme://{$name}.php"); + + $inflector = $grav['inflector']; + + if ($file) { + // Local variables available in the file: $grav, $config, $name, $file + $class = include $file; + + if (!is_object($class)) { + $themeClassFormat = [ + 'Grav\\Theme\\'.ucfirst($name), + 'Grav\\Theme\\'.$inflector->camelize($name) + ]; + $themeClassName = false; + + foreach ($themeClassFormat as $themeClass) { + if (class_exists($themeClass)) { + $themeClassName = $themeClass; + $class = new $themeClassName($grav, $config, $name); + break; + } + } + } + } elseif (!$locator('theme://') && !defined('GRAV_CLI')) { + exit("Theme '$name' does not exist, unable to display page."); + } + + if (empty($class)) { + $class = new Theme($grav, $config, $name); + } + + return $class; + } + + /** + * Configure and prepare streams for current template. + * + * @throws \InvalidArgumentException + */ + public function configure() + { + $name = $this->current(); + $config = $this->config; + + $this->loadConfiguration($name, $config); + + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + $registered = stream_get_wrappers(); + $schemes = $config->get( + "themes.{$name}.streams.schemes", + ['theme' => ['paths' => $locator->findResources("themes://{$name}", false)]] + ); + + foreach ($schemes as $scheme => $config) { + if (isset($config['paths'])) { + $locator->addPath($scheme, '', $config['paths']); + } + if (isset($config['prefixes'])) { + foreach ($config['prefixes'] as $prefix => $paths) { + $locator->addPath($scheme, $prefix, $paths); + } + } + + if (in_array($scheme, $registered)) { + stream_wrapper_unregister($scheme); + } + $type = !empty($config['type']) ? $config['type'] : 'ReadOnlyStream'; + if ($type[0] != '\\') { + $type = '\\RocketTheme\\Toolbox\\StreamWrapper\\' . $type; + } + + if (!stream_wrapper_register($scheme, $type)) { + throw new \InvalidArgumentException("Stream '{$type}' could not be initialized."); + } + } + + // Load languages after streams has been properly initialized + $this->loadLanguages($this->config); + } + + /** + * Load theme configuration. + * + * @param string $name Theme name + * @param Config $config Configuration class + */ + protected function loadConfiguration($name, Config $config) + { + $themeConfig = CompiledYamlFile::instance("themes://{$name}/{$name}" . YAML_EXT)->content(); + $config->joinDefaults("themes.{$name}", $themeConfig); + } + + /** + * Load theme languages. + * + * @param Config $config Configuration class + */ + protected function loadLanguages(Config $config) + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + if ($config->get('system.languages.translations', true)) { + $languageFiles = array_reverse($locator->findResources("theme://languages" . YAML_EXT)); + + $languages = []; + foreach ($languageFiles as $language) { + $languages[] = CompiledYamlFile::instance($language)->content(); + } + + if ($languages) { + $languages = call_user_func_array('array_replace_recursive', $languages); + $config->getLanguages()->mergeRecursive($languages); + } + } + } + + /** + * Autoload theme classes for inheritance + * + * @param string $class Class name + * + * @return mixed false FALSE if unable to load $class; Class name if + * $class is successfully loaded + */ + protected function autoloadTheme($class) + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + $prefix = "Grav\\Theme"; + if (false !== strpos($class, $prefix)) { + // Remove prefix from class + $class = substr($class, strlen($prefix)); + + // Replace namespace tokens to directory separators + $path = ltrim(preg_replace('#\\\|_(?!.+\\\)#', '/', $class), '/'); + $file = $locator->findResource("themes://{$path}/{$path}.php"); + + // Load class + if (stream_resolve_include_path($file)) { + return include_once($file); + } + } + + return false; + } +} diff --git a/system/src/Grav/Common/Twig/Twig.php b/system/src/Grav/Common/Twig/Twig.php new file mode 100644 index 0000000..381efe5 --- /dev/null +++ b/system/src/Grav/Common/Twig/Twig.php @@ -0,0 +1,357 @@ +grav = $grav; + $this->twig_paths = []; + } + + /** + * Twig initialization that sets the twig loader chain, then the environment, then extensions + * and also the base set of twig vars + */ + public function init() + { + if (!isset($this->twig)) { + /** @var Config $config */ + $config = $this->grav['config']; + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + $debugger = $this->grav['debugger']; + + /** @var Language $language */ + $language = $this->grav['language']; + + $active_language = $language->getActive(); + + $language_append = $active_language ? '/'.$active_language : ''; + + // handle language templates if available + if ($language->enabled()) { + $lang_templates = $locator->findResource('theme://templates/'.($active_language ? $active_language : $language->getDefault())); + if ($lang_templates) { + $this->twig_paths[] = $lang_templates; + } + } + + $this->twig_paths = array_merge($this->twig_paths, $locator->findResources('theme://templates')); + + $this->grav->fireEvent('onTwigTemplatePaths'); + + $this->loader = new \Twig_Loader_Filesystem($this->twig_paths); + $this->loaderArray = new \Twig_Loader_Array(array()); + $loader_chain = new \Twig_Loader_Chain(array($this->loaderArray, $this->loader)); + + $params = $config->get('system.twig'); + if (!empty($params['cache'])) { + $params['cache'] = $locator->findResource('cache://twig', true, true); + } + + $this->twig = new TwigEnvironment($loader_chain, $params); + + if ($config->get('system.twig.undefined_functions')) { + $this->twig->registerUndefinedFunctionCallback(function ($name) { + if (function_exists($name)) { + return new \Twig_Function_Function($name); + } + + return new \Twig_Function_Function(function() {}); + }); + } + + if ($config->get('system.twig.undefined_filters')) { + $this->twig->registerUndefinedFilterCallback(function ($name) { + if (function_exists($name)) { + return new \Twig_Filter_Function($name); + } + + return new \Twig_Filter_Function(function() {}); + }); + } + + $this->grav->fireEvent('onTwigInitialized'); + + // set default date format if set in config + if ($config->get('system.pages.dateformat.long')) { + $this->twig->getExtension('core')->setDateFormat($config->get('system.pages.dateformat.long')); + } + // enable the debug extension if required + if ($config->get('system.twig.debug')) { + $this->twig->addExtension(new \Twig_Extension_Debug()); + } + $this->twig->addExtension(new TwigExtension()); + + $this->grav->fireEvent('onTwigExtensions'); + + // Set some standard variables for twig + $this->twig_vars = array( + 'config' => $config, + 'uri' => $this->grav['uri'], + 'base_dir' => rtrim(ROOT_DIR, '/'), + 'base_url' => $this->grav['base_url'] . $language_append, + 'base_url_simple' => $this->grav['base_url'], + 'base_url_absolute' => $this->grav['base_url_absolute'] . $language_append, + 'base_url_relative' => $this->grav['base_url_relative'] . $language_append, + 'theme_dir' => $locator->findResource('theme://'), + 'theme_url' => $this->grav['base_url'] .'/'. $locator->findResource('theme://', false), + 'site' => $config->get('site'), + 'assets' => $this->grav['assets'], + 'taxonomy' => $this->grav['taxonomy'], + 'browser' => $this->grav['browser'], + ); + } + } + + /** + * @return \Twig_Environment + */ + public function twig() + { + return $this->twig; + } + + /** + * @return \Twig_Loader_Filesystem + */ + public function loader() + { + return $this->loader; + } + + /** + * Adds or overrides a template. + * + * @param string $name The template name + * @param string $template The template source + */ + public function setTemplate($name, $template) + { + $this->loaderArray->setTemplate($name, $template); + } + + /** + * Twig process that renders a page item. It supports two variations: + * 1) Handles modular pages by rendering a specific page based on its modular twig template + * 2) Renders individual page items for twig processing before the site rendering + * + * @param Page $item The page item to render + * @param string $content Optional content override + * @return string The rendered output + * @throws \Twig_Error_Loader + */ + public function processPage(Page $item, $content = null) + { + $content = $content !== null ? $content : $item->content(); + + // override the twig header vars for local resolution + $this->grav->fireEvent('onTwigPageVariables', new Event(['page' => $item])); + $twig_vars = $this->twig_vars; + + $twig_vars['page'] = $item; + $twig_vars['media'] = $item->media(); + $twig_vars['header'] = $item->header(); + + $local_twig = clone($this->twig); + $modular_twig = $item->modularTwig(); + $process_twig = isset($item->header()->process['twig']) ? $item->header()->process['twig'] : false; + + try { + // Process Modular Twig + if ($modular_twig) { + $twig_vars['content'] = $content; + $template = $item->template() . TEMPLATE_EXT; + $output = $content = $local_twig->render($template, $twig_vars); + } + + // Process in-page Twig + if (!$modular_twig || ($modular_twig && $process_twig)) { + $name = '@Page:' . $item->path(); + $this->setTemplate($name, $content); + $output = $local_twig->render($name, $twig_vars); + } + } catch (\Twig_Error_Loader $e) { + throw new \RuntimeException($e->getRawMessage(), 404, $e); + } + + return $output; + } + + /** + * Process a Twig template directly by using a template name + * and optional array of variables + * + * @param string $template template to render with + * @param array $vars Optional variables + * @return string + */ + public function processTemplate($template, $vars = array()) + { + // override the twig header vars for local resolution + $this->grav->fireEvent('onTwigTemplateVariables'); + $vars += $this->twig_vars; + + try { + $output = $this->twig->render($template, $vars); + } catch (\Twig_Error_Loader $e) { + throw new \RuntimeException($e->getRawMessage(), 404, $e); + } + + return $output; + + } + + + /** + * Process a Twig template directly by using a Twig string + * and optional array of variables + * + * @param string $string string to render. + * @param array $vars Optional variables + * @return string + */ + public function processString($string, array $vars = array()) + { + // override the twig header vars for local resolution + $this->grav->fireEvent('onTwigStringVariables'); + $vars += $this->twig_vars; + + $name = '@Var:' . $string; + $this->setTemplate($name, $string); + + try { + $output = $this->twig->render($name, $vars); + } catch (\Twig_Error_Loader $e) { + throw new \RuntimeException($e->getRawMessage(), 404, $e); + } + + return $output; + } + + /** + * Twig process that renders the site layout. This is the main twig process that renders the overall + * page and handles all the layout for the site display. + * + * @param string $format Output format (defaults to HTML). + * @return string the rendered output + * @throws \RuntimeException + */ + public function processSite($format = null) + { + // set the page now its been processed + $this->grav->fireEvent('onTwigSiteVariables'); + $pages = $this->grav['pages']; + $page = $this->grav['page']; + $content = $page->content(); + $config = $this->grav['config']; + + $twig_vars = $this->twig_vars; + + $twig_vars['pages'] = $pages->root(); + $twig_vars['page'] = $page; + $twig_vars['header'] = $page->header(); + $twig_vars['media'] = $page->media(); + $twig_vars['content'] = $content; + $ext = '.' . ($format ? $format : 'html') . TWIG_EXT; + + // determine if params are set, if so disable twig cache + $params = $this->grav['uri']->params(null, true); + if (!empty($params)) { + $this->twig->setCache(false); + } + + // Get Twig template layout + $template = $this->template($page->template() . $ext); + + try { + $output = $this->twig->render($template, $twig_vars); + } catch (\Twig_Error_Loader $e) { + $error_msg = $e->getMessage(); + // Try html version of this template if initial template was NOT html + if ($ext != '.html'.TWIG_EXT) { + try { + $output = $this->twig->render($page->template().'.html'.TWIG_EXT, $twig_vars); + } catch (\Twig_Error_Loader $e) { + throw new \RuntimeException($error_msg, 400, $e); + } + } else { + throw new \RuntimeException($error_msg, 400, $e); + } + } + + return $output; + } + + /** + * Simple helper method to get the twig template if it has already been set, else return + * the one being passed in + * + * @param string $template the template name + * @return string the template name + */ + public function template($template) + { + if (isset($this->template)) { + return $this->template; + } else { + return $template; + } + } +} diff --git a/system/src/Grav/Common/Twig/TwigEnvironment.php b/system/src/Grav/Common/Twig/TwigEnvironment.php new file mode 100644 index 0000000..c7067f0 --- /dev/null +++ b/system/src/Grav/Common/Twig/TwigEnvironment.php @@ -0,0 +1,16 @@ +grav = Grav::instance(); + $this->debugger = isset($this->grav['debugger']) ? $this->grav['debugger'] : null; + $this->config = $this->grav['config']; + } + + /** + * Returns extension name. + * + * @return string + */ + public function getName() + { + return 'GravTwigExtension'; + } + + /** + * Register some standard globals + * + * @return array + */ + public function getGlobals() + { + return array( + 'grav' => $this->grav, + ); + } + + /** + * Return a list of all filters. + * + * @return array + */ + public function getFilters() + { + return [ + new \Twig_SimpleFilter('*ize', [$this,'inflectorFilter']), + new \Twig_SimpleFilter('absolute_url', [$this, 'absoluteUrlFilter']), + new \Twig_SimpleFilter('contains', [$this, 'containsFilter']), + new \Twig_SimpleFilter('defined', [$this, 'definedDefaultFilter']), + new \Twig_SimpleFilter('ends_with', [$this, 'endsWithFilter']), + new \Twig_SimpleFilter('fieldName', [$this,'fieldNameFilter']), + new \Twig_SimpleFilter('ksort', [$this,'ksortFilter']), + new \Twig_SimpleFilter('ltrim', [$this, 'ltrimFilter']), + new \Twig_SimpleFilter('markdown', [$this, 'markdownFilter']), + new \Twig_SimpleFilter('md5', [$this,'md5Filter']), + new \Twig_SimpleFilter('nicetime', [$this, 'nicetimeFilter']), + new \Twig_SimpleFilter('randomize', [$this,'randomizeFilter']), + new \Twig_SimpleFilter('modulus', [$this,'modulusFilter']), + new \Twig_SimpleFilter('rtrim', [$this, 'rtrimFilter']), + new \Twig_SimpleFilter('safe_email', [$this,'safeEmailFilter']), + new \Twig_SimpleFilter('safe_truncate', ['\Grav\Common\Utils','safeTruncate']), + new \Twig_SimpleFilter('safe_truncate_html', ['\Grav\Common\Utils','safeTruncateHTML']), + new \Twig_SimpleFilter('sort_by_key', [$this,'sortByKeyFilter']), + new \Twig_SimpleFilter('starts_with', [$this, 'startsWithFilter']), + new \Twig_SimpleFilter('t', [$this, 'translate']), + new \Twig_SimpleFilter('ta', [$this, 'translateArray']), + new \Twig_SimpleFilter('truncate', ['\Grav\Common\Utils','truncate']), + new \Twig_SimpleFilter('truncate_html', ['\Grav\Common\Utils','truncateHTML']), + ]; + } + + /** + * Return a list of all functions. + * + * @return array + */ + public function getFunctions() + { + return [ + new \Twig_SimpleFunction('array', [$this, 'arrayFunc']), + new \Twig_simpleFunction('authorize', [$this, 'authorize']), + new \Twig_SimpleFunction('debug', [$this, 'dump'], ['needs_context' => true, 'needs_environment' => true]), + new \Twig_SimpleFunction('dump', [$this, 'dump'], ['needs_context' => true, 'needs_environment' => true]), + new \Twig_SimpleFunction('gist', [$this, 'gistFunc']), + new \Twig_simpleFunction('random_string', [$this, 'randomStringFunc']), + new \Twig_SimpleFunction('repeat', [$this, 'repeatFunc']), + new \Twig_SimpleFunction('string', [$this, 'stringFunc']), + new \Twig_simpleFunction('t', [$this, 'translate']), + new \Twig_simpleFunction('ta', [$this, 'translateArray']), + new \Twig_SimpleFunction('url', [$this, 'urlFunc']), + new \Twig_SimpleFunction('evaluate', [$this, 'evaluateFunc']), + ]; + } + + /** + * Filters field name by changing dot notation into array notation. + * + * @param string $str + * @return string + */ + public function fieldNameFilter($str) + { + $path = explode('.', $str); + + return array_shift($path) . ($path ? '[' . implode('][', $path) . ']' : ''); + } + + /** + * Protects email address. + * + * @param string $str + * @return string + */ + public function safeEmailFilter($str) + { + $email = ''; + $str_len = strlen($str); + for ($i = 0; $i < $str_len; $i++) { + $email .= "&#" . ord($str[$i]). ";"; + } + return $email; + } + + /** + * Returns array in a random order. + * + * @param array $original + * @param int $offset Can be used to return only slice of the array. + * @return array + */ + public function randomizeFilter($original, $offset = 0) + { + if (!is_array($original)) { + return $original; + } + + if ($original instanceof \Traversable) { + $original = iterator_to_array($original, false); + } + + $sorted = []; + $random = array_slice($original, $offset); + shuffle($random); + + $sizeOf = sizeof($original); + for ($x=0; $x < $sizeOf; $x++) { + if ($x < $offset) { + $sorted[] = $original[$x]; + } else { + $sorted[] = array_shift($random); + } + } + return $sorted; + } + + /** + * Returns the modulus of an integer + * + * @param int $number + * @param int $divider + * @param array $items array of items to select from to return + * @return int + */ + public function modulusFilter($number, $divider, $items = null) + { + if (is_string($number)) { + $number = strlen($number); + } + + $remainder = $number % $divider; + + if (is_array($items)) { + if (isset($items[$remainder])) { + return $items[$remainder]; + } else { + return $items[0]; + } + } + return $remainder; + } + + /** + * Inflector supports following notations: + * + * {{ 'person'|pluralize }} => people + * {{ 'shoes'|singularize }} => shoe + * {{ 'welcome page'|titleize }} => "Welcome Page" + * {{ 'send_email'|camelize }} => SendEmail + * {{ 'CamelCased'|underscorize }} => camel_cased + * {{ 'Something Text'|hyphenize }} => something-text + * {{ 'something_text_to_read'|humanize }} => "Something text to read" + * {{ '181'|monthize }} => 6 + * {{ '10'|ordinalize }} => 10th + * + * @param string $action + * @param string $data + * @param int $count + * @return mixed + */ + public function inflectorFilter($action, $data, $count = null) + { + $action = $action.'ize'; + + $inflector = $this->grav['inflector']; + + if (in_array( + $action, + ['titleize','camelize','underscorize','hyphenize', 'humanize','ordinalize','monthize'] + )) { + return $inflector->$action($data); + } elseif (in_array($action, ['pluralize','singularize'])) { + if ($count) { + return $inflector->$action($data, $count); + } else { + return $inflector->$action($data); + } + } else { + return $data; + } + } + + /** + * Return MD5 hash from the input. + * + * @param string $str + * @return string + */ + public function md5Filter($str) + { + return md5($str); + } + + /** + * Sorts a collection by key + * + * @param array $input + * @param string $filter + * @param array|int $direction + * + * @return string + */ + public function sortByKeyFilter(array $input, $filter, $direction = SORT_ASC) + { + $output = []; + + if (!$input) { + return $output; + } + + foreach ($input as $key => $row) { + $output[$key] = $row[$filter]; + } + + array_multisort($output, $direction, $input); + + return $input; + } + + /** + * Return ksorted collection. + * + * @param array $array + * @return array + */ + public function ksortFilter(array $array) + { + ksort($array); + return $array; + } + + /** + * determine if a string contains another + * + * @param String $haystack + * @param String $needle + * + * @return boolean + */ + public function containsFilter($haystack, $needle) + { + return (strpos($haystack, $needle) !== false); + } + + /** + * displays a facebook style 'time ago' formatted date/time + * + * @param $date + * @param $long_strings + * @param String + * + * @return boolean + */ + public function nicetimeFilter($date, $long_strings = true) + { + if (empty($date)) { + return $this->grav['language']->translate('NICETIME.NO_DATE_PROVIDED', null, true); + } + + if ($long_strings) { + $periods = array("NICETIME.SECOND", "NICETIME.MINUTE", "NICETIME.HOUR", "NICETIME.DAY", "NICETIME.WEEK", "NICETIME.MONTH", "NICETIME.YEAR", "NICETIME.DECADE"); + } else { + $periods = array("NICETIME.SEC", "NICETIME.MIN", "NICETIME.HR", "NICETIME.DAY", "NICETIME.WK", "NICETIME.MO", "NICETIME.YR", "NICETIME.DEC"); + } + + $lengths = array("60","60","24","7","4.35","12","10"); + + $now = time(); + + // check if unix timestamp + if ((string)(int)$date == $date) { + $unix_date = $date; + } else { + $unix_date = strtotime($date); + } + + // check validity of date + if (empty($unix_date)) { + return $this->grav['language']->translate('NICETIME.BAD_DATE', null, true); + } + + // is it future date or past date + if ($now > $unix_date) { + $difference = $now - $unix_date; + $tense = $this->grav['language']->translate('NICETIME.AGO', null, true); + + } else { + $difference = $unix_date - $now; + $tense = $this->grav['language']->translate('NICETIME.FROM_NOW', null, true); + } + + for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) { + $difference /= $lengths[$j]; + } + + $difference = round($difference); + + if ($difference != 1) { + $periods[$j] .= '_PLURAL'; + } + + $periods[$j] = $this->grav['language']->translate($periods[$j], null, true); + + return "$difference $periods[$j] {$tense}"; + } + + public function absoluteUrlFilter($string) + { + $url = $this->grav['uri']->base(); + $string = preg_replace('/((?:href|src) *= *[\'"](?!(http|ftp)))/i', "$1$url", $string); + return $string; + + } + + public function markdownFilter($string) + { + $page = $this->grav['page']; + $defaults = $this->config->get('system.pages.markdown'); + + // Initialize the preferred variant of Parsedown + if ($defaults['extra']) { + $parsedown = new ParsedownExtra($page, $defaults); + } else { + $parsedown = new Parsedown($page, $defaults); + } + + $string = $parsedown->text($string); + + return $string; + } + + public function startsWithFilter($haystack, $needle) + { + return Utils::startsWith($haystack, $needle); + } + + public function endsWithFilter($haystack, $needle) + { + return Utils::endsWith($haystack, $needle); + } + + public function definedDefaultFilter($value, $default = null) + { + if (isset($value)) { + return $value; + } else { + return $default; + } + } + + public function rtrimFilter($value, $chars = null) + { + return rtrim($value, $chars); + } + + public function ltrimFilter($value, $chars = null) + { + return ltrim($value, $chars); + } + + public function translate() + { + return $this->grav['language']->translate(func_get_args()); + } + + public function translateArray($key, $index, $lang = null) + { + return $this->grav['language']->translateArray($key, $index, $lang); + } + + /** + * Repeat given string x times. + * + * @param string $input + * @param int $multiplier + * @return string + */ + public function repeatFunc($input, $multiplier) + { + return str_repeat($input, $multiplier); + } + + /** + * Return URL to the resource. + * + * @example {{ url('theme://images/logo.png')|default('http://www.placehold.it/150x100/f4f4f4') }} + * + * @param string $input Resource to be located. + * @param bool $domain True to include domain name. + * @return string|null Returns url to the resource or null if resource was not found. + */ + public function urlFunc($input, $domain = false) + { + if (!trim((string) $input)) { + return false; + } + + if (strpos((string) $input, '://')) { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + // Get relative path to the resource (or false if not found). + $resource = $locator->findResource((string) $input, false); + } else { + $resource = (string) $input; + } + + /** @var Uri $uri */ + $uri = $this->grav['uri']; + + return $resource ? rtrim($uri->rootUrl($domain), '/') . '/' . $resource : null; + } + + /** + * Evaluate a string + * + * @example {{ evaluate('grav.language.getLanguage') }} + * + * @param string $input String to be evaluated + * @return string Returns the evaluated string + */ + public function evaluateFunc($input) + { + return $this->grav['twig']->processString("{{ $input }}"); + } + + /** + * Based on Twig_Extension_Debug / twig_var_dump + * (c) 2011 Fabien Potencier + * + * @param \Twig_Environment $env + * @param $context + */ + public function dump(\Twig_Environment $env, $context) + { + if (!$env->isDebug() || !$this->debugger) { + return; + } + + $count = func_num_args(); + if (2 === $count) { + $data = []; + foreach ($context as $key => $value) { + if (is_object($value)) { + if (method_exists($value, 'toArray')) { + $data[$key] = $value->toArray(); + } else { + $data[$key] = "Object (" . get_class($value) . ")"; + } + } else { + $data[$key] = $value; + } + } + $this->debugger->addMessage($data, 'debug'); + } else { + for ($i = 2; $i < $count; $i++) { + $this->debugger->addMessage(func_get_arg($i), 'debug'); + } + } + } + + /** + * Output a Gist + * + * @param string $id + * @return string + */ + public function gistFunc($id) + { + return ''; + } + + /** + * Generate a random string + * + * @param int $count + * + * @return string + */ + public function randomStringFunc($count = 5) + { + return Utils::generateRandomString($count); + } + + /** + * Cast a value to array + * + * @param $value + * + * @return array + */ + public function arrayFunc($value) + { + return (array) $value; + } + + /** + * Returns a string from a value. If the value is array, return it json encoded + * + * @param $value + * + * @return string + */ + public function stringFunc($value) + { + if (is_array($value)) { //format the array as a string + return json_encode($value); + } else { + return $value; + } + } + + /** + * Translate a string + * + * @return string + */ + public function translateFunc() + { + return $this->grav['language']->translate(func_get_args()); + } + + /** + * Authorize an action. Returns true if the user is logged in and has the right to execute $action. + * + * @param string $action + * + * @return bool + */ + public function authorize($action) + { + if (!$this->grav['user']->authenticated) { + return false; + } + + $action = (array)$action; + + foreach ($action as $a) { + if ($this->grav['user']->authorize($a)) { + return true; + } + } + + return false; + } +} diff --git a/system/src/Grav/Common/Twig/WriteCacheFileTrait.php b/system/src/Grav/Common/Twig/WriteCacheFileTrait.php new file mode 100644 index 0000000..ec0d93c --- /dev/null +++ b/system/src/Grav/Common/Twig/WriteCacheFileTrait.php @@ -0,0 +1,39 @@ +get('system.twig.umask_fix', false); + } + + if (self::$umask) { + if (!is_dir(dirname($file))) { + $old = umask(0002); + mkdir(dirname($file), 0777, true); + umask($old); + } + parent::writeCacheFile($file, $content); + chmod($file, 0775); + } else { + parent::writeCacheFile($file, $content); + } + } +} diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php new file mode 100644 index 0000000..0473d39 --- /dev/null +++ b/system/src/Grav/Common/Uri.php @@ -0,0 +1,575 @@ +host = 'localhost'; + } else { + $this->host = $name; + } + + $this->base = $base; + $this->root = $base . $root_path; + $this->url = $base . $uri; + } + + /** + * Initializes the URI object based on the url set on the object + */ + public function init() + { + $grav = Grav::instance(); + + $config = $grav['config']; + $language = $grav['language']; + + // resets + $this->paths = []; + $this->params = []; + $this->query = []; + + // get any params and remove them + $uri = str_replace($this->root, '', $this->url); + + // remove double slashes + $uri = preg_replace('#/{2,}#', '/', $uri); + + // remove the setup.php based base if set: + $setup_base = $grav['pages']->base(); + if ($setup_base) { + $uri = str_replace($setup_base, '', $uri); + } + + // If configured to, redirect trailing slash URI's with a 301 redirect + if ($config->get('system.pages.redirect_trailing_slash', false) && $uri != '/' && Utils::endsWith($uri, '/')) { + $grav->redirect(rtrim($uri, '/'), 301); + } + + // process params + $uri = $this->processParams($uri, $config->get('system.param_sep')); + + // set active language + $uri = $language->setActiveFromUri($uri); + + // split the URL and params + $bits = parse_url($uri); + + // process query string + if (isset($bits['query']) && isset($bits['path'])) { + $this->query = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); + $uri = $bits['path']; + } + + // remove the extension if there is one set + $parts = pathinfo($uri); + + // set the original basename + $this->basename = $parts['basename']; + + // set the extension + if (isset($parts['extension'])) { + $this->extension = $parts['extension']; + } + + $valid_page_types = implode('|', $config->get('system.pages.types')); + + if (preg_match("/\.(".$valid_page_types.")$/", $parts['basename'])) { + $uri = rtrim(str_replace(DIRECTORY_SEPARATOR, DS, $parts['dirname']), DS). '/' .$parts['filename']; + } + + // set the new url + $this->url = $this->root . $uri; + $this->path = $uri; + $this->content_path = trim(str_replace($this->base, '', $this->path), '/'); + if ($this->content_path != '') { + $this->paths = explode('/', $this->content_path); + } + } + + /** + * Process any params based in this URL, supports any valid delimiter + * + * @param $uri + * @param string $delimiter + * + * @return string + */ + private function processParams($uri, $delimiter = ':') + { + if (strpos($uri, $delimiter) !== false) { + $bits = explode('/', $uri); + $path = array(); + foreach ($bits as $bit) { + if (strpos($bit, $delimiter) !== false) { + $param = explode($delimiter, $bit); + if (count($param) == 2) { + $plain_var = filter_var(urldecode($param[1]), FILTER_SANITIZE_STRING); + $this->params[$param[0]] = $plain_var; + } + } else { + $path[] = $bit; + } + } + $uri = '/' . ltrim(implode('/', $path), '/'); + } + return $uri; + } + + /** + * Return URI path. + * + * @param string $id + * @return string + */ + public function paths($id = null) + { + if (isset($id)) { + return $this->paths[$id]; + } else { + return $this->paths; + } + } + + /** + * Return route to the current URI. By default route doesn't include base path. + * + * @param bool $absolute True to include full path. + * @param bool $domain True to include domain. Works only if first parameter is also true. + * @return string + */ + public function route($absolute = false, $domain = false) + { + return urldecode(($absolute ? $this->rootUrl($domain) : '') . '/' . implode('/', $this->paths)); + } + + /** + * Return full query string or a single query attribute. + * + * @param string $id Optional attribute. + * @return string + */ + public function query($id = null, $raw = false) + { + if (isset($id)) { + return isset($this->query[$id]) ? $this->query[$id] : null; + } else { + if ($raw) { + return $this->query; + } else { + return http_build_query($this->query); + } + } + } + + /** + * Return all or a single query parameter as a URI compatible string. + * + * @param string $id Optional parameter name. + * @param boolean $array return the array format or not + * @return null|string + */ + public function params($id = null, $array = false) + { + $config = Grav::instance()['config']; + + $params = null; + if ($id === null) { + if ($array) { + return $this->params; + } + $output = array(); + foreach ($this->params as $key => $value) { + $output[] = $key . $config->get('system.param_sep') . $value; + $params = '/'.implode('/', $output); + } + } elseif (isset($this->params[$id])) { + if ($array) { + return $this->params[$id]; + } + $params = "/{$id}". $config->get('system.param_sep') . $this->params[$id]; + } + + return $params; + } + + /** + * Get URI parameter. + * + * @param string $id + * @return bool|string + */ + public function param($id) + { + if (isset($this->params[$id])) { + return urldecode($this->params[$id]); + } else { + return false; + } + } + + /** + * Return URL. + * + * @param bool $include_host Include hostname. + * @return string + */ + public function url($include_host = false) + { + if ($include_host) { + return $this->url; + } else { + $url = (str_replace($this->base, '', rtrim($this->url, '/'))); + return $url ? $url : '/'; + } + } + + /** + * Return the Path + * + * @return String The path of the URI + */ + public function path() + { + $path = $this->path; + if ($path === '') { + $path = '/'; + } + return $path; + } + + /** + * Return the Extension of the URI + * + * @param null $default + * + * @return String The extension of the URI + */ + public function extension($default = null) + { + if (!$this->extension) { + $this->extension = $default; + } + return $this->extension; + } + + /** + * Return the host of the URI + * + * @return String The host of the URI + */ + public function host() + { + return $this->host; + } + + /** + * Gets the environment name + * + * @return String + */ + public function environment() + { + return $this->host(); + } + + + /** + * Return the basename of the URI + * + * @return String The basename of the URI + */ + public function basename() + { + return $this->basename; + } + + /** + * Return the base of the URI + * + * @return String The base of the URI + */ + public function base() + { + return $this->base; + } + + /** + * Return root URL to the site. + * + * @param bool $include_host Include hostname. + * @return mixed + */ + public function rootUrl($include_host = false) + { + if ($include_host) { + return $this->root; + } else { + $root = str_replace($this->base, '', $this->root); + return $root; + } + } + + /** + * Return current page number. + * + * @return int + */ + public function currentPage() + { + if (isset($this->params['page'])) { + return $this->params['page']; + } else { + return 1; + } + } + + /** + * Return relative path to the referrer defaulting to current or given page. + * + * @param string $default + * @param string $attributes + * @return string + */ + public function referrer($default = null, $attributes = null) + { + $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null; + + // Check that referrer came from our site. + $root = $this->rootUrl(true); + if ($referrer) { + // Referrer should always have host set and it should come from the same base address. + if (stripos($referrer, $root) !== 0) { + $referrer = null; + } + } + + if (!$referrer) { + $referrer = $default ? $default : $this->route(true, true); + } + + if ($attributes) { + $referrer .= $attributes; + } + + // Return relative path. + return substr($referrer, strlen($root)); + } + + /** + * Return the IP address of the current user + * + * @return string ip address + */ + public function ip() + { + if (getenv('HTTP_CLIENT_IP')) + $ipaddress = getenv('HTTP_CLIENT_IP'); + else if(getenv('HTTP_X_FORWARDED_FOR')) + $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); + else if(getenv('HTTP_X_FORWARDED')) + $ipaddress = getenv('HTTP_X_FORWARDED'); + else if(getenv('HTTP_FORWARDED_FOR')) + $ipaddress = getenv('HTTP_FORWARDED_FOR'); + else if(getenv('HTTP_FORWARDED')) + $ipaddress = getenv('HTTP_FORWARDED'); + else if(getenv('REMOTE_ADDR')) + $ipaddress = getenv('REMOTE_ADDR'); + else + $ipaddress = 'UNKNOWN'; + return $ipaddress; + + } + + /** + * Is this an external URL? if it starts with `http` then yes, else false + * + * @param string $url the URL in question + * @return boolean is eternal state + */ + public function isExternal($url) + { + if (Utils::startsWith($url, 'http')) { + return true; + } else { + return false; + } + } + + /** + * The opposite of built-in PHP method parse_url() + * + * @param $parsed_url + * @return string + */ + public static function buildUrl($parsed_url) + { + $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : ''; + $host = isset($parsed_url['host']) ? $parsed_url['host'] : ''; + $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; + $user = isset($parsed_url['user']) ? $parsed_url['user'] : ''; + $pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : ''; + $pass = ($user || $pass) ? "$pass@" : ''; + $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; + $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; + $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; + return "$scheme$user$pass$host$port$path$query$fragment"; + } + + /** + * Converts links from absolute '/' or relative (../..) to a grav friendly format + * + * @param $page the current page to use as reference + * @param string $markdown_url the URL as it was written in the markdown + * + * @return string the more friendly formatted url + */ + public static function convertUrl(Page $page, $markdown_url, $type = 'link') + { + $grav = Grav::instance(); + + /** @var Grav\Common\Language\Language $language */ + $language = $grav['language']; + + // Link processing should prepend language + $language_append = ''; + if ($type == 'link' && $language->enabled()) { + $language_append = $language->getLanguageURLPrefix(); + } + + $pages_dir = $grav['locator']->findResource('page://'); + $base_url = rtrim($grav['base_url'] . $grav['pages']->base(), '/') . $language_append; + + // if absolute and starts with a base_url move on + if (pathinfo($markdown_url, PATHINFO_DIRNAME) == '.' && $page->url() == '/') { + return '/' . $markdown_url; + // no path to convert + } elseif ($base_url != '' && Utils::startsWith($markdown_url, $base_url)) { + return $markdown_url; + // if contains only a fragment + } elseif (Utils::startsWith($markdown_url, '#')) { + return $markdown_url; + } else { + $target = null; + // see if page is relative to this or absolute + if (Utils::startsWith($markdown_url, '/')) { + $normalized_url = Utils::normalizePath($base_url . $markdown_url); + $normalized_path = Utils::normalizePath($pages_dir . $markdown_url); + } else { + $normalized_url = $base_url . Utils::normalizePath($page->route() . '/' . $markdown_url); + $normalized_path = Utils::normalizePath($page->path() . '/' . $markdown_url); + } + + // special check to see if path checking is required. + $just_path = str_replace($normalized_url, '', $normalized_path); + if ($just_path == $page->path()) { + return $normalized_url; + } + + $url_bits = parse_url($normalized_path); + $full_path = ($url_bits['path']); + + if (file_exists($full_path)) { + // do nothing + } elseif (file_exists(urldecode($full_path))) { + $full_path = urldecode($full_path); + } else { + return $normalized_url; + } + + $path_info = pathinfo($full_path); + $page_path = $path_info['dirname']; + $filename = ''; + + + if ($markdown_url == '..') { + $page_path = $full_path; + } else { + // save the filename if a file is part of the path + if (is_file($full_path)) { + if ($path_info['extension'] != 'md') { + $filename = '/' . $path_info['basename']; + } + } else { + $page_path = $full_path; + } + } + + // get page instances and try to find one that fits + $instances = $grav['pages']->instances(); + if (isset($instances[$page_path])) { + $target = $instances[$page_path]; + $url_bits['path'] = $base_url . rtrim($target->route(), '/') . $filename; + return Uri::buildUrl($url_bits); + } + + return $normalized_url; + } + } +} diff --git a/system/src/Grav/Common/User/Authentication.php b/system/src/Grav/Common/User/Authentication.php new file mode 100644 index 0000000..fc26bf8 --- /dev/null +++ b/system/src/Grav/Common/User/Authentication.php @@ -0,0 +1,51 @@ +exists(). + * + * @param string $username + * @return User + */ + public static function load($username) + { + $locator = self::getGrav()['locator']; + + $blueprints = new Blueprints('blueprints://'); + $blueprint = $blueprints->get('user/account'); + $file_path = $locator->findResource('account://' . $username . YAML_EXT); + $file = CompiledYamlFile::instance($file_path); + $content = $file->content(); + if (!isset($content['username'])) { + $content['username'] = $username; + } + $user = new User($content, $blueprint); + $user->file($file); + + return $user; + } + + /** + * Remove user account. + * + * @param string $username + * @return bool True is the action was performed + */ + public static function remove($username) + { + $file_path = self::getGrav()['locator']->findResource('account://' . $username . YAML_EXT); + if (file_exists($file_path) && unlink($file_path)) { + return true; + } + + return false; + } + + /** + * Authenticate user. + * + * If user password needs to be updated, new information will be saved. + * + * @param string $password Plaintext password. + * @return bool + */ + public function authenticate($password) + { + $save = false; + + // Plain-text is still stored + if ($this->password) { + if ($password !== $this->password) { + // Plain-text passwords do not match, we know we should fail but execute + // verify to protect us from timing attacks and return false regardless of + // the result + Authentication::verify($password, self::getGrav()['config']->get('system.security.default_hash')); + return false; + } else { + // Plain-text does match, we can update the hash and proceed + $save = true; + + $this->hashed_password = Authentication::create($this->password); + unset($this->password); + } + + } + + $result = Authentication::verify($password, $this->hashed_password); + + // Password needs to be updated, save the file. + if ($result == 2) { + $save = true; + $this->hashed_password = Authentication::create($password); + } + + if ($save) { + $this->save(); + } + + return (bool) $result; + } + + /** + * Save user without the username + */ + public function save() + { + $file = $this->file(); + if ($file) { + // if plain text password, hash it and remove plain text + if ($this->password) { + $this->hashed_password = Authentication::create($this->password); + unset($this->password); + } + + $username = $this->get('username'); + unset($this->username); + $file->save($this->items); + $this->set('username', $username); + } + } + + /** + * Checks user authorization to the action. + * + * @param string $action + * @return bool + */ + public function authorize($action) + { + if (empty($this->items)) { + return false; + } + + return Utils::isPositive($this->get("access.{$action}")); + } + + /** + * Checks user authorization to the action. + * Ensures backwards compatibility + * + * @param string $action + * @deprecated use authorize() + * @return bool + */ + public function authorise($action) + { + return $this->authorize($action); + } +} diff --git a/system/src/Grav/Common/Utils.php b/system/src/Grav/Common/Utils.php new file mode 100644 index 0000000..8c55669 --- /dev/null +++ b/system/src/Grav/Common/Utils.php @@ -0,0 +1,390 @@ + 'd-m-Y H:i (e.g. '.$now->format('d-m-Y H:i').')', + 'Y-m-d H:i' => 'Y-m-d H:i (e.g. '.$now->format('Y-m-d H:i').')', + 'm/d/Y h:i a' => 'm/d/Y h:i (e.g. '.$now->format('m/d/Y h:i a').')', + 'H:i d-m-Y' => 'H:i d-m-Y (e.g. '.$now->format('H:i d-m-Y').')', + 'h:i a m/d/Y' => 'h:i a m/d/Y (e.g. '.$now->format('h:i a m/d/Y').')', + ]; + $default_format = self::getGrav()['config']->get('system.pages.dateformat.default'); + if ($default_format) { + $date_formats = array_merge([$default_format => $default_format.' (e.g. '.$now->format($default_format).')'], $date_formats); + } + return $date_formats; + } + + /** + * Truncate text by number of characters but can cut off words. + * + * @param string $string + * @param int $limit Max number of characters. + * @param bool $up_to_break truncate up to breakpoint after char count + * @param string $break Break point. + * @param string $pad Appended padding to the end of the string. + * @return string + */ + public static function truncate($string, $limit = 150, $up_to_break = false, $break = " ", $pad = "…") + { + // return with no change if string is shorter than $limit + if (mb_strlen($string) <= $limit) { + return $string; + } + + // is $break present between $limit and the end of the string? + if ($up_to_break && false !== ($breakpoint = mb_strpos($string, $break, $limit))) { + if ($breakpoint < mb_strlen($string) - 1) { + $string = mb_substr($string, 0, $breakpoint) . $break; + } + } else { + $string = mb_substr($string, 0, $limit) . $pad; + } + + return $string; + } + + /** + * Truncate text by number of characters in a "word-safe" manor. + * + * @param $string + * @param int $limit + * @return string + */ + public static function safeTruncate($string, $limit = 150) + { + return static::truncate($string, $limit, true); + } + + + /** + * Truncate HTML by number of characters. not "word-safe"! + * + * @param string $text + * @param int $length + * + * @return string + */ + public static function truncateHtml($text, $length = 100) + { + return Truncator::truncate($text, $length, array('length_in_chars' => true)); + } + + /** + * Truncate HTML by number of characters in a "word-safe" manor. + * + * @param string $text + * @param int $length + * + * @return string + */ + public static function safeTruncateHtml($text, $length = 100) + { + return Truncator::truncate($text, $length, array('length_in_chars' => true, 'word_safe' => true)); + } + + /** + * Generate a random string of a given length + * + * @param int $length + * + * @return string + */ + public static function generateRandomString($length = 5) + { + return substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length); + } + + /** + * Provides the ability to download a file to the browser + * + * @param $file the full path to the file to be downloaded + * @param bool $force_download as opposed to letting browser choose if to download or render + */ + public static function download($file, $force_download = true) + { + if (file_exists($file)) { + // fire download event + self::getGrav()->fireEvent('onBeforeDownload', new Event(['file' => $file])); + + $file_parts = pathinfo($file); + $filesize = filesize($file); + + // check if this function is available, if so use it to stop any timeouts + if (function_exists('set_time_limit')) { + set_time_limit(0); + } + + ignore_user_abort(false); + + if ($force_download) { + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename=' . $file_parts['basename']); + header('Content-Transfer-Encoding: binary'); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + } else { + header("Content-Type: " . Utils::getMimeType($file_parts['extension'])); + } + header('Content-Length: ' . $filesize); + + // 8kb chunks for now + $chunk = 8 * 1024; + + $fh = fopen($file, "rb"); + + if ($fh === false) { + return; + } + + // Repeat reading until EOF + while (!feof($fh)) { + echo fread($fh, $chunk); + + ob_flush(); // flush output + flush(); + } + + exit; + } + } + + /** + * Return the mimetype based on filename + * + * @param $extension Extension of file (eg .txt) + * + * @return string + */ + public static function getMimeType($extension) + { + $extension = strtolower($extension); + $config = self::getGrav()['config']->get('media'); + + if (isset($config[$extension])) { + return $config[$extension]['mime']; + } + + return 'application/octet-stream'; + } + + /** + * Normalize path by processing relative `.` and `..` syntax and merging path + * + * @param $path + * + * @return string + */ + public static function normalizePath($path) + { + $root = ($path[0] === '/') ? '/' : ''; + + $segments = explode('/', trim($path, '/')); + $ret = array(); + foreach ($segments as $segment) { + if (($segment == '.') || empty($segment)) { + continue; + } + if ($segment == '..') { + array_pop($ret); + } else { + array_push($ret, $segment); + } + } + + return $root . implode('/', $ret); + } + + public static function timezones() + { + $timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::ALL); + $offsets = []; + $testDate = new \DateTime; + + foreach ($timezones as $zone) { + $tz = new \DateTimeZone($zone); + $offsets[$zone] = $tz->getOffset($testDate); + } + + asort($offsets); + + $timezone_list = array(); + foreach ($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; + + } + + public static function arrayFilterRecursive(Array $source, $fn) + { + $result = array(); + foreach ($source as $key => $value) + { + if (is_array($value)) + { + $result[$key] = static::arrayFilterRecursive($value, $fn); + continue; + } + if ($fn($key, $value)) + { + $result[$key] = $value; // KEEP + continue; + } + } + return $result; + } + + public static function pathPrefixedByLangCode($string) + { + $languages_enabled = self::getGrav()['config']->get('system.languages.supported', []); + + if ($string[0] == '/' && $string[3] == '/' && in_array(substr($string, 1, 2), $languages_enabled)) { + return true; + } + + return false; + } + + public static function date2timestamp($date) + { + $config = self::getGrav()['config']; + $default_dateformat = $config->get('system.pages.dateformat.default'); + + // try to use DateTime and default format + if ($default_dateformat) { + $datetime = DateTime::createFromFormat($default_dateformat, $date); + } else { + $datetime = new DateTime($date); + } + + // fallback to strtotime if DateTime approach failed + if ($datetime !== false) { + return $datetime->getTimestamp(); + } else { + return strtotime($date); + } + } + + /** + * Checks if a value is positive + * + * @param string $value + * + * @return boolean + */ + public static function isPositive($value) { + return in_array($value, [true, 1, '1', 'yes', 'on', 'true'], true); + } +} diff --git a/system/src/Grav/Console/Cli/BackupCommand.php b/system/src/Grav/Console/Cli/BackupCommand.php new file mode 100644 index 0000000..a597efc --- /dev/null +++ b/system/src/Grav/Console/Cli/BackupCommand.php @@ -0,0 +1,97 @@ +setName("backup") + ->addArgument( + 'destination', + InputArgument::OPTIONAL, + 'Where to store the backup (/backup is default)' + + ) + ->setDescription("Creates a backup of the Grav instance") + ->setHelp('The backup creates a zipped backup. Optionally can be saved in a different destination.'); + + $this->source = getcwd(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $this->progress = new ProgressBar($output); + $this->progress->setFormat('Archiving %current% files [%bar%] %elapsed:6s% %memory:6s%'); + + self::getGrav()['config']->init(); + + $destination = ($input->getArgument('destination')) ? $input->getArgument('destination') : null; + $log = JsonFile::instance(self::getGrav()['locator']->findResource("log://backup.log", true, true)); + $backup = ZipBackup::backup($destination, [$this, 'output']); + + $log->content([ + 'time' => time(), + 'location' => $backup + ]); + $log->save(); + + $output->writeln(''); + $output->writeln(''); + + } + + /** + * @param $folder + * @param $zipFile + * @param $exclusiveLength + * @param $progress + */ + public function output($args) + { + switch ($args['type']) { + case 'message': + $this->output->writeln($args['message']); + break; + case 'progress': + if ($args['complete']) { + $this->progress->finish(); + } else { + $this->progress->advance(); + } + break; + } + } + +} + diff --git a/system/src/Grav/Console/Cli/CleanCommand.php b/system/src/Grav/Console/Cli/CleanCommand.php new file mode 100644 index 0000000..350c9ab --- /dev/null +++ b/system/src/Grav/Console/Cli/CleanCommand.php @@ -0,0 +1,212 @@ +setName("clean") + ->setDescription("Handles cleaning chores for Grav distribution") + ->setHelp('The clean clean extraneous folders and data'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $this->cleanPaths(); + } + + private function cleanPaths() + { + $this->output->writeln(''); + $this->output->writeln('DELETING'); + + $anything = false; + + foreach ($this->paths_to_remove as $path) { + $path = ROOT_DIR . $path; + + if (is_dir($path) && @Folder::delete($path)) { + $anything = true; + $this->output->writeln('dir: ' . $path); + } elseif (is_file($path) && @unlink($path)) { + $anything = true; + $this->output->writeln('file: ' . $path); + } + } + + if (!$anything) { + $this->output->writeln(''); + $this->output->writeln('Nothing to clean...'); + } + + } + +} diff --git a/system/src/Grav/Console/Cli/ClearCacheCommand.php b/system/src/Grav/Console/Cli/ClearCacheCommand.php new file mode 100644 index 0000000..9440648 --- /dev/null +++ b/system/src/Grav/Console/Cli/ClearCacheCommand.php @@ -0,0 +1,73 @@ +setName("clear-cache") + ->setDescription("Clears Grav cache") + ->addOption('all', null, InputOption::VALUE_NONE, 'If set will remove all including compiled, twig, doctrine caches') + ->addOption('assets-only', null, InputOption::VALUE_NONE, 'If set will remove only assets/*') + ->addOption('images-only', null, InputOption::VALUE_NONE, 'If set will remove only images/*') + ->addOption('cache-only', null, InputOption::VALUE_NONE, 'If set will remove only cache/*') + ->setHelp('The clear-cache deletes all cache files'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $this->cleanPaths(); + } + + /** + * loops over the array of paths and deletes the files/folders + */ + private function cleanPaths() + { + $this->output->writeln(''); + $this->output->writeln('Clearing cache'); + $this->output->writeln(''); + + if ($this->input->getOption('all')) { + $remove = 'all'; + } elseif ($this->input->getOption('assets-only')) { + $remove = 'assets-only'; + } elseif ($this->input->getOption('images-only')) { + $remove = 'images-only'; + } elseif ($this->input->getOption('cache-only')) { + $remove = 'cache-only'; + } else { + $remove = 'standard'; + } + + foreach (Cache::clearCache($remove) as $result) { + $this->output->writeln($result); + } + } +} + diff --git a/system/src/Grav/Console/Cli/ComposerCommand.php b/system/src/Grav/Console/Cli/ComposerCommand.php new file mode 100644 index 0000000..843df5c --- /dev/null +++ b/system/src/Grav/Console/Cli/ComposerCommand.php @@ -0,0 +1,82 @@ +setName("composer") + ->addOption( + 'install', + 'i', + InputOption::VALUE_NONE, + 'install the dependencies' + ) + ->addOption( + 'update', + 'u', + InputOption::VALUE_NONE, + 'update the dependencies' + ) + ->setDescription("Updates the composer vendor dependencies needed by Grav.") + ->setHelp('The composer command updates the composer vendor dependencies needed by Grav'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $action = $input->getOption('install') ? 'install' : ($input->getOption('update') ? 'update' : 'install'); + + if ($input->getOption('install')) { + $action = 'install'; + } + + // Updates composer first + $output->writeln("\nInstalling vendor dependencies"); + $output->writeln($this->composerUpdate(GRAV_ROOT, $action)); + } + +} diff --git a/system/src/Grav/Console/Cli/InstallCommand.php b/system/src/Grav/Console/Cli/InstallCommand.php new file mode 100644 index 0000000..6a5c84f --- /dev/null +++ b/system/src/Grav/Console/Cli/InstallCommand.php @@ -0,0 +1,173 @@ +setName("install") + ->addOption( + 'symlink', + 's', + InputOption::VALUE_NONE, + 'Symlink the required bits' + ) + ->addArgument( + 'destination', + InputArgument::OPTIONAL, + 'Where to install the required bits (default to current project)' + + ) + ->setDescription("Installs the dependencies needed by Grav. Optionally can create symbolic links") + ->setHelp('The install command installs the dependencies needed by Grav. Optionally can create symbolic links'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $dependencies_file = '.dependencies'; + $this->destination = ($input->getArgument('destination')) ? $input->getArgument('destination') : ROOT_DIR; + + // fix trailing slash + $this->destination = rtrim($this->destination, DS) . DS; + $this->user_path = $this->destination . USER_PATH; + + if (false === $this->isWindows()) { + $local_config_file = exec('eval echo ~/.grav/config'); + if (file_exists($local_config_file)) { + $this->local_config = Yaml::parse($local_config_file); + $output->writeln('Read local config from ' . $local_config_file . ''); + } + } + + // Look for dependencies file in ROOT and USER dir + if (file_exists($this->user_path . $dependencies_file)) { + $this->config = Yaml::parse($this->user_path . $dependencies_file); + } elseif (file_exists($this->destination . $dependencies_file)) { + $this->config = Yaml::parse($this->destination . $dependencies_file); + } else { + $output->writeln('ERROR Missing .dependencies file in user/ folder'); + } + + // If yaml config, process + if ($this->config) { + if (!$input->getOption('symlink')) { + // Updates composer first + $output->writeln("\nInstalling vendor dependencies"); + $output->writeln($this->composerUpdate(GRAV_ROOT, 'install')); + + $this->gitclone(); + } else { + $this->symlink(); + } + } else { + $output->writeln('ERROR invalid YAML in ' . $dependencies_file); + } + + + } + + /** + * Clones from Git + */ + private function gitclone() + { + $this->output->writeln(''); + $this->output->writeln('Cloning Bits'); + $this->output->writeln('============'); + $this->output->writeln(''); + + foreach ($this->config['git'] as $repo => $data) { + $path = $this->destination . DS . $data['path']; + if (!file_exists($path)) { + exec('cd "' . $this->destination . '" && git clone -b ' . $data['branch'] . ' ' . $data['url'] . ' ' . $data['path']); + $this->output->writeln('SUCCESS cloned ' . $data['url'] . ' -> ' . $path . ''); + $this->output->writeln(''); + } else { + $this->output->writeln('' . $path . ' already exists, skipping...'); + $this->output->writeln(''); + } + + } + } + + /** + * Symlinks + */ + private function symlink() + { + $this->output->writeln(''); + $this->output->writeln('Symlinking Bits'); + $this->output->writeln('==============='); + $this->output->writeln(''); + + if (!$this->local_config) { + $this->output->writeln('No local configuration available, aborting...'); + $this->output->writeln(''); + return; + } + + exec('cd ' . $this->destination); + foreach ($this->config['links'] as $repo => $data) { + $from = $this->local_config[$data['scm'] . '_repos'] . $data['src']; + $to = $this->destination . $data['path']; + + if (file_exists($from)) { + if (!file_exists($to)) { + symlink($from, $to); + $this->output->writeln('SUCCESS symlinked ' . $data['src'] . ' -> ' . $data['path'] . ''); + $this->output->writeln(''); + } else { + $this->output->writeln('destination: ' . $to . ' already exists, skipping...'); + $this->output->writeln(''); + } + } else { + $this->output->writeln('source: ' . $from . ' does not exists, skipping...'); + $this->output->writeln(''); + } + + } + } +} diff --git a/system/src/Grav/Console/Cli/NewProjectCommand.php b/system/src/Grav/Console/Cli/NewProjectCommand.php new file mode 100644 index 0000000..6e193fe --- /dev/null +++ b/system/src/Grav/Console/Cli/NewProjectCommand.php @@ -0,0 +1,71 @@ +setName("new-project") + ->addArgument( + 'destination', + InputArgument::REQUIRED, + 'The destination directory of your new Grav project' + ) + ->addOption( + 'symlink', + 's', + InputOption::VALUE_NONE, + 'Symlink the required bits' + ) + ->setDescription("Creates a new Grav project with all the dependencies installed") + ->setHelp("The new-project command is a combination of the `setup` and `install` commands.\nCreates a new Grav instance and performs the installation of all the required dependencies."); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $sandboxCommand = $this->getApplication()->find('sandbox'); + $installCommand = $this->getApplication()->find('install'); + + $sandboxArguments = new ArrayInput(array( + 'command' => 'sandbox', + 'destination' => $input->getArgument('destination'), + '-s' => $input->getOption('symlink') + )); + + $installArguments = new ArrayInput(array( + 'command' => 'install', + 'destination' => $input->getArgument('destination'), + '-s' => $input->getOption('symlink') + )); + + $sandboxCommand->run($sandboxArguments, $output); + $installCommand->run($installArguments, $output); + + } +} diff --git a/system/src/Grav/Console/Cli/NewUserCommand.php b/system/src/Grav/Console/Cli/NewUserCommand.php new file mode 100644 index 0000000..a26be6f --- /dev/null +++ b/system/src/Grav/Console/Cli/NewUserCommand.php @@ -0,0 +1,160 @@ +setName("newuser") + ->setDescription("Creates a new user") + ->setHelp('The newuser creates a new user file in user/accounts/ folder'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $helper = $this->getHelper('question'); + $data = []; + + $this->output->writeln('Create new user'); + $this->output->writeln(''); + + // Get username and validate + $question = new Question('Enter a username: ', 'admin'); + $question->setValidator(function ($value) { + if (!preg_match('/^[a-z0-9_-]{3,16}$/', $value)) { + throw new RuntimeException( + 'Username should be between 3 and 16 characters, including lowercase letters, numbers, underscores, and hyphens. Uppercase letters, spaces, and special characters are not allowed' + ); + } + if (file_exists(self::getGrav()['locator']->findResource('user://accounts/' . $value . YAML_EXT))) { + throw new RuntimeException( + 'Username "'.$value.'" already exists, please pick another username' + ); + } + return $value; + }); + $username = $helper->ask($this->input, $this->output, $question); + + // Get password and validate + $password = $this->askForPassword($helper, 'Enter a password: ', function ($password1) use ($helper) { + if (!preg_match('/(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}/', $password1)) { + throw new RuntimeException('Password must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters'); + } + // Since input is hidden when prompting for passwords, the user is asked to repeat the password + return $this->askForPassword($helper, 'Repeat the password: ', function ($password2) use ($password1) { + if (strcmp($password2, $password1)) { + throw new RuntimeException('Passwords did not match.'); + } + return $password2; + }); + }); + $data['password'] = $password; + + // Get email and validate + $question = new Question('Enter an email: '); + $question->setValidator(function ($value) { + if (!preg_match('/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/', $value)) { + throw new RuntimeException( + 'Not a valid email address' + ); + } + return $value; + }); + $data['email'] = $helper->ask($this->input, $this->output, $question); + + // Choose permissions + $question = new ChoiceQuestion( + 'Please choose a set of permissions:', + array('a'=>'admin access', 's'=>'site access', 'b'=>'admin and site access'), + 'a' + ); + $question->setErrorMessage('permissions %s is invalid.'); + $permissions_choice = $helper->ask($this->input, $this->output, $question); + + switch ($permissions_choice) { + case 'a': + $data['access']['admin'] = ['login' => true, 'super' => true]; + break; + case 's': + $data['access']['site'] = ['login' => true]; + break; + case 'b': + $data['access']['admin'] = ['login' => true, 'super' => true]; + $data['access']['site'] = ['login' => true]; + } + + // Get fullname + $question = new Question('Enter a fullname: '); + $question->setValidator(function ($value) { + if ($value === null || trim($value) == '') { + throw new RuntimeException( + 'Fullname is required' + ); + } + return $value; + }); + $data['fullname'] = $helper->ask($this->input, $this->output, $question); + + // Get title + $question = new Question('Enter a title: '); + $data['title'] = $helper->ask($this->input, $this->output, $question); + + // Create user object and save it + $user = new User($data); + $file = CompiledYamlFile::instance(self::getGrav()['locator']->findResource('user://accounts/' . $username . YAML_EXT, true, true)); + $user->file($file); + $user->save(); + + $this->output->writeln(''); + $this->output->writeln('Success! User '. $username .' created.'); + } + + /** + * Get password and validate. + * + * @param Helper $helper + * @param string $question + * @param callable $validator + * + * @return string + */ + protected function askForPassword(Helper $helper, $question, callable $validator) + { + $question = new Question($question); + $question->setValidator($validator); + $question->setHidden(true); + $question->setHiddenFallback(true); + return $helper->ask($this->input, $this->output, $question); + } +} diff --git a/system/src/Grav/Console/Cli/SandboxCommand.php b/system/src/Grav/Console/Cli/SandboxCommand.php new file mode 100644 index 0000000..d490655 --- /dev/null +++ b/system/src/Grav/Console/Cli/SandboxCommand.php @@ -0,0 +1,313 @@ + '/.editorconfig', + '/.gitignore' => '/.gitignore', + '/CHANGELOG.md' => '/CHANGELOG.md', + '/LICENSE' => '/LICENSE', + '/README.md' => '/README.md', + '/index.php' => '/index.php', + '/composer.json' => '/composer.json', + '/bin' => '/bin', + '/system' => '/system', + '/vendor' => '/vendor', + ); + + /** + * @var string + */ + + protected $default_file = "---\ntitle: HomePage\n---\n# HomePage\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque porttitor eu felis sed ornare. Sed a mauris venenatis, pulvinar velit vel, dictum enim. Phasellus ac rutrum velit. Nunc lorem purus, hendrerit sit amet augue aliquet, iaculis ultricies nisl. Suspendisse tincidunt euismod risus, quis feugiat arcu tincidunt eget. Nulla eros mi, commodo vel ipsum vel, aliquet congue odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque velit orci, laoreet at adipiscing eu, interdum quis nibh. Nunc a accumsan purus."; + + protected $source; + protected $destination; + + /** + * + */ + protected function configure() + { + $this + ->setName('sandbox') + ->setDescription('Setup of a base Grav system in your webroot, good for development, playing around or starting fresh') + ->addArgument( + 'destination', + InputArgument::REQUIRED, + 'The destination directory to symlink into' + ) + ->addOption( + 'symlink', + 's', + InputOption::VALUE_NONE, + 'Symlink the base grav system' + ) + ->setHelp("The sandbox command help create a development environment that can optionally use symbolic links to link the core of grav to the git cloned repository.\nGood for development, playing around or starting fresh"); + $this->source = getcwd(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $this->destination = $input->getArgument('destination'); + + // Symlink the Core Stuff + if ($input->getOption('symlink')) { + // Create Some core stuff if it doesn't exist + $this->createDirectories(); + + // Loop through the symlink mappings and create the symlinks + $this->symlink(); + + // Copy the Core STuff + } else { + // Create Some core stuff if it doesn't exist + $this->createDirectories(); + + // Loop through the symlink mappings and copy what otherwise would be symlinks + $this->copy(); + } + + $this->pages(); + $this->initFiles(); + $this->perms(); + } + + /** + * + */ + private function createDirectories() + { + $this->output->writeln(''); + $this->output->writeln('Creating Directories'); + $dirs_created = false; + + if (!file_exists($this->destination)) { + mkdir($this->destination, 0777, true); + } + + foreach ($this->directories as $dir) { + if (!file_exists($this->destination . $dir)) { + $dirs_created = true; + $this->output->writeln(' ' . $dir . ''); + mkdir($this->destination . $dir, 0777, true); + } + } + + if (!$dirs_created) { + $this->output->writeln(' Directories already exist'); + } + } + + /** + * + */ + private function copy() + { + $this->output->writeln(''); + $this->output->writeln('Copying Files'); + + + foreach ($this->mappings as $source => $target) { + if ((int)$source == $source) { + $source = $target; + } + + $from = $this->source . $source; + $to = $this->destination . $target; + + $this->output->writeln(' ' . $source . ' -> ' . $to); + Folder::rcopy($from, $to); + } + } + + /** + * + */ + private function symlink() + { + $this->output->writeln(''); + $this->output->writeln('Resetting Symbolic Links'); + + + foreach ($this->mappings as $source => $target) { + if ((int)$source == $source) { + $source = $target; + } + + $from = $this->source . $source; + $to = $this->destination . $target; + + $this->output->writeln(' ' . $source . ' -> ' . $to); + + if (is_dir($to)) { + @Folder::delete($to); + } else { + @unlink($to); + } + symlink($from, $to); + } + } + + /** + * + */ + private function initFiles() + { + $this->check($this->output); + + $this->output->writeln(''); + $this->output->writeln('File Initializing'); + $files_init = false; + + // Copy files if they do not exist + foreach ($this->files as $source => $target) { + if ((int)$source == $source) { + $source = $target; + } + + $from = $this->source . $source; + $to = $this->destination . $target; + + if (!file_exists($to)) { + $files_init = true; + copy($from, $to); + $this->output->writeln(' ' . $target . ' -> Created'); + } + } + + if (!$files_init) { + $this->output->writeln(' Files already exist'); + } + + + } + + /** + * + */ + private function pages() + { + $this->output->writeln(''); + $this->output->writeln('Pages Initializing'); + + // get pages files and initialize if no pages exist + $pages_dir = $this->destination . '/user/pages'; + $pages_files = array_diff(scandir($pages_dir), array('..', '.')); + + if (count($pages_files) == 0) { + $destination = $this->source . '/user/pages'; + Folder::rcopy($destination, $pages_dir); + $this->output->writeln(' ' . $destination . ' -> Created'); + + } + } + + /** + * + */ + private function perms() + { + $this->output->writeln(''); + $this->output->writeln('Permissions Initializing'); + + $dir_perms = 0755; + + $binaries = glob($this->destination . DS . 'bin' . DS . '*'); + + foreach ($binaries as $bin) { + chmod($bin, $dir_perms); + $this->output->writeln(' bin/' . basename($bin) . ' permissions reset to ' . decoct($dir_perms)); + } + + $this->output->writeln(""); + } + + + /** + * + */ + private function check() + { + $success = true; + + if (!file_exists($this->destination)) { + $this->output->writeln(' file: $this->destination does not exist!'); + $success = false; + } + + foreach ($this->directories as $dir) { + if (!file_exists($this->destination . $dir)) { + $this->output->writeln(' directory: ' . $dir . ' does not exist!'); + $success = false; + } + } + + foreach ($this->mappings as $target => $link) { + if (!file_exists($this->destination . $target)) { + $this->output->writeln(' mappings: ' . $target . ' does not exist!'); + $success = false; + } + } + if (!$success) { + $this->output->writeln(''); + $this->output->writeln('install should be run with --symlink|--s to symlink first'); + exit; + } + } +} diff --git a/system/src/Grav/Console/ConsoleTrait.php b/system/src/Grav/Console/ConsoleTrait.php new file mode 100644 index 0000000..1ba9357 --- /dev/null +++ b/system/src/Grav/Console/ConsoleTrait.php @@ -0,0 +1,127 @@ +set('system.cache.driver', 'default'); + } + + $this->argv = $_SERVER['argv'][0]; + + $this->input = $input; + $this->output = $output; + + $this->output->getFormatter()->setStyle('normal', new OutputFormatterStyle('white')); + $this->output->getFormatter()->setStyle('yellow', new OutputFormatterStyle('yellow', null, array('bold'))); + $this->output->getFormatter()->setStyle('red', new OutputFormatterStyle('red', null, array('bold'))); + $this->output->getFormatter()->setStyle('cyan', new OutputFormatterStyle('cyan', null, array('bold'))); + $this->output->getFormatter()->setStyle('green', new OutputFormatterStyle('green', null, array('bold'))); + $this->output->getFormatter()->setStyle('magenta', new OutputFormatterStyle('magenta', null, array('bold'))); + $this->output->getFormatter()->setStyle('white', new OutputFormatterStyle('white', null, array('bold'))); + } + + /** + * @param $path + */ + public function isGravInstance($path) + { + if (!file_exists($path)) { + $this->output->writeln(''); + $this->output->writeln("ERROR: Destination doesn't exist:"); + $this->output->writeln(" $path"); + $this->output->writeln(''); + exit; + } + + if (!is_dir($path)) { + $this->output->writeln(''); + $this->output->writeln("ERROR: Destination chosen to install is not a directory:"); + $this->output->writeln(" $path"); + $this->output->writeln(''); + exit; + } + + if (!file_exists($path . DS . 'index.php') || !file_exists($path . DS . '.dependencies') || !file_exists($path . DS . 'system' . DS . 'config' . DS . 'system.yaml')) { + $this->output->writeln(''); + $this->output->writeln("ERROR: Destination chosen to install does not appear to be a Grav instance:"); + $this->output->writeln(" $path"); + $this->output->writeln(''); + exit; + } + } + + public function composerUpdate($path, $action = 'install') + { + $composer = Composer::getComposerExecutor(); + + return system($composer . ' --working-dir="'.$path.'" --no-interaction --no-dev --prefer-dist -o '. $action); + } + + /** + * @param array $all + * + * @return int + * @throws \Exception + */ + public function clearCache($all = []) + { + if ($all) { + $all = ['--all' => true]; + } + + $command = new ClearCacheCommand(); + $input = new ArrayInput($all); + return $command->run($input, $this->output); + } + + /** + * Validate if the system is based on windows or not. + * + * @return bool + */ + public function isWindows() + { + $keys = [ + 'CYGWIN_NT-5.1', + 'WIN32', + 'WINNT', + 'Windows' + ]; + + return array_key_exists(PHP_OS, $keys); + } +} diff --git a/system/src/Grav/Console/Gpm/IndexCommand.php b/system/src/Grav/Console/Gpm/IndexCommand.php new file mode 100644 index 0000000..f5b3e16 --- /dev/null +++ b/system/src/Grav/Console/Gpm/IndexCommand.php @@ -0,0 +1,119 @@ +setName("index") + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Force re-fetching the data from remote' + ) + ->setDescription("Lists the plugins and themes available for installation") + ->setHelp('The index command lists the plugins and themes available for installation'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $this->gpm = new GPM($this->input->getOption('force')); + + $this->data = $this->gpm->getRepository(); + + $this->output->writeln(''); + + foreach ($this->data as $type => $packages) { + $this->output->writeln("" . ucfirst($type) . " [ " . count($packages) . " ]"); + + $index = 0; + foreach ($packages as $slug => $package) { + $this->output->writeln( + // index + str_pad($index++ + 1, 2, '0', STR_PAD_LEFT) . ". " . + // package name + "" . str_pad($package->name, 20) . " " . + // slug + "[" . str_pad($slug, 20, ' ', STR_PAD_BOTH) . "] " . + // version details + $this->versionDetails($package) + ); + } + + $this->output->writeln(''); + } + + $this->output->writeln('You can either get more informations about a package by typing:'); + $this->output->writeln(' ' . $this->argv . ' info '); + $this->output->writeln(''); + $this->output->writeln('Or you can install a package by typing:'); + $this->output->writeln(' ' . $this->argv . ' install '); + $this->output->writeln(''); + } + + /** + * @param $package + * + * @return string + */ + private function versionDetails($package) + { + $list = $this->gpm->{'getUpdatable' . ucfirst($package->package_type)}(); + $package = isset($list[$package->slug]) ? $list[$package->slug] : $package; + $type = ucfirst(preg_replace("/s$/", '', $package->package_type)); + $updatable = $this->gpm->{'is' . $type . 'Updatable'}($package->slug); + $installed = $this->gpm->{'is' . $type . 'Installed'}($package->slug); + $local = $this->gpm->{'getInstalled' . $type}($package->slug); + + if (!$installed || !$updatable) { + $version = $installed ? $local->version : $package->version; + $installed = !$installed ? ' (not installed)' : ' (installed)'; + + return str_pad(" [v" . $version . "]", 35) . $installed; + } + + if ($updatable) { + $installed = !$installed ? ' (not installed)' : ' (installed)'; + + return str_pad(" [v" . $package->version . " âžœ v" . $package->available . "]", + 61) . $installed; + } + + return ''; + } +} diff --git a/system/src/Grav/Console/Gpm/InfoCommand.php b/system/src/Grav/Console/Gpm/InfoCommand.php new file mode 100644 index 0000000..53290b8 --- /dev/null +++ b/system/src/Grav/Console/Gpm/InfoCommand.php @@ -0,0 +1,125 @@ +setName("info") + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Force fetching the new data remotely' + ) + ->addArgument( + 'package', + InputArgument::REQUIRED, + 'The package of which more informations are desired. Use the "index" command for a list of packages' + ) + ->setDescription("Shows more informations about a package") + ->setHelp('The info shows more informations about a package'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $this->gpm = new GPM($this->input->getOption('force')); + + $foundPackage = $this->gpm->findPackage($input->getArgument('package')); + + if (!$foundPackage) { + $this->output->writeln("The package '" . $input->getArgument('package') . "' was not found in the Grav repository."); + $this->output->writeln(''); + $this->output->writeln("You can list all the available packages by typing:"); + $this->output->writeln(" " . $this->argv . " index"); + $this->output->writeln(''); + exit; + } + + $this->output->writeln("Found package '" . $input->getArgument('package') . "' under the '" . ucfirst($foundPackage->package_type) . "' section"); + $this->output->writeln(''); + $this->output->writeln("" . $foundPackage->name . " [" . $foundPackage->slug . "]"); + $this->output->writeln(str_repeat('-', strlen($foundPackage->name) + strlen($foundPackage->slug) + 3)); + $this->output->writeln("" . strip_tags($foundPackage->description_plain) . ""); + $this->output->writeln(''); + + $packageURL = ''; + if (isset($foundPackage->author['url'])) { + $packageURL = '<' . $foundPackage->author['url'] . '>'; + } + + $this->output->writeln("" . str_pad("Author", + 12) . ": " . $foundPackage->author['name'] . ' <' . $foundPackage->author['email'] . '> ' . $packageURL); + + foreach (array( + 'version', + 'keywords', + 'date', + 'homepage', + 'demo', + 'docs', + 'guide', + 'repository', + 'bugs', + 'zipball_url', + 'license' + ) as $info) { + if (isset($foundPackage->$info)) { + $name = ucfirst($info); + $data = $foundPackage->$info; + + if ($info == 'zipball_url') { + $name = "Download"; + } + + if ($info == 'date') { + $name = "Last Update"; + $data = date('D, j M Y, H:i:s, P ', strtotime('2014-09-16T00:07:16Z')); + } + + $name = str_pad($name, 12); + $this->output->writeln("" . $name . ": " . $data); + } + } + + $this->output->writeln(''); + $this->output->writeln("You can install this package by typing:"); + $this->output->writeln(" " . $this->argv . " install " . $foundPackage->slug . ""); + $this->output->writeln(''); + + } +} diff --git a/system/src/Grav/Console/Gpm/InstallCommand.php b/system/src/Grav/Console/Gpm/InstallCommand.php new file mode 100644 index 0000000..40bb680 --- /dev/null +++ b/system/src/Grav/Console/Gpm/InstallCommand.php @@ -0,0 +1,533 @@ +setName("install") + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Force re-fetching the data from remote' + ) + ->addOption( + 'all-yes', + 'y', + InputOption::VALUE_NONE, + 'Assumes yes (or best approach) instead of prompting' + ) + ->addOption( + 'destination', + 'd', + InputOption::VALUE_OPTIONAL, + 'The destination where the package should be installed at. By default this would be where the grav instance has been launched from', + GRAV_ROOT + ) + ->addArgument( + 'package', + InputArgument::IS_ARRAY | InputArgument::REQUIRED, + 'The package(s) that are desired to be installed. Use the "index" command for a list of packages' + ) + ->setDescription("Performs the installation of plugins and themes") + ->setHelp('The install command allows to install plugins and themes'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $this->gpm = new GPM($this->input->getOption('force')); + $this->destination = realpath($this->input->getOption('destination')); + + $packages = array_map('strtolower', $this->input->getArgument('package')); + $this->data = $this->gpm->findPackages($packages); + + if (false === $this->isWindows() && @is_file(getenv("HOME").'/.grav/config')) { + $local_config_file = exec('eval echo ~/.grav/config'); + if (file_exists($local_config_file)) { + $this->local_config = Yaml::parse($local_config_file); + } + } + + if ( + !Installer::isGravInstance($this->destination) || + !Installer::isValidDestination($this->destination, [Installer::EXISTS, Installer::IS_LINK]) + ) { + $this->output->writeln("ERROR: " . Installer::lastErrorMsg()); + exit; + } + + $this->output->writeln(''); + + if (!$this->data['total']) { + $this->output->writeln("Nothing to install."); + $this->output->writeln(''); + exit; + } + + if (count($this->data['not_found'])) { + $this->output->writeln("These packages were not found on Grav: " . implode(', ', + array_keys($this->data['not_found'])) . ""); + } + + unset($this->data['not_found']); + unset($this->data['total']); + + foreach ($this->data as $data) { + foreach ($data as $package) { + //Check for dependencies + if (isset($package->dependencies)) { + $this->output->writeln("Package " . $package->name . " has ". count($package->dependencies) . " required dependencies that must be installed first..."); + $this->output->writeln(''); + + $dependency_data = $this->gpm->findPackages($package->dependencies); + + if (!$dependency_data['total']) { + $this->output->writeln("No dependencies found..."); + $this->output->writeln(''); + } else { + unset($dependency_data['total']); + + foreach($dependency_data as $type => $dep_data) { + foreach($dep_data as $name => $dep_package) { + + $this->processPackage($dep_package); + } + } + } + } + + $this->processPackage($package); + } + } + + // clear cache after successful upgrade + $this->clearCache(); + } + + /** + * @param $package + */ + private function processPackage($package) + { + $install_options = ['GPM']; + + // if no name, not found in GPM + if (!isset($package->version)) { + unset($install_options[0]); + } + // if local config found symlink is a valid option + if (isset($this->local_config) && $this->getSymlinkSource($package)) { + $install_options[] = 'Symlink'; + } + // if override set, can install via git + if (isset($package->override_repository)) { + $install_options[] = 'Git'; + } + + // reindex list + $install_options = array_values($install_options); + + if (count($install_options) == 0) { + // no valid install options - error and return + $this->output->writeln("not valid installation methods found!"); + return; + } elseif (count($install_options) == 1) { + // only one option, use it... + $method = $install_options[0]; + } else { + $helper = $this->getHelper('question'); + $question = new ChoiceQuestion( + 'Please select installation method for ' . $package->name . ' ('.$install_options[0].' is default)', array_values($install_options), 0 + ); + $question->setErrorMessage('Method %s is invalid'); + $method = $helper->ask($this->input, $this->output, $question); + } + + $this->output->writeln(''); + + $method_name = 'process'.$method; + $this->$method_name($package); + + $this->installDemoContent($package); + } + + + /** + * @param $package + */ + private function installDemoContent($package) + { + $demo_dir = $this->destination . DS . $package->install_path . DS . '_demo'; + $dest_dir = $this->destination . DS . 'user'; + $pages_dir = $dest_dir . DS . 'pages'; + + if (file_exists($demo_dir)) { + // Demo content exists, prompt to install it. + $this->output->writeln("Attention: ".$package->name . " contains demo content"); + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion('Do you wish to install this demo content? [y|N] ', false); + + if (!$helper->ask($this->input, $this->output, $question)) { + $this->output->writeln(" '- Skipped! "); + $this->output->writeln(''); + return; + } + + // if pages folder exists in demo + if (file_exists($demo_dir . DS . 'pages')) { + $pages_backup = 'pages.' . date('m-d-Y-H-i-s'); + $question = new ConfirmationQuestion('This will backup your current `user/pages` folder to `user/'. $pages_backup. '`, continue? [y|N]', false); + + if (!$helper->ask($this->input, $this->output, $question)) { + $this->output->writeln(" '- Skipped! "); + $this->output->writeln(''); + return; + } + + // backup current pages folder + if (file_exists($dest_dir)) { + if (rename($pages_dir, $dest_dir . DS . $pages_backup)) { + $this->output->writeln(" |- Backing up pages... ok"); + } else { + $this->output->writeln(" |- Backing up pages... failed"); + } + } + } + + // Confirmation received, copy over the data + $this->output->writeln(" |- Installing demo content... ok "); + Folder::rcopy($demo_dir, $dest_dir); + $this->output->writeln(" '- Success! "); + $this->output->writeln(''); + } + } + + /** + * @param $package + * + * @return array + */ + private function getGitRegexMatches($package) + { + if (isset($package->override_repository)) { + $repository = $package->override_repository; + } elseif (isset($package->repository)) { + $repository = $package->repository; + } else { + return false; + } + + preg_match(GIT_REGEX, $repository, $matches); + + return $matches; + } + + /** + * @param $package + * + * @return bool|string + */ + private function getSymlinkSource($package) + { + $matches = $this->getGitRegexMatches($package); + + foreach ($this->local_config as $path) { + if (Utils::endsWith($matches[2], '.git')) { + $repo_dir = preg_replace('/\.git$/', '', $matches[2]); + } else { + $repo_dir = $matches[2]; + } + + $from = rtrim($path, '/') . '/' . $repo_dir; + + if (file_exists($from)) { + return $from; + } + } + return false; + } + + /** + * @param $package + */ + private function processSymlink($package) + { + + exec('cd ' . $this->destination); + + $to = $this->destination . DS . $package->install_path; + $from = $this->getSymlinkSource($package); + + $this->output->writeln("Preparing to Symlink " . $package->name . ""); + $this->output->write(" |- Checking source... "); + + if (file_exists($from)) { + $this->output->writeln("ok"); + + $this->output->write(" |- Checking destination... "); + $checks = $this->checkDestination($package); + + if (!$checks) { + $this->output->writeln(" '- Installation failed or aborted."); + $this->output->writeln(''); + } else { + if (file_exists($to)) { + $this->output->writeln(" '- Symlink cannot overwrite an existing package, please remove first"); + $this->output->writeln(''); + } else { + symlink($from, $to); + + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Symlinking package... ok "); + + $this->output->writeln(" '- Success! "); + $this->output->writeln(''); + } + + + } + return; + } + + $this->output->writeln("not found!"); + $this->output->writeln(" '- Installation failed or aborted."); + } + + /** + * @param $package + */ + private function processGit($package) + { + $matches = $this->getGitRegexMatches($package); + + $this->output->writeln("Preparing to Git clone " . $package->name . " from " . $matches[0]); + + $this->output->write(" |- Checking destination... "); + $checks = $this->checkDestination($package); + + if (!$checks) { + $this->output->writeln(" '- Installation failed or aborted."); + $this->output->writeln(''); + } else { + $cmd = 'cd ' . $this->destination . ' && git clone ' . $matches[0] . ' ' . $package->install_path; + exec($cmd); + + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Cloning package... ok "); + + $this->output->writeln(" '- Success! "); + $this->output->writeln(''); + } + } + + /** + * @param $package + */ + private function processGPM($package) + { + $version = isset($package->available) ? $package->available : $package->version; + + $this->output->writeln("Preparing to install " . $package->name . " [v" . $version . "]"); + + $this->output->write(" |- Downloading package... 0%"); + $this->file = $this->downloadPackage($package); + + $this->output->write(" |- Checking destination... "); + $checks = $this->checkDestination($package); + + if (!$checks) { + $this->output->writeln(" '- Installation failed or aborted."); + $this->output->writeln(''); + } else { + $this->output->write(" |- Installing package... "); + $installation = $this->installPackage($package); + if (!$installation) { + $this->output->writeln(" '- Installation failed or aborted."); + $this->output->writeln(''); + } else { + $this->output->writeln(" '- Success! "); + $this->output->writeln(''); + } + } + } + + /** + * @param $package + * + * @return string + */ + private function downloadPackage($package) + { + $this->tmp = CACHE_DIR . DS . 'tmp/Grav-' . uniqid(); + $filename = $package->slug . basename($package->zipball_url); + $output = Response::get($package->zipball_url, [], [$this, 'progress']); + + Folder::mkdir($this->tmp); + + $this->output->write("\x0D"); + $this->output->write(" |- Downloading package... 100%"); + $this->output->writeln(''); + + file_put_contents($this->tmp . DS . $filename, $output); + + return $this->tmp . DS . $filename; + } + + /** + * @param $package + * + * @return bool + */ + private function checkDestination($package) + { + $question_helper = $this->getHelper('question'); + $skip_prompt = $this->input->getOption('all-yes'); + + Installer::isValidDestination($this->destination . DS . $package->install_path); + + if (Installer::lastErrorCode() == Installer::EXISTS) { + if (!$skip_prompt) { + $this->output->write("\x0D"); + $this->output->writeln(" |- Checking destination... exists"); + + $question = new ConfirmationQuestion(" | '- The package has been detected as installed already, do you want to overwrite it? [y|N] ", + false); + $answer = $question_helper->ask($this->input, $this->output, $question); + + if (!$answer) { + $this->output->writeln(" | '- You decided to not overwrite the already installed package."); + + return false; + } + } + } + + if (Installer::lastErrorCode() == Installer::IS_LINK) { + $this->output->write("\x0D"); + $this->output->writeln(" |- Checking destination... symbolic link"); + + if ($skip_prompt) { + $this->output->writeln(" | '- Skipped automatically."); + + return false; + } + + $question = new ConfirmationQuestion(" | '- Destination has been detected as symlink, delete symbolic link first? [y|N] ", + false); + $answer = $question_helper->ask($this->input, $this->output, $question); + + if (!$answer) { + $this->output->writeln(" | '- You decided to not delete the symlink automatically."); + + return false; + } else { + unlink($this->destination . DS . $package->install_path); + } + } + + $this->output->write("\x0D"); + $this->output->writeln(" |- Checking destination... ok"); + + return true; + } + + /** + * @param $package + * + * @return bool + */ + private function installPackage($package) + { + $type = $package->package_type; + + Installer::install($this->file, $this->destination, ['install_path' => $package->install_path, 'theme' => (($type == 'themes'))]); + $error_code = Installer::lastErrorCode(); + Folder::delete($this->tmp); + + if ($error_code & (Installer::ZIP_OPEN_ERROR | Installer::ZIP_EXTRACT_ERROR)) { + $this->output->write("\x0D"); + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Installing package... error "); + $this->output->writeln(" | '- " . Installer::lastErrorMsg()); + + return false; + } + + $this->output->write("\x0D"); + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Installing package... ok "); + + return true; + } + + /** + * @param $progress + */ + public function progress($progress) + { + $this->output->write("\x0D"); + $this->output->write(" |- Downloading package... " . str_pad($progress['percent'], 5, " ", + STR_PAD_LEFT) . '%'); + } +} diff --git a/system/src/Grav/Console/Gpm/SelfupgradeCommand.php b/system/src/Grav/Console/Gpm/SelfupgradeCommand.php new file mode 100644 index 0000000..9647470 --- /dev/null +++ b/system/src/Grav/Console/Gpm/SelfupgradeCommand.php @@ -0,0 +1,234 @@ +setName("self-upgrade") + ->setAliases(['selfupgrade']) + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Force re-fetching the data from remote' + ) + ->addOption( + 'all-yes', + 'y', + InputOption::VALUE_NONE, + 'Assumes yes (or best approach) instead of prompting' + ) + ->setDescription("Detects and performs an update of Grav itself when available") + ->setHelp('The update command updates Grav itself when a new version is available'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $this->upgrader = new Upgrader($this->input->getOption('force')); + + $update = $this->upgrader->getAssets()['grav-update']; + + $local = $this->upgrader->getLocalVersion(); + $remote = $this->upgrader->getRemoteVersion(); + $release = strftime('%c', strtotime($this->upgrader->getReleaseDate())); + + if (!$this->upgrader->isUpgradable()) { + $this->output->writeln("You are already running the latest version of Grav (v" . $local . ") released on " . $release); + exit; + } + + // not used but preloaded just in case! + new ArrayInput([]); + + $questionHelper = $this->getHelper('question'); + $skipPrompt = $this->input->getOption('all-yes'); + + $this->output->writeln("Grav v$remote is now available [release date: $release]."); + $this->output->writeln("You are currently using v" . GRAV_VERSION . "."); + + if (!$skipPrompt) { + $question = new ConfirmationQuestion("Would you like to read the changelog before proceeding? [y|N] ", + false); + $answer = $questionHelper->ask($this->input, $this->output, $question); + + if ($answer) { + $changelog = $this->upgrader->getChangelog(GRAV_VERSION); + + $this->output->writeln(""); + foreach ($changelog as $version => $log) { + $title = $version . ' [' . $log['date'] . ']'; + $content = preg_replace_callback("/\d\.\s\[\]\(#(.*)\)/", function ($match) { + return "\n" . ucfirst($match[1]) . ":"; + }, $log['content']); + + $this->output->writeln($title); + $this->output->writeln(str_repeat('-', strlen($title))); + $this->output->writeln($content); + $this->output->writeln(""); + } + + $question = new ConfirmationQuestion("Press [ENTER] to continue.", true); + $questionHelper->ask($this->input, $this->output, $question); + } + + $question = new ConfirmationQuestion("Would you like to upgrade now? [y|N] ", false); + $answer = $questionHelper->ask($this->input, $this->output, $question); + + if (!$answer) { + $this->output->writeln("Aborting..."); + + exit; + } + } + + $this->output->writeln(""); + $this->output->writeln("Preparing to upgrade to v$remote.."); + + $this->output->write(" |- Downloading upgrade [" . $this->formatBytes($update['size']) . "]... 0%"); + $this->file = $this->download($update); + + $this->output->write(" |- Installing upgrade... "); + $installation = $this->upgrade(); + + if (!$installation) { + $this->output->writeln(" '- Installation failed or aborted."); + $this->output->writeln(''); + } else { + $this->output->writeln(" '- Success! "); + $this->output->writeln(''); + } + + // clear cache after successful upgrade + $this->clearCache('all'); + } + + /** + * @param $package + * + * @return string + */ + private function download($package) + { + $this->tmp = CACHE_DIR . DS . 'tmp/Grav-' . uniqid(); + $output = Response::get($package['download'], [], [$this, 'progress']); + + Folder::mkdir($this->tmp); + + $this->output->write("\x0D"); + $this->output->write(" |- Downloading upgrade [" . $this->formatBytes($package['size']) . "]... 100%"); + $this->output->writeln(''); + + file_put_contents($this->tmp . DS . $package['name'], $output); + + return $this->tmp . DS . $package['name']; + } + + /** + * @return bool + */ + private function upgrade() + { + Installer::install($this->file, GRAV_ROOT, + ['sophisticated' => true, 'overwrite' => true, 'ignore_symlinks' => true]); + $errorCode = Installer::lastErrorCode(); + Folder::delete($this->tmp); + + if ($errorCode & (Installer::ZIP_OPEN_ERROR | Installer::ZIP_EXTRACT_ERROR)) { + $this->output->write("\x0D"); + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Installing upgrade... error "); + $this->output->writeln(" | '- " . Installer::lastErrorMsg()); + + return false; + } + + $this->output->write("\x0D"); + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Installing upgrade... ok "); + + return true; + } + + /** + * @param $progress + */ + public function progress($progress) + { + $this->output->write("\x0D"); + $this->output->write(" |- Downloading upgrade [" . $this->formatBytes($progress["filesize"]) . "]... " . str_pad($progress['percent'], + 5, " ", STR_PAD_LEFT) . '%'); + } + + /** + * @param $size + * @param int $precision + * + * @return string + */ + public function formatBytes($size, $precision = 2) + { + $base = log($size) / log(1024); + $suffixes = array('', 'k', 'M', 'G', 'T'); + + return round(pow(1024, $base - floor($base)), $precision) . $suffixes[(int)floor($base)]; + } +} diff --git a/system/src/Grav/Console/Gpm/UninstallCommand.php b/system/src/Grav/Console/Gpm/UninstallCommand.php new file mode 100644 index 0000000..4de31aa --- /dev/null +++ b/system/src/Grav/Console/Gpm/UninstallCommand.php @@ -0,0 +1,206 @@ +setName("uninstall") + ->addOption( + 'all-yes', + 'y', + InputOption::VALUE_NONE, + 'Assumes yes (or best approach) instead of prompting' + ) + ->addArgument( + 'package', + InputArgument::IS_ARRAY | InputArgument::REQUIRED, + 'The package(s) that are desired to be removed. Use the "index" command for a list of packages' + ) + ->setDescription("Performs the uninstallation of plugins and themes") + ->setHelp('The uninstall command allows to uninstall plugins and themes'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $this->gpm = new GPM(); + + $packages = array_map('strtolower', $this->input->getArgument('package')); + $this->data = ['total' => 0, 'not_found' => []]; + + foreach ($packages as $package) { + $plugin = $this->gpm->getInstalledPlugin($package); + $theme = $this->gpm->getInstalledTheme($package); + if ($plugin || $theme) { + $this->data[strtolower($package)] = $plugin ?: $theme; + $this->data['total']++; + } else { + $this->data['not_found'][] = $package; + } + } + + $this->output->writeln(''); + + if (!$this->data['total']) { + $this->output->writeln("Nothing to uninstall."); + $this->output->writeln(''); + exit; + } + + if (count($this->data['not_found'])) { + $this->output->writeln("These packages were not found installed: " . implode(', ', + $this->data['not_found']) . ""); + } + + unset($this->data['not_found']); + unset($this->data['total']); + + foreach ($this->data as $slug => $package) { + $this->output->writeln("Preparing to uninstall " . $package->name . " [v" . $package->version . "]"); + + + $this->output->write(" |- Checking destination... "); + $checks = $this->checkDestination($slug, $package); + + if (!$checks) { + $this->output->writeln(" '- Installation failed or aborted."); + $this->output->writeln(''); + } else { + $this->output->write(" |- Uninstalling package... "); + $uninstall = $this->uninstallPackage($slug, $package); + + if (!$uninstall) { + $this->output->writeln(" '- Uninstallation failed or aborted."); + $this->output->writeln(''); + } else { + $this->output->writeln(" '- Success! "); + $this->output->writeln(''); + } + } + } + + // clear cache after successful upgrade + $this->clearCache(); + } + + + /** + * @param $slug + * @param $package + * + * @return bool + */ + private function uninstallPackage($slug, $package) + { + $path = self::getGrav()['locator']->findResource($package->package_type . '://' .$slug); + Installer::uninstall($path); + $errorCode = Installer::lastErrorCode(); + + if ($errorCode && $errorCode !== Installer::IS_LINK && $errorCode !== Installer::EXISTS) { + $this->output->write("\x0D"); + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Uninstalling package... error "); + $this->output->writeln(" | '- " . Installer::lastErrorMsg()); + + return false; + } + + $this->output->write("\x0D"); + // extra white spaces to clear out the buffer properly + $this->output->writeln(" |- Uninstalling package... ok "); + + return true; + } + + /** + * @param $slug + * @param $package + * + * @return bool + */ + + private function checkDestination($slug, $package) + { + $path = self::getGrav()['locator']->findResource($package->package_type . '://' . $slug); + $questionHelper = $this->getHelper('question'); + $skipPrompt = $this->input->getOption('all-yes'); + + Installer::isValidDestination($path); + + if (Installer::lastErrorCode() == Installer::IS_LINK) { + $this->output->write("\x0D"); + $this->output->writeln(" |- Checking destination... symbolic link"); + + if ($skipPrompt) { + $this->output->writeln(" | '- Skipped automatically."); + + return false; + } + + $question = new ConfirmationQuestion(" | '- Destination has been detected as symlink, delete symbolic link first? [y|N] ", + false); + $answer = $questionHelper->ask($this->input, $this->output, $question); + + if (!$answer) { + $this->output->writeln(" | '- You decided to not delete the symlink automatically."); + + return false; + } + } + + $this->output->write("\x0D"); + $this->output->writeln(" |- Checking destination... ok"); + + return true; + } +} diff --git a/system/src/Grav/Console/Gpm/UpdateCommand.php b/system/src/Grav/Console/Gpm/UpdateCommand.php new file mode 100644 index 0000000..f5c3f9a --- /dev/null +++ b/system/src/Grav/Console/Gpm/UpdateCommand.php @@ -0,0 +1,224 @@ +setName("update") + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Force re-fetching the data from remote' + ) + ->addOption( + 'destination', + 'd', + InputOption::VALUE_OPTIONAL, + 'The grav instance location where the updates should be applied to. By default this would be where the grav cli has been launched from', + GRAV_ROOT + ) + ->addOption( + 'all-yes', + 'y', + InputOption::VALUE_NONE, + 'Assumes yes (or best approach) instead of prompting' + ) + ->addArgument( + 'package', + InputArgument::IS_ARRAY | InputArgument::OPTIONAL, + 'The package or packages that is desired to update. By default all available updates will be applied.' + ) + ->setDescription("Detects and performs an update of plugins and themes when available") + ->setHelp('The update command updates plugins and themes when a new version is available'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $this->gpm = new GPM($this->input->getOption('force')); + $this->destination = realpath($this->input->getOption('destination')); + $skip_prompt = $this->input->getOption('all-yes'); + + if (!Installer::isGravInstance($this->destination)) { + $this->output->writeln("ERROR: " . Installer::lastErrorMsg()); + exit; + } + + $this->data = $this->gpm->getUpdatable(); + $only_packages = array_map('strtolower', $this->input->getArgument('package')); + + if (!$this->data['total']) { + $this->output->writeln("Nothing to update."); + exit; + } + + $this->output->write("Found " . $this->gpm->countInstalled() . " extensions installed of which " . $this->data['total'] . " need updating"); + + $limit_to = $this->userInputPackages($only_packages); + + $this->output->writeln(''); + + unset($this->data['total']); + unset($limit_to['total']); + + + // updates review + $slugs = []; + + $index = 0; + foreach ($this->data as $packages) { + foreach ($packages as $slug => $package) { + if (count($limit_to) && !array_key_exists($slug, $limit_to)) { + continue; + } + + $this->output->writeln( + // index + str_pad($index++ + 1, 2, '0', STR_PAD_LEFT) . ". " . + // name + "" . str_pad($package->name, 15) . " " . + // version + "[v" . $package->version . " âžœ v" . $package->available . "]" + ); + $slugs[] = $slug; + } + } + + if (!$skip_prompt) { + // prompt to continue + $this->output->writeln(""); + $questionHelper = $this->getHelper('question'); + $question = new ConfirmationQuestion("Continue with the update process? [Y|n] ", true); + $answer = $questionHelper->ask($this->input, $this->output, $question); + + if (!$answer) { + $this->output->writeln("Update aborted. Exiting..."); + exit; + } + } + + // finally update + $install_command = $this->getApplication()->find('install'); + + $args = new ArrayInput(array( + 'command' => 'install', + 'package' => $slugs, + '-f' => $this->input->getOption('force'), + '-d' => $this->destination, + '-y' => true + )); + $command_exec = $install_command->run($args, $this->output); + + if ($command_exec != 0) { + $this->output->writeln("Error: An error occurred while trying to install the extensions"); + exit; + } + } + + /** + * @param $only_packages + * + * @return array + */ + private function userInputPackages($only_packages) + { + $found = ['total' => 0]; + $ignore = []; + + if (!count($only_packages)) { + $this->output->writeln(''); + } else { + foreach ($only_packages as $only_package) { + $find = $this->gpm->findPackage($only_package); + + if (!$find || !$this->gpm->isUpdatable($find->slug)) { + $name = isset($find->slug) ? $find->slug : $only_package; + $ignore[$name] = $name; + } else { + $found[$find->slug] = $find; + $found['total']++; + } + } + + if ($found['total']) { + $list = $found; + unset($list['total']); + $list = array_keys($list); + + if ($found['total'] !== $this->data['total']) { + $this->output->write(", only " . $found['total'] . " will be updated"); + } + + $this->output->writeln(''); + $this->output->writeln("Limiting updates for only " . implode(', ', + $list) . ""); + } + + if (count($ignore)) { + $this->output->writeln("Packages not found or not requiring updates: " . implode(', ', + $ignore) . ""); + } + } + + return $found; + } +} diff --git a/system/src/Grav/Console/Gpm/VersionCommand.php b/system/src/Grav/Console/Gpm/VersionCommand.php new file mode 100644 index 0000000..c1068d8 --- /dev/null +++ b/system/src/Grav/Console/Gpm/VersionCommand.php @@ -0,0 +1,102 @@ +setName("version") + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Force re-fetching the data from remote' + ) + ->addArgument( + 'package', + InputArgument::IS_ARRAY | InputArgument::OPTIONAL, + 'The package or packages that is desired to know the version of. By default and if not specified this would be grav' + ) + ->setDescription("Shows the version of an installed package. If available also shows pending updates.") + ->setHelp('The version command displays the current version of a package installed and, if available, the available version of pending updates'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + + $this->gpm = new GPM($this->input->getOption('force')); + $packages = $this->input->getArgument('package'); + + $installed = false; + + if (!count($packages)) { + $packages = ['grav']; + } + + foreach ($packages as $package) { + $package = strtolower($package); + $name = null; + $version = null; + $updatable = false; + + if ($package == 'grav') { + $name = 'Grav'; + $version = GRAV_VERSION; + $upgrader = new Upgrader(); + + if ($upgrader->isUpgradable()) { + $updatable = ' [upgradable: v' . $upgrader->getRemoteVersion() . ']'; + } + + } else { + if ($installed = $this->gpm->findPackage($package)) { + $name = $installed->name; + $version = $installed->version; + + if ($this->gpm->isUpdatable($package)) { + $updatable = ' [updatable: v' . $installed->available . ']'; + } + } + } + + $updatable = $updatable ?: ''; + + if ($installed || $package == 'grav') { + $this->output->writeln('You are running ' . $name . ' v' . $version . '' . $updatable); + } else { + $this->output->writeln('Package ' . $package . ' not found'); + } + } + } +} diff --git a/system/tests/Grav/Test/.gitkeep b/system/tests/Grav/Test/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/system/tests/Grav/TestCase.php b/system/tests/Grav/TestCase.php new file mode 100644 index 0000000..718bbad --- /dev/null +++ b/system/tests/Grav/TestCase.php @@ -0,0 +1,8 @@ + + + + + ./Grav/ + + + diff --git a/user/accounts/.gitkeep b/user/accounts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/user/accounts/root.yaml b/user/accounts/root.yaml new file mode 100644 index 0000000..7d060f2 --- /dev/null +++ b/user/accounts/root.yaml @@ -0,0 +1,10 @@ +email: dev@g-u-i.net +access: + admin: + login: true + super: true + site: + login: true +fullname: root +title: null +hashed_password: $2y$10$s2zi8/sd5I4oRAoNQPu8IetLZfSHbI5199IxUdIzLBq6y6H5TuxEu diff --git a/user/config/site.yaml b/user/config/site.yaml new file mode 100644 index 0000000..f45a68d --- /dev/null +++ b/user/config/site.yaml @@ -0,0 +1,41 @@ +title: Ouidade Soussi Chiadmi # Name of the site + +subtitle: Photographie + +adresse: +email: contact@ouidade.com + + +author: + name: Bachir Soussi Chiadmi # Default author name + # email: 'john@email.com' # Default author email + +taxonomies: [tag, category, client] # Arbitrary list of taxonomy types +#[édition,édition jeunesse,art,identité visuelle,signalétique,évènement + +metadata: + description: 'Photographie' # Site description + +summary: + enabled: true # enable or disable summary of page + format: short # long = summary delimiter will be ignored; short = use the first occurrence of delimiter or size + size: 300 # Maximum length of summary (characters) + delimiter: === # The summary delimiter + +# redirects: +# /redirect-test: / # Redirect test goes to home page +# /old/(.*): /new/$1 # Would redirect /old/my-page to /new/my-page +# +# routes: +# /something/else: '/blog/sample-3' # Alias for /blog/sample-3 +# /new/(.*): '/blog/$1' # Regex any /new/my-page URL to /blog/my-page Route +# +# blog: +# route: '/blog' # Custom value added (accessible via system.blog.route) + +#menu: # Sample Menu Example +# - text: Source +# icon: github +# url: https://github.com/getgrav/grav +# - icon: twitter +# url: http://twitter.com/getgrav diff --git a/user/config/system.yaml b/user/config/system.yaml new file mode 100644 index 0000000..e1fffd6 --- /dev/null +++ b/user/config/system.yaml @@ -0,0 +1,41 @@ +absolute_urls: false + +home: + alias: '/projets' + +pages: + theme: ouidade + markdown_extra: false + process: + markdown: true + twig: false + +cache: + enabled: false + check: + method: file + driver: auto + prefix: 'g' + +twig: + cache: true + debug: true + auto_reload: true + autoescape: false + +assets: + css_pipeline: false + css_minify: true + css_rewrite: true + js_pipeline: false + js_minify: true + +errors: + display: true + log: true + +debugger: + enabled: false + twig: true + shutdown: + close_connection: true diff --git a/user/data/.gitkeep b/user/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/user/plugins/.gitkeep b/user/plugins/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/user/plugins/admin/CHANGELOG.md b/user/plugins/admin/CHANGELOG.md new file mode 100644 index 0000000..46c6db3 --- /dev/null +++ b/user/plugins/admin/CHANGELOG.md @@ -0,0 +1,261 @@ +# v1.0.0-rc.4 +## 10/29/2015 + +1. [](#improved) + * Changed admin menu event hook to `onAdminMenu()` + * Minor improvements for admin page location + * Additional lang strings for Grav 1.0.0-rc.3 + +# v1.0.0-rc.3 +## 10/27/2015 + +1. [](#improved) + * Rely on context-language for active language + * Improved some Russian translations + * Only show login if not already logged in +1. [](#bugfix) + * Disable asset pipeline in admin only + * Fix Editor cursor insertion point when text is selected in some actions + +# v1.0.0-rc.2 +## 10/23/2015 + +1. [](#bugfix) + * Reverted lang redirect code. Needs to be reworked to be more reliable + +# v1.0.0-rc.1 +## 10/23/2015 + +1. [](#new) + * Redirect to non-language URL except for `pages/` +1. [](#improved) + * New language strings for new `system.yaml` fields + * Improved Russian translations + * Improved compatibility with PECL Yaml parser +1. [](#bugfix) + * Redirect to correct page if you change folder/slug + * Fix issue with Asset pipeline not being disabled in admin + * Fix for HTML in text input fields + * Fixed various icons in headers + +# v0.6.2 +## 10/15/2015 + +1. [](#improved) + * Use `title` rather than `menu` in Page listing + * Wrapped language strings in double-quotes + * New language strings for new fields +1. [](#bugfix) + * Fixed issue with IE not able to save pages + +# v0.6.1 +## 10/07/2015 + +1. [](#new) + * Added the ability to render front-end templates in markdown preview + * Option to disable Google-based fonts. Useful for Cyrillic languages. + * Couple of new static helper methods used by new page blueprints + * New `fieldset` form field (thanks @Sommerregen!) +1. [](#improved) + * Hide editor buttons in preview mode + * Improved support for admin when offline + * Use relative URL in Login form + * Added some more missing lang strings + * Improved German translation + * Compressed CSS files for improved performance + * Only get last 7 days in week count calculation +1. [](#bugfix) + * Fix saving pages in local-specific languages + * Only track 'human' page hits in statistics + * Responsive fixes for 'wordy' languages + * Fixed delete issue with array field type + * Fixed some hardcoded `admin` references to allow admin path change + * Fix for issue with lang code being added twice + * Fix language name in admin buttons + +# v0.6.0 +## 09/16/2015 + +1. [](#new) + * Support for custom markdown editor buttons! + * Added Russian translations + * Added Japanese translations + * Ajax session keep-alive when editing forms +1. [](#improved) + * Added missing Italian translations + * Added additional options field into the pages form field +1. [](#bugfix) + * Fix GPM errors in offline mode + * Fix for duplicate status messages + +# v0.5.0 +## 09/11/2015 + +1. [](#new) + * Responsive layout for mobile compatibility (thanks @Vivalldi!) + * Added page type and many other new filters to Page list view + * Added granular ACL requirements to admin pages + * Ability to define page date format + * Added `onAdminTemplateNavPluginHook` to allow for plugins to hook into sidebar + * Added YAML Twig filters (to and from) + * Support for nested metadata + * Added ability to disable automatic update checks via admin plugin configuration + * Initial Spanish translation +1. [](#improved) + * Check for existence of a user account + * Various language additions + * Refactored form fields to remove duplicates from form plugin + * Improved date picker + * Improved display field + * Add page template type to page list view + * Various UI fixes + * Added some default field 'focus' to save clicking + * Only allow "Add Modular" if the theme has modular templates + * Updated `chartist.js` library + * Updated 'fontawesome' fonts to the latest v4.4 +1. [](#bugfix) + * Fix for "drag-n-drop" of non-image media + * Fix a fatal error in GPM when offline + * Fix a z-index bug with tooltips + * Fix a z-index bug in lang dropdowns + * Don't allow deleting of last empty array field + * Fix for images with parenthesis in filenames + * Fix for page title visualization when not set + * Fix for cursor position in folder/array fields + +# v0.4.3 +## 08/31/2015 + +1. [](#new) + * Added Japanese translation + * Support for independent file name and template override +1. [](#improved) + * Improved slug generation using `slugify.js` + * Allow the `title` twig variables to set the page title + * Improved Page media handling with several bugfixes + * Prevent error when there are no pages on a site + * If all updates are applied, show "Fully Updated" text in dashboard + * Better preview link (requires `rtrim` filter from Grav 0.9.40) + * Order all plugins and themes alphabetically + * Removed duplicate language entries +1. [](#bugfix) + * Fix for redirect after saving when multilang not enabled + * Fix for deleting responsive media + * Fix for HTML encoding in markdown field + +# v0.4.2 +## 08/25/2015 + +1. [](#bugfix) + * Fix for current admin lang not showing up in page lang dropdown + * Fix for incorrect NAME/CONTENT lang keys + * Fix for incorrect site link + +# v0.4.1 +## 08/24/2015 + +1. [](#bugfix) + * Fix for broken **Add Page** - Doh! + * Fix for empty site link when at root + +# v0.4.0 +## 08/24/2015 + +1. [](#new) + * Multi-language Page support!!! + * Admin languages configurable per user + * Toastr messages for `check updates` + * new `tu` filter for admin translations + * Italian and German admin translations + * Added a save location in system and site configuration + * Page metadata now uses flexible array field +1. [](#improved) + * Allow subpages of modular pages to display in pages list + * Open external pages in new tabs + * Reworked `visibility` of pages + * Use `PLUGIN_ADMIN` prefix for translations + * Added link to gravatar.com to avoid confusion on avatar + * Limit page count to 200 in ordering field + * Fixed various Safari _flex_ issues + * Use `rawRoute()` for page links + * Minor `param separator` fixes + * Various CSS fixes + * Improved CodeMirror to force spaces + * Added **Selectize** dropdowns to various forms and modals +1. [](#bugfix) + * Fix for `Call to a member function path() on non-object` error + * Fixed dropdown z-index issues + * Correctly set the filename including language if set + * Fix for empty taxonomies on page save + * Fix for page not redirecting properly on folder change + * Fix for table headers styling + * Added missing translation strings + * Unique page counting in total page counts + * Fixed JS warning with page filtering and deleting + + +# v0.3.0 +## 08/11/2015 + +1. [](#new) + * Show current date in form date format fields + * Added a new **check for updates** button to flush GPM + * Added session timeout configuration for admin + * Added `isSymlink` logic for Grav + * Added new `phpinfo` page +1. [](#improved) + * Improved toggleables + * Support `param_separator` for Apache on windows + * Logout now goes to interstitial to provide session messages + * Updated hints and improved formatting + * Encoding URI for images in editor preview + * Create user `system.yaml` and `site.yaml` if they are missing + * Open external links in new tab by default + * Set edit mode to `normal` by default + * Disable CSS/JS pipelining in the admin +1. [](#bugfix) + * Fixed form submission not working in IE + * Fix fatal error when deleting homepage + * Prevent admin plugin activating when the URL of a page contains partial route + +# v0.2.0 +## 08/06/2015 + +1. [](#new) + * Added multiple **clear cache** types + * Added back to themes link when adding new themes + * Properly handles visibility and ordering and guesses best option on new + * Added new templates field with support for custom (unsupported) template type + * Added new display field for displaying simple text value + * **Update Grav** button now works + * Added spanish translation + * Added german translation +1. [](#improved) + * Improved page order handling logic + * Implemented 2-step theme switching logic with warning + * Force `modular` page class for modular template + * Clear page cache on page delete (ghost pages still showing) + * Clears route on page save so changes such as `slug` are picked up + * Fix dashboard layout in Safari + * Added tooltips for official 'Team Grav' themes/plugins +1. [](#bugfix) + * Handle modular page templates on create + * Fixed Firefox JS error for arrays + * Ensure we don't change page type to empty and save (causing page to be deleted) + * Fixed some minor CSS issues with editor + * Fixed link to RocketTheme.com + * Disabled fields now stay properly disabled + +# v0.1.1 +## 08/04/2015 + +1. [](#bugfix) + * Fixed GitHub URLs + * Hiding toggle for disabling Admin plugin + * Removed extra text not needed + +# v0.1.0 +## 08/04/2015 + +1. [](#new) + * ChangeLog started... diff --git a/user/plugins/admin/LICENSE b/user/plugins/admin/LICENSE new file mode 100644 index 0000000..0e788c6 --- /dev/null +++ b/user/plugins/admin/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Grav + +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. diff --git a/user/plugins/admin/README.md b/user/plugins/admin/README.md new file mode 100644 index 0000000..4aaad46 --- /dev/null +++ b/user/plugins/admin/README.md @@ -0,0 +1,110 @@ +# Grav Standard Administration Panel Plugin + +[![Join the chat at https://gitter.im/getgrav/grav-plugin-admin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/getgrav/grav-plugin-admin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +This **admin plugin** for [Grav](http://github.com/getgrav/grav) is an HTML user interface that provides a convenient way to configure Grav and easily create and modify pages. This will remain a totally optional plugin, and is not in any way required or needed to use Grav effectively. In fact, the admin provides an intentionally limited view to ensure it remains easy to use and not overwhelming. I'm sure power users will still prefer to work with the configuration files directly. + +> IMPORTANT!!! This plugin is currently in development as is to be considered a **beta release**. As such, use this in a production environment **at your own risk!**. + +![](assets/admin-dashboard.png) + +# Features + +* User login with automatic password encryption +* Forgot password functionality +* Logged-in-user management +* One click Grav core updates +* Dashboard with maintenance status, site activity and latest page updates +* Ajax-powered backup capability +* Ajax-powered clear-cache capability +* System configuration management +* Site configuration management +* Normal and Expert modes which allow editing via forms or YAML +* Page listing with filtering and search +* Page creation, editing, moving, copying, and deleting +* Powerful syntax highlighting code editor with instant Grav-powered preview +* Editor features, hot keys, toolbar, and distraction-free fullscreen mode +* Drag-n-drop upload of page media files including drag-n-drop placement in the editor +* One click theme and plugin updates +* Plugin manager that allows listing and configuration of installed plugins +* Theme manager that allows listing and configuration of installed themes +* GPM-powered installation of new plugins and themes + +# Support + +#### Support + +We have tested internally, but we hope to use this public beta phase to identify, isolate, and fix issues related to the plugin to ensure it is as solid and reliable as possible. + +For **live chatting**, please use the dedicated [Gitter Chat Room for the admin plugin](https://gitter.im/getgrav/grav-plugin-admin) for discussions directly related to the admin plugin. + +For **bugs, features, improvements**, please ensure you [create issues in the admin plugin GitHub repository](https://github.com/getgrav/grav-plugin-admin). + +# Installation + +First ensure you are running the latest **Grav 0.9.34 or later**. This is required for the admin plugin to run properly (`-f` forces a refresh of the GPM index). + +``` +$ bin/gpm selfupgrade -f +``` + +The admin plugin actually requires the help of 3 other plugins, so to get the admin plugin to work you first need to install **admin**, **login**, **forms**, and **email** plugins. These are available via GPM, and because the plugin has dependencies you just need to proceed and install the admin plugin, and agree when prompted to install the others: + +``` +$ bin/gpm install admin +``` + +### Manual Installation + +Manual installation is not the recommended method of installation, however, it is still possible to install the admin plugin manually. Basically, you need to download each of the following plugins individually: + +* [admin](https://github.com/getgrav/grav-plugin-admin/archive/develop.zip) +* [login](https://github.com/getgrav/grav-plugin-login/archive/develop.zip) +* [form](https://github.com/getgrav/grav-plugin-form/archive/develop.zip) +* [email](https://github.com/getgrav/grav-plugin-email/archive/develop.zip) + +Extract each archive file into your `user/plugins` folder, then ensure the folders are renamed to just `admin/`, `login/`, `form/`, and `email/`. Then proceed with the **Usage instructions below**. + +# Usage + +### Create User with CLI + +After this you need to create a user account with admin privileges: + +``` +$ bin/grav newuser +``` + +### Create User Manually + +Alternatively, you can create a user account manually, in a file called `user/accounts/admin.yaml`. This **filename** is actually the **username** that you will use to login. The contents will contain the other information for the user. + +``` +password: 'password' +email: 'youremail@mail.com' +fullname: 'Johnny Appleseed' +title: 'Site Administrator' +access: + admin: + login: true + super: true +``` + +Of course you should edit your `email`, `password`, `fullname`, and `title` to suit your needs. + +> You can use any password when you manually put it in this `.yaml` file. However, when you change your password in the admin, it must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters. + +# Accessing the Admin + +By default, you can access the admin by pointing your browser to `http://yoursite.com/admin`. You can simply log in with the `username` and `password` set in the YAML file you configured earlier. + +> After logging in, your **plaintext password** will be removed and replaced by an **encrypted** one. + +# Standard Free & Paid Pro Versions + +If you have been following the [blog](http://getgrav.org/blog), [Twitter](https://twitter.com/getgrav), [gitter.im chat](https://gitter.im/getgrav/grav), etc., you probably already know now that our intention is to provide two versions of this plugin. + +The **standard free version**, is very powerful, and has more functionality than most commercial flat-file CMS systems. + +We also intend to release in the near future a more feature-rich **pro version** that will include enhanced functionality, as well as some additional nice-to-have capabilities. This pro version will be a **paid** plugin the price of which is not yet 100% finalized. + diff --git a/user/plugins/admin/admin.php b/user/plugins/admin/admin.php new file mode 100644 index 0000000..c605d07 --- /dev/null +++ b/user/plugins/admin/admin.php @@ -0,0 +1,414 @@ + [['login', 100000], ['onPluginsInitialized', 1000]], + 'onShutdown' => ['onShutdown', 1000] + ]; + } + + /** + * If the admin path matches, initialize the Login plugin configuration and set the admin + * as active. + */ + public function login() + { + // Check for Pro version is enabled + if ($this->config->get('plugins.admin-pro.enabled')) { + $this->active = false; + return; + } + + $route = $this->config->get('plugins.admin.route'); + if (!$route) { + return; + } + + $this->grav['debugger']->addMessage("Admin Basic"); + + $this->base = '/' . trim($route, '/'); + $this->uri = $this->grav['uri']; + + // Only activate admin if we're inside the admin path. + if ($this->uri->route() == $this->base || + substr($this->uri->route(), 0, strlen($this->base) + 1) == $this->base . '/') { + $this->active = true; + } + } + + /** + * If the admin plugin is set as active, initialize the admin + */ + public function onPluginsInitialized() + { + // Only activate admin if we're inside the admin path. + if ($this->active) { + $this->initializeAdmin(); + + // Disable Asset pipelining + $this->config->set('system.assets.css_pipeline', false); + $this->config->set('system.assets.js_pipeline', false); + } + + // We need popularity no matter what + require_once __DIR__ . '/classes/popularity.php'; + $this->popularity = new Popularity(); + } + + /** + * Sets longer path to the home page allowing us to have list of pages when we enter to pages section. + */ + public function onPagesInitialized() + { + $this->session = $this->grav['session']; + + // Set original route for the home page. + $home = '/' . trim($this->config->get('system.home.alias'), '/'); + + // set the default if not set before + $this->session->expert = $this->session->expert ?: false; + + // set session variable if it's passed via the url + if ($this->uri->param('mode') == 'expert') { + $this->session->expert = true; + } elseif ($this->uri->param('mode') == 'normal') { + $this->session->expert = false; + } + + // check for existence of a user account + $account_dir = $file_path = $this->grav['locator']->findResource('account://'); + $user_check = (array) glob($account_dir . '/*.yaml'); + if (!count($user_check) > 0) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.NO_USER_ACCOUNTS'), 'info'); + } + + /** @var Pages $pages */ + $pages = $this->grav['pages']; + + $this->grav['admin']->routes = $pages->routes(); + + // Remove default route from routes. + if (isset($this->grav['admin']->routes['/'])) { + unset($this->grav['admin']->routes['/']); + } + + $page = $pages->dispatch('/', true); + + // If page is null, the default page does not exist, and we cannot route to it + if ($page) { + $page->route($home); + } + + // Make local copy of POST. + $post = !empty($_POST) ? $_POST : array(); + + // Handle tasks. + $this->admin->task = $task = !empty($post['task']) ? $post['task'] : $this->uri->param('task'); + if ($task) { + require_once __DIR__ . '/classes/controller.php'; + $controller = new AdminController($this->grav, $this->template, $task, $this->route, $post); + $controller->execute(); + $controller->redirect(); + } elseif ($this->template == 'logs' && $this->route) { + // Display RAW error message. + echo $this->admin->logEntry(); + exit(); + } + + $self = $this; + + // Replace page service with admin. + $this->grav['page'] = function () use ($self) { + $page = new Page; + + if (file_exists(__DIR__ . "/pages/admin/{$self->template}.md")) { + $page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$self->template}.md")); + $page->slug(basename($self->template)); + return $page; + } + + // If the page cannot be found, try looking in plugins. + // Allows pages added by plugins in admin + $plugins = Grav::instance()['config']->get('plugins', []); + + foreach($plugins as $plugin => $data) { + $path = $this->grav['locator']->findResource( + "user://plugins/{$plugin}/admin/pages/{$self->template}.md"); + + if (file_exists($path)) { + $page->init(new \SplFileInfo($path)); + $page->slug(basename($self->template)); + return $page; + } + } + }; + } + + /** + * Add twig paths to plugin templates. + */ + public function onTwigTemplatePaths() + { + $twig_paths = []; + $this->grav->fireEvent('onAdminTwigTemplatePaths', new Event(['paths' => &$twig_paths])); + + $twig_paths[] = __DIR__ . '/themes/' . $this->theme . '/templates'; + + $this->grav['twig']->twig_paths = $twig_paths; + + } + + /** + * Set all twig variables for generating output. + */ + public function onTwigSiteVariables() + { + $twig = $this->grav['twig']; + + // Dynamic type support + $format = $this->uri->extension(); + $ext = '.' . ($format ? $format : 'html') . TWIG_EXT; + + $twig->twig_vars['location'] = $this->template; + $twig->twig_vars['base_url_relative_frontend'] = $twig->twig_vars['base_url_relative'] ?: '/'; + $twig->twig_vars['admin_route'] = trim($this->config->get('plugins.admin.route'), '/'); + $twig->twig_vars['base_url_relative'] = + $twig->twig_vars['base_url_simple'] . '/' . $twig->twig_vars['admin_route']; + $twig->twig_vars['theme_url'] = '/user/plugins/admin/themes/' . $this->theme; + $twig->twig_vars['base_url'] = $twig->twig_vars['base_url_relative']; + $twig->twig_vars['base_path'] = GRAV_ROOT; + $twig->twig_vars['admin'] = $this->admin; + + // Gather Plugin-hooked nav items + $this->grav->fireEvent('onAdminMenu'); + + // DEPRECATED + $this->grav->fireEvent('onAdminTemplateNavPluginHook'); + + switch ($this->template) { + case 'dashboard': + $twig->twig_vars['popularity'] = $this->popularity; + break; + case 'pages': + $page = $this->admin->page(true); + if ($page != null) { + $twig->twig_vars['file'] = File::instance($page->filePath()); + $twig->twig_vars['media_types'] = str_replace('defaults,', '', + implode(',.', array_keys($this->config->get('media')))); + + } + break; + } + } + + public function onShutdown() + { + // Just so we know that we're in this debug mode + if ($this->config->get('plugins.admin.popularity.enabled')) { + + // Only track non-admin + if (!$this->active) { + $this->popularity->trackHit(); + } + } + } + + /** + * Handles getting GPM updates + */ + public function onTaskGPM() + { + $action = $_POST['action']; // getUpdatable | getUpdatablePlugins | getUpdatableThemes | gravUpdates + $flush = isset($_POST['flush']) && $_POST['flush'] == true ? true : false; + + if (isset($this->grav['session'])) { + $this->grav['session']->close(); + } + + try { + $gpm = new GPM($flush); + + switch ($action) { + case 'getUpdates': + $resources_updates = $gpm->getUpdatable(); + $grav_updates = [ + "isUpdatable" => $gpm->grav->isUpdatable(), + "assets" => $gpm->grav->getAssets(), + "version" => GRAV_VERSION, + "available" => $gpm->grav->getVersion(), + "date" => $gpm->grav->getDate(), + "isSymlink" => $gpm->grav->isSymlink() + ]; + + echo json_encode([ + "status" => "success", + "payload" => ["resources" => $resources_updates, "grav" => $grav_updates, "installed" => $gpm->countInstalled(), 'flushed' => $flush] + ]); + break; + } + } catch (\Exception $e) { + echo json_encode(["status" => "error", "message" => $e->getMessage()]); + } + + exit; + } + + /** + * Initialize the admin. + * + * @throws \RuntimeException + */ + protected function initializeAdmin() + { + $this->enable([ + 'onTwigExtensions' => ['onTwigExtensions', 1000], + 'onPagesInitialized' => ['onPagesInitialized', 1000], + 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1000], + 'onTwigSiteVariables' => ['onTwigSiteVariables', 1000], + 'onTask.GPM' => ['onTaskGPM', 0] + ]); + + // Check for required plugins + if (!$this->grav['config']->get('plugins.login.enabled') || + !$this->grav['config']->get('plugins.form.enabled') || + !$this->grav['config']->get('plugins.email.enabled')) { + throw new \RuntimeException('One of the required plugins is missing or not enabled'); + } + + // Double check we have system.yaml and site.yaml + $config_files[] = $this->grav['locator']->findResource('user://config') . '/system.yaml'; + $config_files[] = $this->grav['locator']->findResource('user://config') . '/site.yaml'; + foreach ($config_files as $config_file) { + if (!file_exists($config_file)) { + touch($config_file); + } + } + + // Decide admin template and route. + $path = trim(substr($this->uri->route(), strlen($this->base)), '/'); + $this->template = 'dashboard'; + + if ($path) { + $array = explode('/', $path, 2); + $this->template = array_shift($array); + $this->route = array_shift($array); + } + + /** @var Language $language */ +// $require_language = ['pages', 'translations']; +// $language = $this->grav['language']; +// if ($language->isLanguageInUrl() && !in_array($this->template, $require_language)) { +// $this->grav->redirect($this->uri->route()); +// } + + // Initialize admin class. + require_once __DIR__ . '/classes/admin.php'; + $this->admin = new Admin($this->grav, $this->base, $this->template, $this->route); + + // And store the class into DI container. + $this->grav['admin'] = $this->admin; + + // Get theme for admin + $this->theme = $this->config->get('plugins.admin.theme', 'grav'); + + $assets = $this->grav['assets']; + $translations = 'if (!window.translations) window.translations = {}; ' . PHP_EOL . 'window.translations.PLUGIN_ADMIN = {};' . PHP_EOL; + + $strings = ['EVERYTHING_UP_TO_DATE', + 'UPDATES_ARE_AVAILABLE', + 'IS_AVAILABLE_FOR_UPDATE', + 'AND', + 'IS_NOW_AVAILABLE', + 'CURRENT', + 'UPDATE_GRAV_NOW', + 'TASK_COMPLETED', + 'UPDATE', + 'UPDATING_PLEASE_WAIT', + 'GRAV_SYMBOLICALLY_LINKED', + 'OF_YOUR', + 'OF_THIS', + 'HAVE_AN_UPDATE_AVAILABLE', + 'UPDATE_AVAILABLE', + 'UPDATES_AVAILABLE', + 'FULLY_UPDATED', + 'DAYS']; + + foreach($strings as $string) { + $translations .= 'translations.PLUGIN_ADMIN.' . $string .' = "' . $this->admin->translate('PLUGIN_ADMIN.' . $string) . '"; ' . PHP_EOL;; + } + + $assets->addInlineJs($translations); + } + + /** + * Add Twig Extensions + */ + public function onTwigExtensions() + { + require_once(__DIR__.'/twig/AdminTwigExtension.php'); + $this->grav['twig']->twig->addExtension(new AdminTwigExtension()); + } +} diff --git a/user/plugins/admin/admin.yaml b/user/plugins/admin/admin.yaml new file mode 100644 index 0000000..004fe14 --- /dev/null +++ b/user/plugins/admin/admin.yaml @@ -0,0 +1,20 @@ +enabled: true +route: '/admin' +theme: grav +dashboard: + days_of_stats: 7 +session: + timeout: 1800 +warnings: + delete_page: true +edit_mode: normal +show_beta_msg: true +google_fonts: true +enable_auto_updates_check: true +popularity: + enabled: true + ignore: ['/test*','/modular'] + history: + daily: 30 + monthly: 12 + visitors: 20 diff --git a/user/plugins/admin/assets/admin-dashboard.png b/user/plugins/admin/assets/admin-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..e379ba5d43b998d11adb8df5e7c571d7cc7fcbce GIT binary patch literal 180920 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 Jj(a?>(J!;pg;x*5=14p|&}oeks{WezhtL>Id* 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 literal 0 HcmV?d00001 diff --git a/user/plugins/admin/blueprints.yaml b/user/plugins/admin/blueprints.yaml new file mode 100644 index 0000000..c73bd2e --- /dev/null +++ b/user/plugins/admin/blueprints.yaml @@ -0,0 +1,166 @@ +name: Admin Panel +version: 1.0.0-rc.4 +description: Adds an advanced administration panel to manage your site +icon: empire +author: + name: Team Grav + email: devs@getgrav.org + url: http://getgrav.org +homepage: https://github.com/getgrav/grav-plugin-admin +keywords: admin, plugin, manager, panel +bugs: https://github.com/getgrav/grav-plugin-admin/issues +readme: https://github.com/getgrav/grav-plugin-admin/blob/develop/README.md +license: MIT + +dependencies: + - form + - email + - login + +form: + validation: loose + fields: + Basics: + type: section + title: Basics + underline: false + + enabled: + type: hidden + label: Plugin status + highlight: 1 + default: 0 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + route: + type: text + label: Administrator path + size: medium + placeholder: "Default route for administrator (relative to base)" + help: If you want to change the URL for the administrator, you can provide a path here + + theme: + type: hidden + label: Theme + default: grav + + edit_mode: + type: select + label: Edit mode + size: small + default: normal + options: + normal: Normal + expert: Expert + help: Auto will use blueprint if available, if none found, it will use "Expert" mode. + + google_fonts: + type: toggle + label: Use Google Fonts + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + help: Use Google custom fonts. Disable this to use Helvetica. Useful when using Cyrillic and other languages with unsupported characters. + + show_beta_msg: + type: toggle + label: Show Beta Message + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + help: Show the beta warning message on the dashboard + + enable_auto_updates_check: + type: toggle + label: Automatically check for updates + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + help: Shows an informative message, in the admin panel, when an update is available. + + session.timeout: + type: text + size: small + label: Session Timeout + help: "Sets the session timeout in seconds" + validate: + type: number + min: 1 + + warnings.delete_page: + type: toggle + label: Warn on page delete + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + help: Ask the user confirmation when deleting a page + + Popularity: + type: section + title: Popularity + underline: true + + popularity.enabled: + type: toggle + label: Visitor tracking + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + help: Enable the visitors stats collecting feature + + dashboard.days_of_stats: + type: text + label: Days of stats + size: x-small + default: 7 + help: Keep stats for the specified number of days, then drop them + validate: + type: int + + popularity.ignore: + type: array + label: Ignore + size: large + help: "URLs to ignore" + default: ['/test*','/modular'] + value_only: true + placeholder_value: /ignore-this-route + + popularity.history.daily: + type: hidden + label: Daily history + default: 30 + + popularity.history.monthly: + type: hidden + label: Monthly history + default: 12 + + popularity.history.visitors: + type: hidden + label: Visitors history + default: 20 diff --git a/user/plugins/admin/classes/admin.php b/user/plugins/admin/classes/admin.php new file mode 100644 index 0000000..3c97f5b --- /dev/null +++ b/user/plugins/admin/classes/admin.php @@ -0,0 +1,867 @@ +grav = $grav; + $this->base = $base; + $this->location = $location; + $this->route = $route; + $this->uri = $this->grav['uri']; + $this->session = $this->grav['session']; + $this->user = $this->grav['user']; + $language = $this->grav['language']; + + if ($language->enabled()) { + $this->multilang = true; + $this->languages_enabled = $this->grav['config']->get('system.languages.supported', []); + + //Set the currently active language for the admin + $language = $this->grav['uri']->param('lang'); + if (!$language) { + if (!$this->session->admin_lang) $this->session->admin_lang = 'en'; + $language = $this->session->admin_lang; + } + $this->grav['language']->setActive($language ?: 'en'); + } else { + $this->grav['language']->setActive('en'); + $this->multilang = false; + } + + } + + /** + * Get current session. + * + * @return Session + */ + public function session() + { + return $this->session; + } + + /** + * Add message into the session queue. + * + * @param string $msg + * @param string $type + */ + public function setMessage($msg, $type = 'info') + { + /** @var Message $messages */ + $messages = $this->grav['messages']; + $messages->add($msg, $type); + } + + /** + * Fetch and delete messages from the session queue. + * + * @param string $type + * + * @return array + */ + public function messages($type = null) + { + /** @var Message $messages */ + $messages = $this->grav['messages']; + + return $messages->fetch($type); + } + + /** + * Authenticate user. + * + * @param array $form Form fields. + * + * @return bool + */ + public function authenticate($form) + { + if (!$this->user->authenticated && isset($form['username']) && isset($form['password'])) { + $user = User::load($form['username']); + + //default to english if language not set + if (empty($user->language)) { + $user->set('language', 'en'); + } + + if ($user->exists()) { + $user->authenticated = true; + + // Authenticate user. + $result = $user->authenticate($form['password']); + + if ($result) { + $this->user = $this->session->user = $user; + + /** @var Grav $grav */ + $grav = $this->grav; + + $this->setMessage($this->translate('PLUGIN_ADMIN.LOGIN_LOGGED_IN', [$this->user->language]), 'info'); + + $redirect_route = $this->uri->route(); + $grav->redirect($redirect_route); + } + } + } + + return $this->authorize(); + } + + /** + * Checks user authorisation to the action. + * + * @param string $action + * + * @return bool + */ + public function authorize($action = 'admin.login') + { + $action = (array)$action; + + foreach ($action as $a) { + if ($this->user->authorize($a)) { + return true; + } + } + + return false; + } + + /** + * Returns edited page. + * + * @param bool $route + * + * @return Page + */ + public function page($route = false) + { + $path = $this->route; + + if ($route && !$path) { + $path = '/'; + } + + if (!isset($this->pages[$path])) { + $this->pages[$path] = $this->getPage($path); + } + + return $this->pages[$path]; + } + + /** + * Returns blueprints for the given type. + * + * @param string $type + * + * @return Data\Blueprint + */ + public function blueprints($type) + { + if ($this->blueprints === null) { + $this->blueprints = new Data\Blueprints('blueprints://'); + } + + return $this->blueprints->get($type); + } + + /** + * Gets configuration data. + * + * @param string $type + * @param array $post + * + * @return Data\Data|null + * @throws \RuntimeException + */ + public function data($type, $post = array()) + { + static $data = []; + + if (isset($data[$type])) { + return $data[$type]; + } + + if (!$post) { + $post = isset($_POST) ? $_POST : []; + } + + switch ($type) { + case 'configuration': + case 'system': + $type = 'system'; + $blueprints = $this->blueprints("config/{$type}"); + $config = $this->grav['config']; + $obj = new Data\Data($config->get('system'), $blueprints); + $obj->merge($post); + $file = CompiledYamlFile::instance($this->grav['locator']->findResource("config://{$type}.yaml")); + $obj->file($file); + $data[$type] = $obj; + break; + + case 'settings': + case 'site': + $type = 'site'; + $blueprints = $this->blueprints("config/{$type}"); + $config = $this->grav['config']; + $obj = new Data\Data($config->get('site'), $blueprints); + $obj->merge($post); + $file = CompiledYamlFile::instance($this->grav['locator']->findResource("config://{$type}.yaml")); + $obj->file($file); + $data[$type] = $obj; + break; + + case 'login': + $data[$type] = null; + break; + + default: + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + $filename = $locator->findResource("config://{$type}.yaml", true, true); + $file = CompiledYamlFile::instance($filename); + + if (preg_match('|plugins/|', $type)) { + /** @var Plugins $plugins */ + $plugins = $this->grav['plugins']; + $obj = $plugins->get(preg_replace('|plugins/|', '', $type)); + $obj->merge($post); + $obj->file($file); + + $data[$type] = $obj; + } elseif (preg_match('|themes/|', $type)) { + /** @var Themes $themes */ + $themes = $this->grav['themes']; + $obj = $themes->get(preg_replace('|themes/|', '', $type)); + $obj->merge($post); + $obj->file($file); + + $data[$type] = $obj; + } elseif (preg_match('|users/|', $type)) { + $obj = User::load(preg_replace('|users/|', '', $type)); + $obj->merge($post); + + $data[$type] = $obj; + } else { + throw new \RuntimeException("Data type '{$type}' doesn't exist!"); + } + } + + return $data[$type]; + } + + /** + * Get the GPM instance + * + * @return GPM The GPM instance + */ + public function gpm() + { + if (!$this->gpm) { + try { + $this->gpm = new GPM(); + } catch (\Exception $e) {} + } + + return $this->gpm; + } + + /** + * Converts dot notation to array notation. + * + * @param string $name + * + * @return string + */ + public function field($name) + { + $path = explode('.', $name); + + return array_shift($path) . ($path ? '[' . implode('][', $path) . ']' : ''); + } + + /** + * Get all routes. + * + * @return array + */ + public function routes($unique = false) + { + /** @var Pages $pages */ + $pages = $this->grav['pages']; + + if ($unique) { + $routes = array_unique($pages->routes()); + } else { + $routes = $pages->routes(); + } + return $routes; + } + + /** + * Count the pages + * + * @return array + */ + public function countPages() + { + $routable = $this->grav['pages']->all()->routable(); + $modular = $this->grav['pages']->all()->modular(); + + return count($routable) + count($modular); + } + + /** + * Get All template types + * + * @return array + */ + public function types() + { + return Pages::types(); + } + + /** + * Get All modular template types + * + * @return array + */ + public function modularTypes() + { + return Pages::modularTypes(); + } + + /** + * Get all plugins. + * + * @return array + */ + public function plugins($local = true) + { + $gpm = $this->gpm(); + + if (!$gpm) { + return; + } + + return $local ? $gpm->getInstalledPlugins() : $gpm->getRepositoryPlugins()->filter(function ( + $package, + $slug + ) use ($gpm) { + return !$gpm->isPluginInstalled($slug); + }); + } + + /** + * Get all themes. + * + * @return array + */ + public function themes($local = true) + { + $gpm = $this->gpm(); + + if (!$gpm) { + return; + } + + return $local ? $gpm->getInstalledThemes() : $gpm->getRepositoryThemes()->filter(function ($package, $slug) use + ( + $gpm + ) { + return !$gpm->isThemeInstalled($slug); + }); + } + + /** + * Get log file for fatal errors. + * + * @return string + */ + public function logs() + { + if (!isset($this->logs)) { + $file = LogFile::instance($this->grav['locator']->findResource('log://exception.log')); + + $content = $file->content(); + + $this->logs = array_reverse($content); + } + + return $this->logs; + } + + /** + * Used by the Dashboard in the admin to display the X latest pages + * that have been modified + * + * @param integer $count number of pages to pull back + * + * @return array + */ + public function latestPages($count = 10) + { + /** @var Pages $pages */ + $pages = $this->grav['pages']; + + $latest = array(); + + foreach ($pages->routes() as $url => $path) { + $page = $pages->dispatch($url, true); + if ($page && $page->routable()) { + $latest[$page->route()] = ['modified' => $page->modified(), 'page' => $page]; + } + } + + // sort based on modified + uasort($latest, function ($a, $b) { + if ($a['modified'] == $b['modified']) { + return 0; + } + + return ($a['modified'] > $b['modified']) ? -1 : 1; + }); + + // build new array with just pages in it + $list = array(); + foreach ($latest as $item) { + $list[] = $item['page']; + } + + return array_slice($list, 0, $count); + } + + /** + * Get log file for fatal errors. + * + * @return string + */ + public function logEntry() + { + $file = File::instance($this->grav['locator']->findResource("log://{$this->route}.html")); + $content = $file->content(); + + return $content; + } + + /** + * Search in the logs when was the latest backup made + * + * @return array Array containing the latest backup information + */ + public function lastBackup() + { + $file = JsonFile::instance($this->grav['locator']->findResource("log://backup.log")); + $content = $file->content(); + if (empty($content)) { + return [ + 'days' => '∞', + 'chart_fill' => 100, + 'chart_empty' => 0 + ]; + } + + $backup = new \DateTime(); + $backup->setTimestamp($content['time']); + $diff = $backup->diff(new \DateTime()); + + $days = $diff->days; + $chart_fill = $days > 30 ? 100 : round($days / 30 * 100); + + return [ + 'days' => $days, + 'chart_fill' => $chart_fill, + 'chart_empty' => 100 - $chart_fill + ]; + } + + /** + * Returns the page creating it if it does not exist. + * + * @param $path + * + * @return Page + */ + public function getPage($path) + { + /** @var Pages $pages */ + $pages = $this->grav['pages']; + + if ($path && $path[0] != '/') { + $path = "/{$path}"; + } + + $page = $path ? $pages->dispatch($path, true) : $pages->root(); + + if (!$page) { + $slug = basename($path); + + if ($slug == '') { + return null; + } + + $ppath = str_replace('\\', '/' , dirname($path)); + + // Find or create parent(s). + $parent = $this->getPage($ppath != '/' ? $ppath : ''); + + // Create page. + $page = new Page; + $page->parent($parent); + $page->filePath($parent->path() . '/' . $slug . '/' . $page->name()); + + // Add routing information. + $pages->addPage($page, $path); + + // Set if Modular + $page->modularTwig($slug[0] == '_'); + + // Determine page type. + if (isset($this->session->{$page->route()})) { + // Found the type and header from the session. + $data = $this->session->{$page->route()}; + + $header = ['title' => $data['title']]; + + if (isset($data['visible'])) { + if ($data['visible'] == '' || $data['visible']) { + // if auto (ie '') + $children = $page->parent()->children(); + foreach ($children as $child) { + if ($child->order()) { + // set page order + $page->order(1000); + break; + } + } + } + + } + + if ($data['name'] == 'modular') { + $header['body_classes'] = 'modular'; + } + + $name = $page->modular() ? str_replace('modular/', '', $data['name']) : $data['name']; + $page->name($name . '.md'); + $page->header($header); + $page->frontmatter(Yaml::dump((array)$page->header(), 10, 2, false)); + } else { + // Find out the type by looking at the parent. + $type = $parent->childType() ? $parent->childType() : $parent->blueprints()->get('child_type', + 'default'); + $page->name($type . CONTENT_EXT); + $page->header(); + } + $page->modularTwig($slug[0] == '_'); + } + + return $page; + } + + /** + * Return the languages available in the admin + * + * @return array + */ + public static function adminLanguages() + { + $languages = []; + $lang_data = Yaml::parse(file_get_contents(__DIR__ . '/../languages.yaml')); + foreach ($lang_data as $lang => $values) { + $languages[$lang] = LanguageCodes::getNativeName($lang); + } + return $languages; + } + + /** + * Return the languages available in the site + * + * @return array + */ + public static function siteLanguages() + { + $languages = []; + $lang_data = Grav::instance()['config']->get('system.languages.supported', []); + + foreach ($lang_data as $index => $lang) { + $languages[$lang] = LanguageCodes::getNativeName($lang); + } + return $languages; + } + + /** + * Static helper method to return current route. + * + * @return string + */ + public static function route() + { + $pages = Grav::instance()['pages']; + $route = '/' . ltrim(Grav::instance()['admin']->route, '/'); + + $page = $pages->dispatch($route); + $parent_route = null; + if ($page) { + $parent = $page->parent(); + $parent_route = $parent->rawRoute(); + } + + return $parent_route; + } + + /** + * Static helper method to return the last used page name + * + * @return string + */ + public static function getLastPageName() + { + return Grav::instance()['session']->lastPageName ?: 'default'; + } + + /** + * Static helper method to return the last used page route + * + * @return string + */ + public static function getLastPageRoute() + { + return Grav::instance()['session']->lastPageRoute ?: self::route(); + } + + /** + * Determine if the plugin or theme info passed is from Team Grav + * + * @param object $info Plugin or Theme info object + * + * @return bool + */ + public function isTeamGrav($info) + { + if (isset($info['author']['name']) && $info['author']['name'] == 'Team Grav') { + return true; + } else { + return false; + } + } + + /** + * Renders phpinfo + * + * @return string The phpinfo() output + */ + function phpinfo() { + + if (function_exists('phpinfo')) { + ob_start(); + phpinfo(); + $pinfo = ob_get_contents(); + ob_end_clean(); + + $pinfo = preg_replace('%^.*(.*).*$%ms', '$1', $pinfo); + return $pinfo; + } else { + return 'phpinfo() method is not available on this server.'; + } + } + + /** + * Translate a string to the user-defined language + * + * @param $string the string to translate + */ + public function translate($string) { + return $this->_translate($string, [$this->grav['user']->authenticated ? $this->grav['user']->language : 'en']); + } + + public function _translate($args, Array $languages = null, $array_support = false, $html_out = false) + { + if (is_array($args)) { + $lookup = array_shift($args); + } else { + $lookup = $args; + $args = []; + } + + if ($lookup) { + if (empty($languages) || reset($languages) == null) { + if ($this->grav['config']->get('system.languages.translations_fallback', true)) { + $languages = $this->grav['language']->getFallbackLanguages(); + } else { + $languages = (array)$this->grav['language']->getDefault(); + } + } + } else { + $languages = ['en']; + } + + + foreach ((array)$languages as $lang) { + $translation = $this->grav['language']->getTranslation($lang, $lookup, $array_support); + + if (!$translation) { + $language = $this->grav['language']->getDefault() ?: 'en'; + $translation = $this->grav['language']->getTranslation($language, $lookup, $array_support); + } + + if ($translation) { + if (count($args) >= 1) { + return vsprintf($translation, $args); + } else { + return $translation; + } + } + } + + return $lookup; + } + + function dateformat2Kendo($php_format) + { + $SYMBOLS_MATCHING = array( + // Day + 'd' => 'dd', + 'D' => 'ddd', + 'j' => 'd', + 'l' => 'dddd', + 'N' => '', + 'S' => '', + 'w' => '', + 'z' => '', + // Week + 'W' => '', + // Month + 'F' => 'MMMM', + 'm' => 'MM', + 'M' => 'MMM', + 'n' => 'M', + 't' => '', + // Year + 'L' => '', + 'o' => '', + 'Y' => 'yyyy', + 'y' => 'yy', + // Time + 'a' => 'tt', + 'A' => 'tt', + 'B' => '', + 'g' => 'h', + 'G' => 'H', + 'h' => 'hh', + 'H' => 'HH', + 'i' => 'mm', + 's' => 'ss', + 'u' => '' + ); + $js_format = ""; + $escaping = false; + for($i = 0; $i < strlen($php_format); $i++) + { + $char = $php_format[$i]; + if($char === '\\') // PHP date format escaping character + { + $i++; + if($escaping) $js_format .= $php_format[$i]; + else $js_format .= '\'' . $php_format[$i]; + $escaping = true; + } + else + { + if($escaping) { $js_format .= "'"; $escaping = false; } + if(isset($SYMBOLS_MATCHING[$char])) + $js_format .= $SYMBOLS_MATCHING[$char]; + else + $js_format .= $char; + } + } + return $js_format; + } +} diff --git a/user/plugins/admin/classes/controller.php b/user/plugins/admin/classes/controller.php new file mode 100644 index 0000000..a11a1d0 --- /dev/null +++ b/user/plugins/admin/classes/controller.php @@ -0,0 +1,1453 @@ +grav = $grav; + $this->view = $view; + $this->task = $task ? $task : 'display'; + $this->post = $this->getPost($post); + $this->route = $route; + $this->admin = $this->grav['admin']; + } + + /** + * Performs a task. + * + * @return bool True if the action was performed successfully. + */ + public function execute() + { + $success = false; + $method = 'task' . ucfirst($this->task); + if (method_exists($this, $method)) { + try { + $success = call_user_func(array($this, $method)); + } catch (\RuntimeException $e) { + $success = true; + $this->admin->setMessage($e->getMessage(), 'error'); + } + + // Grab redirect parameter. + $redirect = isset($this->post['_redirect']) ? $this->post['_redirect'] : null; + unset($this->post['_redirect']); + + // Redirect if requested. + if ($redirect) { + $this->setRedirect($redirect); + } + } + return $success; + } + + /** + * Redirect to the route stored in $this->redirect + */ + public function redirect() + { + if (!$this->redirect) { + return; + } + + $base = $this->admin->base; + $this->redirect = '/' . ltrim($this->redirect, '/'); + $multilang = $this->isMultilang(); + + $redirect = ''; + if ($multilang) { + // if base path does not already contain the lang code, add it + $langPrefix = '/' . $this->grav['session']->admin_lang; + if (!Utils::startsWith($base, $langPrefix . '/')) { + $base = $langPrefix . $base; + } + + // now the first 4 chars of base contain the lang code. + // if redirect path already contains the lang code, and is != than the base lang code, then use redirect path as-is + if (Utils::pathPrefixedByLangCode($base) && + Utils::pathPrefixedByLangCode($this->redirect) && + substr($base, 0, 4) != substr($this->redirect, 0, 4)) { + $redirect = $this->redirect; + } else { + if (!Utils::startsWith($this->redirect, $base)) { + $this->redirect = $base . $this->redirect; + } + } + + } else { + if (!Utils::startsWith($this->redirect, $base)) { + $this->redirect = $base . $this->redirect; + } + } + + if (!$redirect) { + $redirect = $this->redirect; + } + + $this->grav->redirect($redirect, $this->redirectCode); + } + + /** + * Return true if multilang is active + * + * @return bool True if multilang is active + */ + protected function isMultilang() { + return count($this->grav['config']->get('system.languages.supported', [])) > 1; + } + + /** + * Handle login. + * + * @return bool True if the action was performed. + */ + protected function taskLogin() + { + if ($this->admin->authenticate($this->post)) { + // should never reach here, redirects first + } else { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.LOGIN_FAILED'), 'error'); + } + + return true; + } + + /** + * Handle logout. + * + * @return bool True if the action was performed. + */ + protected function taskLogout() + { + $this->admin->session()->invalidate()->start(); + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.LOGGED_OUT'), 'info'); + $this->setRedirect('/logout'); + + return true; + } + + /** + * Handle logout. + * + * @return bool True if the action was performed. + */ + protected function taskKeepAlive() + { + exit(); + } + + /** + * Handle the email password recovery procedure. + * + * @return bool True if the action was performed. + */ + protected function taskForgot() + { + $param_sep = $this->grav['config']->get('system.param_sep', ':'); + $data = $this->post; + + $username = isset($data['username']) ? $data['username'] : ''; + $user = !empty($username) ? User::load($username) : null; + + if (!isset($this->grav['Email'])) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_EMAIL_NOT_CONFIGURED'), 'error'); + $this->setRedirect('/'); + return true; + } + + if (!$user || !$user->exists()) { + $this->admin->setMessage($this->admin->translate(['PLUGIN_ADMIN.FORGOT_USERNAME_DOES_NOT_EXIST', $username]), 'error'); + $this->setRedirect('/forgot'); + return true; + } + + if (empty($user->email)) { + $this->admin->setMessage($this->admin->translate(['PLUGIN_ADMIN.FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL', $username]), 'error'); + $this->setRedirect('/forgot'); + return true; + } + + $token = md5(uniqid(mt_rand(), true)); + $expire = time() + 604800; // next week + + $user->reset = $token . '::' . $expire; + $user->save(); + + $author = $this->grav['config']->get('site.author.name', ''); + $fullname = $user->fullname ?: $username; + $reset_link = rtrim($this->grav['uri']->rootUrl(true), '/') . '/' . trim($this->admin->base, '/') . '/reset/task' . $param_sep . 'reset/user'. $param_sep . $username . '/token' . $param_sep . $token; + + $sitename = $this->grav['config']->get('site.title', 'Website'); + $from = $this->grav['config']->get('plugins.email.from', 'noreply@getgrav.org'); + $to = $user->email; + + $subject = $this->admin->translate(['PLUGIN_ADMIN.FORGOT_EMAIL_SUBJECT', $sitename]); + $content = $this->admin->translate(['PLUGIN_ADMIN.FORGOT_EMAIL_BODY', $fullname, $reset_link, $author, $sitename]); + + $body = $this->grav['twig']->processTemplate('email/base.html.twig', ['content' => $content]); + + $message = $this->grav['Email']->message($subject, $body, 'text/html') + ->setFrom($from) + ->setTo($to); + + $sent = $this->grav['Email']->send($message); + + if ($sent < 1) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_FAILED_TO_EMAIL'), 'error'); + } else { + $this->admin->setMessage($this->admin->translate(['PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL', $to]), 'info'); + } + + $this->setRedirect('/'); + return true; + } + + /** + * Handle the reset password action. + * + * @return bool True if the action was performed. + */ + public function taskReset() + { + $data = $this->post; + + if (isset($data['password'])) { + $username = isset($data['username']) ? $data['username'] : null; + $user = !empty($username) ? User::load($username) : null; + $password = isset($data['password']) ? $data['password'] : null; + $token = isset($data['token']) ? $data['token'] : null; + + if (!empty($user) && $user->exists() && !empty($user->reset)) { + list($good_token, $expire) = explode('::', $user->reset); + + if ($good_token === $token) { + if (time() > $expire) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_LINK_EXPIRED'), 'error'); + $this->setRedirect('/forgot'); + return true; + } + + unset($user->hashed_password); + unset($user->reset); + $user->password = $password; + + $user->validate(); + $user->filter(); + $user->save(); + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_PASSWORD_RESET'), 'info'); + $this->setRedirect('/'); + return true; + } + } + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error'); + $this->setRedirect('/forgot'); + return true; + + } else { + $user = $this->grav['uri']->param('user'); + $token = $this->grav['uri']->param('token'); + + if (empty($user) || empty($token)) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error'); + $this->setRedirect('/forgot'); + return true; + } + + $this->admin->forgot = [ 'username' => $user, 'token' => $token ]; + } + + return true; + } + + /** + * Clear the cache. + * + * @return bool True if the action was performed. + */ + protected function taskClearCache() + { + if (!$this->authorizeTask('clear cache', ['admin.cache', 'admin.super'])) { + return; + } + + // get optional cleartype param + $clear_type = $this->grav['uri']->param('cleartype'); + + if ($clear_type) { + $clear = $clear_type; + } else { + $clear = 'standard'; + } + + $results = Cache::clearCache($clear); + if (count($results) > 0) { + $this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.CACHE_CLEARED') . '
' . $this->admin->translate('PLUGIN_ADMIN.METHOD') . ': ' . $clear . '']; + } else { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.ERROR_CLEARING_CACHE')]; + } + + return true; + } + + /** + * Handle the backup action + * + * @return bool True if the action was performed. + */ + protected function taskBackup() + { + $param_sep = $this->grav['config']->get('system.param_sep', ':'); + if (!$this->authorizeTask('backup', ['admin.maintenance', 'admin.super'])) { + return; + } + + $download = $this->grav['uri']->param('download'); + + if ($download) { + Utils::download(base64_decode(urldecode($download)), true); + } + + $log = JsonFile::instance($this->grav['locator']->findResource("log://backup.log", true, true)); + + try { + $backup = ZipBackup::backup(); + } catch (\Exception $e) { + $this->admin->json_response = [ + 'status' => 'error', + 'message' => $this->admin->translate('PLUGIN_ADMIN.AN_ERROR_OCCURRED') . '. '. $e->getMessage() + ]; + + return true; + } + + $download = urlencode(base64_encode($backup)); + $url = rtrim($this->grav['uri']->rootUrl(true), '/') . '/' . trim($this->admin->base, '/') . '/task' . $param_sep . 'backup/download' . $param_sep . $download; + + $log->content([ + 'time' => time(), + 'location' => $backup + ]); + $log->save(); + + $this->admin->json_response = [ + 'status' => 'success', + 'message' => $this->admin->translate('PLUGIN_ADMIN.YOUR_BACKUP_IS_READY_FOR_DOWNLOAD') . '. ' . $this->admin->translate('PLUGIN_ADMIN.DOWNLOAD_BACKUP') .'', + 'toastr' => [ + 'timeOut' => 0, + 'closeButton' => true + ] + ]; + + return true; + } + + /** + * Handles filtering the page by modular/visible/routable in the pages list. + */ + protected function taskFilterPages() + { + if (!$this->authorizeTask('filter pages', ['admin.pages', 'admin.super'])) { + return; + } + + $data = $this->post; + + $flags = !empty($data['flags']) ? array_map('strtolower', explode(',', $data['flags'])) : []; + $queries = !empty($data['query']) ? explode(',', $data['query']) : []; + + /** @var Collection $collection */ + $collection = $this->grav['pages']->all(); + + if (count($flags)) { + // Filter by state + $pageStates = array('modular', 'nonmodular', 'visible', 'nonvisible', 'routable', 'nonroutable', 'published', 'nonpublished'); + + if (count(array_intersect($pageStates, $flags)) > 0) { + if (in_array('modular', $flags)) + $collection = $collection->modular(); + + if (in_array('nonmodular', $flags)) + $collection = $collection->nonModular(); + + if (in_array('visible', $flags)) + $collection = $collection->visible(); + + if (in_array('nonvisible', $flags)) + $collection = $collection->nonVisible(); + + if (in_array('routable', $flags)) + $collection = $collection->routable(); + + if (in_array('nonroutable', $flags)) + $collection = $collection->nonRoutable(); + + if (in_array('published', $flags)) + $collection = $collection->published(); + + if (in_array('nonpublished', $flags)) + $collection = $collection->nonPublished(); + } + foreach ($pageStates as $pageState) { + if (($pageState = array_search($pageState, $flags)) !== false) { + unset($flags[$pageState]); + } + } + + // Filter by page type + if (count($flags)) { + $types = $flags; + $collection = $collection->ofOneOfTheseTypes($types); + } + } + + if (!empty($queries)) { + foreach ($collection as $page) { + foreach ($queries as $query) { + $query = trim($query); + + // $page->content(); + if (stripos($page->getRawContent(), $query) === false && stripos($page->title(), $query) === false) { + $collection->remove($page); + } + } + } + } + + $results = []; + foreach ($collection as $path => $page) { + $results[] = $page->route(); + } + + $this->admin->json_response = [ + 'status' => 'success', + 'message' => $this->admin->translate('PLUGIN_ADMIN.PAGES_FILTERED'), + 'results' => $results + ]; + $this->admin->collection = $collection; + } + + /** + * Determines the file types allowed to be uploaded + * + * @return bool True if the action was performed. + */ + protected function taskListmedia() + { + if (!$this->authorizeTask('list media', ['admin.pages', 'admin.super'])) { + return; + } + + $page = $this->admin->page(true); + + if (!$page) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')]; + return false; + } + + $media_list = array(); + foreach ($page->media()->all() as $name => $media) { + $media_list[$name] = ['url' => $media->cropZoom(150, 100)->url(), 'size' => $media->get('size')]; + } + $this->admin->json_response = ['status' => 'ok', 'results' => $media_list]; + + return true; + } + + /** + * Handles adding a media file to a page + */ + protected function taskAddmedia() + { + if (!$this->authorizeTask('add media', ['admin.pages', 'admin.super'])) { + return; + } + + $page = $this->admin->page(true); + + /** @var Config $config */ + $config = $this->grav['config']; + + if (!isset($_FILES['file']['error']) || is_array($_FILES['file']['error'])) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.INVALID_PARAMETERS')]; + return; + } + + // Check $_FILES['file']['error'] value. + switch ($_FILES['file']['error']) { + case UPLOAD_ERR_OK: + break; + case UPLOAD_ERR_NO_FILE: + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_FILES_SENT')]; + return; + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_FILESIZE_LIMIT')]; + return; + default: + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.UNKNOWN_ERRORS')]; + return; + } + + $grav_limit = $config->get('system.media.upload_limit', 0); + // You should also check filesize here. + if ($grav_limit > 0 && $_FILES['file']['size'] > $grav_limit) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT')]; + return; + } + + + // Check extension + $fileParts = pathinfo($_FILES['file']['name']); + $fileExt = strtolower($fileParts['extension']); + + // If not a supported type, return + if (!$config->get("media.{$fileExt}")) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.UNSUPPORTED_FILE_TYPE') . ': '.$fileExt]; + return; + } + + + // Upload it + if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('%s/%s', $page->path(), $_FILES['file']['name']))) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.FAILED_TO_MOVE_UPLOADED_FILE')]; + return; + } + + $this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_UPLOADED_SUCCESSFULLY')]; + + return; + } + + /** + * Handles deleting a media file from a page + * + * @return bool True if the action was performed. + */ + protected function taskDelmedia() + { + if (!$this->authorizeTask('delete media', ['admin.pages', 'admin.super'])) { + return; + } + + $page = $this->admin->page(true); + + if (!$page) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')]; + return false; + } + + $filename = !empty($this->post['filename']) ? $this->post['filename'] : null; + if ($filename) { + $targetPath = $page->path().'/'.$filename; + + if (file_exists($targetPath)) { + if (unlink($targetPath)) { + $this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_DELETED') . ': '.$filename]; + } else { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_COULD_NOT_BE_DELETED') . ': '.$filename]; + } + } else { + //Try with responsive images @1x, @2x, @3x + $ext = pathinfo($targetPath, PATHINFO_EXTENSION); + $filename = $page->path() . '/'. basename($targetPath, ".$ext"); + $responsiveTargetPath = $filename . '@1x.' . $ext; + $deletedResponsiveImage = false; + if (file_exists($responsiveTargetPath) && unlink($responsiveTargetPath)) { + $deletedResponsiveImage = true; + } + + $responsiveTargetPath = $filename . '@2x.' . $ext; + if (file_exists($responsiveTargetPath) && unlink($responsiveTargetPath)) { + $deletedResponsiveImage = true; + } + $responsiveTargetPath = $filename . '@3x.' . $ext; + if (file_exists($responsiveTargetPath) && unlink($responsiveTargetPath)) { + $deletedResponsiveImage = true; + } + + if ($deletedResponsiveImage) { + $this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_DELETED') . ': '.$filename]; + } else { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_NOT_FOUND') . ': '.$filename]; + } + + } + } else { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_FILE_FOUND')]; + } + + return true; + } + + /** + * Process the page Markdown + */ + protected function taskProcessMarkdown() + { +// if (!$this->authorizeTask('process markdown', ['admin.pages', 'admin.super'])) { +// return; +// } + + try { + $page = $this->admin->page(true); + + if (!$page) { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')]; + return false; + } + + $this->preparePage($page, true); + $page->header(); + + // Add theme template paths to Twig loader + $template_paths = $this->grav['locator']->findResources('theme://templates'); + $loader_chain = $this->grav['twig']->twig->getLoader()->addLoader(new \Twig_Loader_Filesystem($template_paths)); + + $html = $page->content(); + + $this->admin->json_response = ['status' => 'success', 'message' => $html]; + return true; + } catch (\Exception $e) { + $this->admin->json_response = ['status' => 'error', 'message' => $e->getMessage()]; + return false; + } + } + + /** + * Enable a plugin. + * + * @return bool True if the action was performed. + */ + public function taskEnable() + { + if (!$this->authorizeTask('enable plugin', ['admin.plugins', 'admin.super'])) { + return; + } + + if ($this->view != 'plugins') { + return false; + } + + // Filter value and save it. + $this->post = array('enabled' => 1, '_redirect' => 'plugins'); + $obj = $this->prepareData(); + $obj->save(); + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_ENABLED_PLUGIN'), 'info'); + + return true; + } + + /** + * Disable a plugin. + * + * @return bool True if the action was performed. + */ + public function taskDisable() + { + if (!$this->authorizeTask('disable plugin', ['admin.plugins', 'admin.super'])) { + return; + } + + if ($this->view != 'plugins') { + return false; + } + + // Filter value and save it. + $this->post = array('enabled' => 0, '_redirect' => 'plugins'); + $obj = $this->prepareData(); + $obj->save(); + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_DISABLED_PLUGIN'), 'info'); + + return true; + } + + /** + * Set the default theme. + * + * @return bool True if the action was performed. + */ + public function taskActivate() + { + if (!$this->authorizeTask('activate theme', ['admin.themes', 'admin.super'])) { + return; + } + + if ($this->view != 'themes') { + return false; + } + + $this->post = array('_redirect' => 'themes'); + + // Make sure theme exists (throws exception) + $name = $this->route; + $this->grav['themes']->get($name); + + // Store system configuration. + $system = $this->admin->data('system'); + $system->set('pages.theme', $name); + $system->save(); + + // Force configuration reload and save. + /** @var Config $config */ + $config = $this->grav['config']; + $config->reload()->save(); + + $config->set('system.pages.theme', $name); + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_CHANGED_THEME'), 'info'); + + return true; + } + + /** + * Handles installing plugins and themes + * + * @return bool True is the action was performed + */ + public function taskInstall() + { + $type = $this->view === 'plugins' ? 'plugins' : 'themes'; + if (!$this->authorizeTask('install ' . $type, ['admin.' . $type, 'admin.super'])) { + return; + } + + require_once __DIR__ . '/gpm.php'; + + $package = $this->route; + + $result = \Grav\Plugin\Admin\Gpm::install($package, ['theme' => ($type == 'themes')]); + + if ($result) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info'); + } else { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED'), 'error'); + } + + $this->post = array('_redirect' => $this->view . '/' . $this->route); + + return true; + } + + /** + * Handles updating Grav + * + * @return bool True is the action was performed + */ + public function taskUpdategrav() + { + require_once __DIR__ . '/gpm.php'; + + if (!$this->authorizeTask('install grav', ['admin.super'])) { + return; + } + + $result = \Grav\Plugin\Admin\Gpm::selfupgrade(); + + if ($result) { + $this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.GRAV_WAS_SUCCESSFULLY_UPDATED_TO') . ' ']; + } else { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.GRAV_UPDATE_FAILED') . '
' . Installer::lastErrorMsg()]; + } + + return true; + } + + /** + * Handles updating plugins and themes + * + * @return bool True is the action was performed + */ + public function taskUpdate() + { + require_once __DIR__ . '/gpm.php'; + + $package = $this->route; + $permissions = []; + + $type = $this->view === 'plugins' ? 'plugins' : 'themes'; + + // Update multi mode + if (!$package) { + $package = []; + + if ($this->view === 'plugins' || $this->view === 'update') { + $package = $this->admin->gpm()->getUpdatablePlugins(); + $permissions['plugins'] = ['admin.super', 'admin.plugins']; + } + + if ($this->view === 'themes' || $this->view === 'update') { + $package = array_merge($package, $this->admin->gpm()->getUpdatableThemes()); + $permissions['themes'] = ['admin.super', 'admin.themes']; + } + } + + foreach ($permissions as $type => $p) { + if (!$this->authorizeTask('update ' . $type , $p)) { + return; + } + } + + $result = \Grav\Plugin\Admin\Gpm::update($package, ['theme' => ($type == 'themes')]); + + if ($this->view === 'update') { + + if ($result) { + $this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.EVERYTHING_UPDATED')]; + } else { + $this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.UPDATES_FAILED')]; + } + + } else { + if ($result) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info'); + } else { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED'), 'error'); + } + + $this->post = array('_redirect' => $this->view . '/' . $this->route); + } + + return true; + } + + /** + * Handles uninstalling plugins and themes + * + * @return bool True is the action was performed + */ + public function taskUninstall() + { + $type = $this->view === 'plugins' ? 'plugins' : 'themes'; + if (!$this->authorizeTask('uninstall ' . $type, ['admin.' . $type, 'admin.super'])) { + return; + } + + require_once __DIR__ . '/gpm.php'; + + $package = $this->route; + + $result = \Grav\Plugin\Admin\Gpm::uninstall($package, []); + + if ($result) { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.UNINSTALL_SUCCESSFUL'), 'info'); + } else { + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.UNINSTALL_FAILED'), 'error'); + } + + $this->post = array('_redirect' => $this->view); + + return true; + } + + /** + * Handles form and saves the input data if its valid. + * + * @return bool True if the action was performed. + */ + public function taskSave() + { + if (!$this->authorizeTask('save', $this->dataPermissions())) { + return; + } + + $reorder = false; + $data = $this->post; + + // Special handler for pages data. + if ($this->view == 'pages') { + /** @var Page\Pages $pages */ + $pages = $this->grav['pages']; + + // Find new parent page in order to build the path. + $route = !isset($data['route']) ? dirname($this->admin->route) : $data['route']; + $parent = $route && $route != '/' ? $pages->dispatch($route, true) : $pages->root(); + + $obj = $this->admin->page(true); + + $original_slug = $obj->slug(); + $original_order = intval(trim($obj->order(), '.')); + + // Change parent if needed and initialize move (might be needed also on ordering/folder change). + $obj = $obj->move($parent); + $this->preparePage($obj, false, $obj->language()); + + // Reset slug and route. For now we do not support slug twig variable on save. + $obj->slug($original_slug); + + $obj->validate(); + $obj->filter(); + + // rename folder based on visible + if ($original_order == 1000) { + // increment order to force reshuffle + $obj->order($original_order + 1); + } + + // add or remove numeric prefix based on ordering value + if (isset($data['ordering'])) { + if ($data['ordering'] && !$obj->order()) { + $obj->order(1001); + } elseif (!$data['ordering'] && $obj->order()) { + $obj->folder($obj->slug()); + } + } + + + } else { + // Handle standard data types. + $obj = $this->prepareData(); + $obj->validate(); + $obj->filter(); + } + + if ($obj) { + $obj->save(true); + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SAVED'), 'info'); + } + + if ($this->view != 'pages') { + // Force configuration reload. + /** @var Config $config */ + $config = $this->grav['config']; + $config->reload(); + + if ($this->view === 'users') { + $this->grav['user']->merge(User::load($this->admin->route)->toArray()); + } + } + + // Always redirect if a page route was changed, to refresh it + if ($obj instanceof Page\Page) { + if (method_exists($obj, 'unsetRouteSlug')) { + $obj->unsetRouteSlug(); + } + + $multilang = $this->isMultilang(); + + if ($multilang) { + if (!$obj->language()) { + $obj->language($this->grav['session']->admin_lang); + } + } + $admin_route = $this->grav['config']->get('plugins.admin.route'); + $redirect_url = '/' . ($multilang ? ($obj->language()) : '') . $admin_route . '/' . $this->view . $obj->route(); + + $this->setRedirect($redirect_url); + } + + return true; + } + + /** + * Continue to the new page. + * + * @return bool True if the action was performed. + */ + public function taskContinue() + { + if ($this->view == 'users') { + $this->setRedirect("{$this->view}/{$this->post['username']}"); + return true; + } + + if ($this->view != 'pages') { + return false; + } + + $data = $this->post; + $route = $data['route'] != '/' ? $data['route'] : ''; + $folder = ltrim($data['folder'], '_'); + if (!empty($data['modular'])) { + $folder = '_' . $folder; + } + $path = $route . '/' . $folder; + + $this->admin->session()->{$path} = $data; + + // Store the name and route of a page, to be used prefilled defaults of the form in the future + $this->admin->session()->lastPageName = $data['name']; + $this->admin->session()->lastPageRoute = $data['route']; + + $this->setRedirect("{$this->view}/". ltrim($path, '/')); + + return true; + } + + /** + * Save page as a new copy. + * + * @return bool True if the action was performed. + * @throws \RuntimeException + */ + protected function taskCopy() + { + if (!$this->authorizeTask('copy page', ['admin.pages', 'admin.super'])) { + return; + } + + // Only applies to pages. + if ($this->view != 'pages') { + return false; + } + + try { + /** @var Page\Pages $pages */ + $pages = $this->grav['pages']; + $data = $this->post; + + // And then get the current page. + $page = $this->admin->page(true); + + // Find new parent page in order to build the path. + $parent = $page->parent() ?: $pages->root(); + + // Make a copy of the current page and fill the updated information into it. + $page = $page->copy($parent); + $this->preparePage($page); + + // Make sure the header is loaded in case content was set through raw() (expert mode) + $page->header(); + + // Deal with folder naming conflicts, but limit number of searches to 99. + $break = 99; + while ($break > 0 && file_exists($page->filePath())) { + $break--; + $match = preg_split('/-(\d+)$/', $page->path(), 2, PREG_SPLIT_DELIM_CAPTURE); + $page->path($match[0] . '-' . (isset($match[1]) ? (int) $match[1] + 1 : 2)); + // Reset slug and route. For now we do not support slug twig variable on save. + $page->slug(''); + } + + $page->save(); + + // Enqueue message and redirect to new location. + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_COPIED'), 'info'); + $parent_route = $parent->route() ? '/' . ltrim($parent->route(), '/') : ''; + $this->setRedirect($this->view . $parent_route . '/'. $page->slug()); + + } catch (\Exception $e) { + throw new \RuntimeException('Copying page failed on error: ' . $e->getMessage()); + } + + return true; + } + + /** + * Reorder pages. + * + * @return bool True if the action was performed. + */ + protected function taskReorder() + { + if (!$this->authorizeTask('reorder pages', ['admin.pages', 'admin.super'])) { + return; + } + + // Only applies to pages. + if ($this->view != 'pages') { + return false; + } + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.REORDERING_WAS_SUCCESSFUL'), 'info'); + return true; + } + + /** + * Delete page. + * + * @return bool True if the action was performed. + * @throws \RuntimeException + */ + protected function taskDelete() + { + if (!$this->authorizeTask('delete page', ['admin.pages', 'admin.super'])) { + return; + } + + // Only applies to pages. + if ($this->view != 'pages') { + return false; + } + + /** @var Uri $uri */ + $uri = $this->grav['uri']; + + try { + $page = $this->admin->page(); + + if (count($page->translatedLanguages()) > 1) { + $page->file()->delete(); + } else { + Folder::delete($page->path()); + } + + + $results = Cache::clearCache('standard'); + + // Set redirect to either referrer or pages list. + $redirect = 'pages'; + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_DELETED'), 'info'); + $this->setRedirect($redirect); + + } catch (\Exception $e) { + throw new \RuntimeException('Deleting page failed on error: ' . $e->getMessage()); + } + + return true; + } + + /** + * Switch the content language. Optionally redirect to a different page. + * + * @return bool True if the action was performed. + */ + protected function taskSwitchlanguage() { + $data = $this->post; + + if (isset($data['lang'])) { + $language = $data['lang']; + } else { + $language = $this->grav['uri']->param('lang'); + } + + if (isset($data['redirect'])) { + $redirect = 'pages/' . $data['redirect']; + } else { + $redirect = 'pages'; + } + + + if ($language) { + $this->grav['session']->admin_lang = $language ?: 'en'; + } + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info'); + + $admin_route = $this->grav['config']->get('plugins.admin.route'); + $this->setRedirect('/' . $language . $admin_route . '/' . $redirect); + + } + + /** + * Save the current page in a different language. Automatically switches to that language. + * + * @return bool True if the action was performed. + */ + protected function taskSaveas() { + if (!$this->authorizeTask('save', $this->dataPermissions())) { + return; + } + + // $reorder = false; + $data = $this->post; + $language = $data['lang']; + + if ($language) { + $this->grav['session']->admin_lang = $language ?: 'en'; + } + + // /** @var Page\Pages $pages */ + $pages = $this->grav['pages']; + + $uri = $this->grav['uri']; + $obj = $this->admin->page($uri->route()); + $this->preparePage($obj, false, $language); + + $file = $obj->file(); + if ($file) { + $filename = substr($obj->name(), 0, -(strlen('.' . $language . '.md'))); + + if (substr($filename, -3, 1) == '.') { + if (substr($filename, -2) == substr($language, 0, 2)) { + $filename = str_replace(substr($filename, -2), $language, $filename); + } + } elseif (substr($filename, -6, 1) == '.') { + if (substr($filename, -5) == substr($language, 0, 5)) { + $filename = str_replace(substr($filename, -5), $language, $filename); + } + } else { + $filename .= '.' . $language; + } + + $path = $obj->path() . DS . $filename . '.md'; + $aFile = File::instance($path); + $aFile->save(); + + $aPage = new Page\Page(); + $aPage->init(new \SplFileInfo($path), $language .'.md'); + $aPage->header($obj->header()); + $aPage->rawMarkdown($obj->rawMarkdown()); + $aPage->validate(); + $aPage->filter(); + $aPage->save(); + } + + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info'); + $this->setRedirect('/' . $language . $uri->route()); + + return true; + } + + /** + * Prepare and return POST data. + * + * @param array $post + * @return array + */ + protected function &getPost($post) + { + unset($post['task']); + + // Decode JSON encoded fields and merge them to data. + if (isset($post['_json'])) { + $post = array_merge_recursive($post, $this->jsonDecode($post['_json'])); + unset($post['_json']); + } + return $post; + } + + /** + * Recursively JSON decode data. + * + * @param array $data + * @return array + */ + protected function jsonDecode(array $data) + { + foreach ($data as &$value) { + if (is_array($value)) { + $value = $this->jsonDecode($value); + } else { + $value = json_decode($value, true); + } + } + return $data; + } + + /** + * Sets the page redirect. + * + * @param string $path The path to redirect to + * @param int $code The HTTP redirect code + */ + protected function setRedirect($path, $code = 303) + { + $this->redirect = $path; + $this->code = $code; + } + + /** + * Gets the configuration data for a given view & post + * + * @return object + */ + protected function prepareData() + { + $type = trim("{$this->view}/{$this->admin->route}", '/'); + $data = $this->admin->data($type, $this->post); + + return $data; + } + + /** + * Gets the permissions needed to access a given view + * + * @return array An array of permissions + */ + protected function dataPermissions() + { + $type = $this->view; + $permissions = ['admin.super']; + + switch ($type) { + case 'configuration': + case 'system': + $permissions[] = 'admin.configuration'; + break; + case 'settings': + case 'site': + $permissions[] = 'admin.settings'; + break; + case 'plugins': + $permissions[] = 'admin.plugins'; + break; + case 'themes': + $permissions[] = 'admin.themes'; + break; + case 'users': + $permissions[] = 'admin.users'; + break; + case 'pages': + $permissions[] = 'admin.pages'; + break; + } + + return $permissions; + } + + /** + * Prepare a page to be stored: update its folder, name, template, header and content + * + * @param \Grav\Common\Page\Page $page + * @param bool $clean_header + */ + protected function preparePage(\Grav\Common\Page\Page $page, $clean_header = false, $language = null) + { + $input = $this->post; + + if (isset($input['order'])) { + $order = max(0, (int) isset($input['order']) ? $input['order'] : $page->value('order')); + $ordering = $order ? sprintf('%02d.', $order) : ''; + $slug = empty($input['folder']) ? $page->value('folder') : (string) $input['folder']; + $page->folder($ordering . $slug); + } + + if (isset($input['name']) && !empty($input['name'])) { + $type = (string) strtolower($input['name']); + $name = preg_replace('|.*/|', '', $type); + if ($language) { + $name .= '.' . $language; + } else { + $language = $this->grav['language']; + if ($language->enabled()) { + $name .= '.' . $language->getLanguage(); + } + } + $name .= '.md'; + $page->name($name); + $page->template($type); + } + + // Special case for Expert mode: build the raw, unset content + if (isset($input['frontmatter']) && isset($input['content'])) { + $page->raw("---\n" . (string) $input['frontmatter'] . "\n---\n" . (string) $input['content']); + unset($input['content']); + } + + if (isset($input['header'])) { + $header = $input['header']; + + foreach($header as $key => $value) { + if ($key == 'metadata') { + foreach ($header['metadata'] as $key2 => $value2) { + if (isset($input['toggleable_header']['metadata'][$key2]) && !$input['toggleable_header']['metadata'][$key2]) { + $header['metadata'][$key2] = ''; + } + } + } elseif ($key == 'taxonomy') { + foreach ($header[$key] as $taxkey => $taxonomy) { + if (is_array($taxonomy) && count($taxonomy) == 1 && trim($taxonomy[0]) == '') { + unset($header[$key][$taxkey]); + } + } + } else { + if (isset($input['toggleable_header'][$key]) && !$input['toggleable_header'][$key]) { + $header[$key] = null; + } + } + } + if ($clean_header) { + $header = Utils::arrayFilterRecursive($header, function($k, $v) { + return !(is_null($v) || $v === ''); + }); + } + $page->header((object) $header); + $page->frontmatter(Yaml::dump((array) $page->header())); + } + // Fill content last because it also renders the output. + if (isset($input['content'])) { + $page->rawMarkdown((string) $input['content']); + } + } + + /** + * Checks if the user is allowed to perform the given task with its associated permissions + * + * @param string $task The task to execute + * @param array $permissions The permissions given + * @return bool True if authorized. False if not. + */ + protected function authorizeTask($task = '', $permissions = []) + { + if (!$this->admin->authorize($permissions)) { + if ($this->grav['uri']->extension() === 'json') + $this->admin->json_response = ['status' => 'unauthorized', 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.']; + else + $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.', 'error'); + + return false; + } + + return true; + } +} diff --git a/user/plugins/admin/classes/gpm.php b/user/plugins/admin/classes/gpm.php new file mode 100644 index 0000000..1cac1d9 --- /dev/null +++ b/user/plugins/admin/classes/gpm.php @@ -0,0 +1,199 @@ + GRAV_ROOT, + 'overwrite' => true, + 'ignore_symlinks' => true, + 'skip_invalid' => true, + 'install_deps' => true, + 'theme' => false + ]; + + public static function install($packages, $options) + { + $options = array_merge(self::$options, $options); + + if ( + !Installer::isGravInstance($options['destination']) || + !Installer::isValidDestination($options['destination'], [Installer::EXISTS, Installer::IS_LINK]) + ) { + return false; + } + + $packages = is_array($packages) ? $packages : [ $packages ]; + $count = count($packages); + + $packages = array_filter(array_map(function ($p) { + return !is_string($p) ? $p instanceof Package ? $p : false : self::GPM()->findPackage($p); + }, $packages)); + + if (!$options['skip_invalid'] && $count !== count($packages)) { + return false; + } + + foreach ($packages as $package) { + if (isset($package->dependencies) && $options['install_deps']) { + $result = static::install($package->dependencies, $options); + + if (!$result) { + return false; + } + } + + // Check destination + Installer::isValidDestination($options['destination'] . DS . $package->install_path); + + if (Installer::lastErrorCode() === Installer::EXISTS && !$options['overwrite']) { + return false; + } + + if (Installer::lastErrorCode() === Installer::IS_LINK && !$options['ignore_symlinks']) { + return false; + } + + $local = static::download($package); + + Installer::install($local, $options['destination'], ['install_path' => $package->install_path, 'theme' => $options['theme']]); + Folder::delete(dirname($local)); + + $errorCode = Installer::lastErrorCode(); + + if (Installer::lastErrorCode() & (Installer::ZIP_OPEN_ERROR | Installer::ZIP_EXTRACT_ERROR)) { + return false; + } + } + + return true; + } + + public static function update($packages, $options) + { + $options['overwrite'] = true; + return static::install($packages, $options); + } + + public static function uninstall($packages, $options) + { + $options = array_merge(self::$options, $options); + + $packages = is_array($packages) ? $packages : [ $packages ]; + $count = count($packages); + + $packages = array_filter(array_map(function ($p) { + + if (is_string($p)) { + $p = strtolower($p); + $plugin = static::GPM()->getInstalledPlugin($p); + $p = $plugin ?: static::GPM()->getInstalledTheme($p); + } + + return $p instanceof Package ? $p : false; + + }, $packages)); + + if (!$options['skip_invalid'] && $count !== count($packages)) { + return false; + } + + foreach ($packages as $package) { + + $location = self::getGrav()['locator']->findResource($package->package_type . '://' . $package->slug); + + // Check destination + Installer::isValidDestination($location); + + if (Installer::lastErrorCode() === Installer::IS_LINK && !$options['ignore_symlinks']) { + return false; + } + + Installer::uninstall($location); + + $errorCode = Installer::lastErrorCode(); + if ($errorCode && $errorCode !== Installer::IS_LINK && $errorCode !== Installer::EXISTS) { + return false; + } + } + + return true; + } + + private static function download($package) + { + $contents = Response::get($package->zipball_url, []); + + $cache_dir = self::getGrav()['locator']->findResource('cache://', true); + $cache_dir = $cache_dir . DS . 'tmp/Grav-' . uniqid(); + Folder::mkdir($cache_dir); + + $filename = $package->slug . basename($package->zipball_url); + + file_put_contents($cache_dir . DS . $filename, $contents); + + return $cache_dir . DS . $filename; + } + + private static function _downloadSelfupgrade($package, $tmp) + { + $output = Response::get($package['download'], []); + Folder::mkdir($tmp); + file_put_contents($tmp . DS . $package['name'], $output); + return $tmp . DS . $package['name']; + } + + public static function selfupgrade() { + $upgrader = new Upgrader(); + + if (!Installer::isGravInstance(GRAV_ROOT)) { + return false; + } + + if (is_link(GRAV_ROOT . DS . 'index.php')) { + Installer::setError(Installer::IS_LINK); + return false; + } + + $update = $upgrader->getAssets()['grav-update']; + $tmp = CACHE_DIR . 'tmp/Grav-' . uniqid(); + $file = self::_downloadSelfupgrade($update, $tmp); + + Installer::install($file, GRAV_ROOT, + ['sophisticated' => true, 'overwrite' => true, 'ignore_symlinks' => true]); + + $errorCode = Installer::lastErrorCode(); + + Folder::delete($tmp); + + if ($errorCode & (Installer::ZIP_OPEN_ERROR | Installer::ZIP_EXTRACT_ERROR)) { + return false; + } + + return true; + } +} diff --git a/user/plugins/admin/classes/popularity.php b/user/plugins/admin/classes/popularity.php new file mode 100644 index 0000000..aa16eda --- /dev/null +++ b/user/plugins/admin/classes/popularity.php @@ -0,0 +1,262 @@ +config = self::getGrav()['config']; + + $this->data_path = self::$grav['locator']->findResource('log://popularity', true, true); + $this->daily_file = $this->data_path.'/'.self::DAILY_FILE; + $this->monthly_file = $this->data_path.'/'.self::MONTHLY_FILE; + $this->totals_file = $this->data_path.'/'.self::TOTALS_FILE; + $this->visitors_file = $this->data_path.'/'.self::VISITORS_FILE; + + } + + public function trackHit() + { + // Don't track bot or crawler requests + if (!self::getGrav()['browser']->isHuman()) { + return; + } + + /** @var Page $page */ + $page = self::getGrav()['page']; + $relative_url = str_replace(self::getGrav()['base_url_relative'], '', $page->url()); + + // Don't track error pages or pages that have no route + if ($page->template() == 'error' || !$page->route()) { + return; + } + + // Make sure no 'widcard-style' ignore matches this url + foreach ((array) $this->config->get('plugins.admin.popularity.ignore') as $ignore) { + if (fnmatch($ignore, $relative_url)) { + return; + } + } + + // initial creation if it doesn't exist + if (!file_exists($this->data_path)) { + mkdir($this->data_path); + $this->flushPopularity(); + } + + // Update the data we want to track + $this->updateDaily(); + $this->updateMonthly(); + $this->updateTotals($page->route()); + $this->updateVisitors(self::getGrav()['uri']->ip()); + + } + + protected function updateDaily() + { + + if (!$this->daily_data) { + $this->daily_data = $this->getData($this->daily_file); + } + + $day_month_year = date(self::DAILY_FORMAT); + + // get the daily access count + if (array_key_exists($day_month_year, $this->daily_data)) { + $this->daily_data[$day_month_year] = intval($this->daily_data[$day_month_year]) + 1; + } else { + $this->daily_data[$day_month_year] = 1; + } + + // keep correct number as set by history + $count = intval($this->config->get('plugins.admin.popularity.history.daily', 30)); + $total = count($this->daily_data); + + if ($total > $count) { + $this->daily_data = array_slice($this->daily_data, -$count, $count, true); + } + + file_put_contents($this->daily_file, json_encode($this->daily_data)); + } + + public function getDailyChartData() + { + if (!$this->daily_data) { + $this->daily_data = $this->getData($this->daily_file); + } + + $limit = intval($this->config->get('plugins.admin.popularity.dashboard.days_of_stats', 7)); + $chart_data = array_slice($this->daily_data, -$limit, $limit); + + $labels = array(); + $data = array(); + + foreach ($chart_data as $date => $count) { + $labels[] = self::getGrav()['grav']['admin']->translate(['PLUGIN_ADMIN.' . strtoupper(date('D', strtotime($date)))]); + $data[] = $count; + } + + return array('labels' => json_encode($labels), 'data' => json_encode($data)); + } + + public function getDailyTotal() + { + if (!$this->daily_data) { + $this->daily_data = $this->getData($this->daily_file); + } + + if (isset($this->daily_data[date(self::DAILY_FORMAT)])) { + return $this->daily_data[date(self::DAILY_FORMAT)]; + } else { + return 0; + } + } + + public function getWeeklyTotal() + { + if (!$this->daily_data) { + $this->daily_data = $this->getData($this->daily_file); + } + + $day = 0; + $total = 0; + foreach (array_reverse($this->daily_data) as $daily) { + $total += $daily; + $day++; + if ($day == 7) break; + } + + return $total; + } + + public function getMonthlyTotal() + { + if (!$this->monthly_data) { + $this->monthly_data = $this->getData($this->monthly_file); + } + if (isset($this->monthly_data[date(self::MONTHLY_FORMAT)])) { + return $this->monthly_data[date(self::MONTHLY_FORMAT)]; + } else { + return 0; + } + } + + protected function updateMonthly() + { + + if (!$this->monthly_data) { + $this->monthly_data = $this->getData($this->monthly_file); + } + + $month_year = date(self::MONTHLY_FORMAT); + + // get the monthly access count + if (array_key_exists($month_year, $this->monthly_data)) { + $this->monthly_data[$month_year] = intval($this->monthly_data[$month_year]) + 1; + } else { + $this->monthly_data[$month_year] = 1; + } + + // keep correct number as set by history + $count = intval($this->config->get('plugins.admin.popularity.history.monthly', 12)); + $total = count($this->monthly_data); + $this->monthly_data = array_slice($this->monthly_data, $total - $count, $count); + + + file_put_contents($this->monthly_file, json_encode($this->monthly_data)); + } + + protected function getMonthyChartData() + { + if (!$this->monthly_data) { + $this->monthly_data = $this->getData($this->monthly_file); + } + + $labels = array(); + $data = array(); + + foreach ($this->monthly_data as $date => $count) { + $labels[] = date('M', strtotime($date)); + $data[] = $count; + } + return array('labels' => $labels, 'data' => $data); + } + + protected function updateTotals($url) + { + if (!$this->totals_data) { + $this->totals_data = $this->getData($this->totals_file); + } + + // get the totals for this url + if (array_key_exists($url, $this->totals_data)) { + $this->totals_data[$url] = intval($this->totals_data[$url]) + 1; + } else { + $this->totals_data[$url] = 1; + } + + file_put_contents($this->totals_file, json_encode($this->totals_data)); + } + + protected function updateVisitors($ip) + { + if (!$this->visitors_data) { + $this->visitors_data = $this->getData($this->visitors_file); + } + + // update with current timestamp + $this->visitors_data[$ip] = time(); + $visitors = $this->visitors_data; + arsort($visitors); + + $count = intval($this->config->get('plugins.admin.popularity.history.visitors', 20)); + $this->visitors_data = array_slice($visitors, 0, $count, true); + + file_put_contents($this->visitors_file, json_encode($this->visitors_data)); + } + + protected function getData($path) + { + return (array) @json_decode(file_get_contents($path), true); + } + + + public function flushPopularity() + { + file_put_contents($this->daily_file, array()); + file_put_contents($this->monthly_file, array()); + file_put_contents($this->totals_file, array()); + file_put_contents($this->visitors_file, array()); + } +} diff --git a/user/plugins/admin/languages.yaml b/user/plugins/admin/languages.yaml new file mode 100644 index 0000000..2f63c73 --- /dev/null +++ b/user/plugins/admin/languages.yaml @@ -0,0 +1,2583 @@ +en: + PLUGIN_ADMIN: + ADMIN_BETA_MSG: "This is a Beta release! Use this in production at your own risk..." + ADMIN_REPORT_ISSUE: "Found an issue? Please report it on GitHub." + EMAIL_FOOTER: "Powered by Grav - The Modern Flat File CMS" + LOGIN_BTN: "Login" + LOGIN_BTN_FORGOT: "Forgot" + LOGIN_BTN_RESET: "Reset Password" + LOGIN_BTN_SEND_INSTRUCTIONS: "Send Reset Instructions" + LOGIN_LOGGED_IN: "You have been successfully logged in" + LOGIN_FAILED: "Login failed" + LOGGED_OUT: "You have been logged out" + RESET_LINK_EXPIRED: "Reset link has expired, please try again" + RESET_PASSWORD_RESET: "Password has been reset" + RESET_INVALID_LINK: "Invalid reset link used, please try again" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instructions to reset your password have been sent via email to %s" + FORGOT_FAILED_TO_EMAIL: "Failed to email instructions, please try again later" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Cannot reset password for %s, no email address is set" + FORGOT_USERNAME_DOES_NOT_EXIST: "User with username %s does not exist" + FORGOT_EMAIL_NOT_CONFIGURED: "Cannot reset password. This site is not configured to send emails" + FORGOT_EMAIL_SUBJECT: "%s Password Reset Request" + FORGOT_EMAIL_BODY: "

Password Reset

Dear %1$s,

A request was made on %4$s to reset your password.


Click this to reset your password

Alternatively, copy the following URL into your browser's address bar:

%2$s


Kind regards,

%3$s

" + MANAGE_PAGES: "Manage Pages" + CONFIGURATION: "Configuration" + PAGES: "Pages" + PLUGINS: "Plugins" + PLUGIN: "Plugin" + THEMES: "Themes" + LOGOUT: "Logout" + BACK: "Back" + ADD_PAGE: "Add Page" + ADD_MODULAR: "Add Modular" + MOVE: "Move" + DELETE: "Delete" + SAVE: "Save" + NORMAL: "Normal" + EXPERT: "Expert" + EXPAND_ALL: "Expand All" + COLLAPSE_ALL: "Collapse All" + ERROR: "Error" + CLOSE: "Close" + CANCEL: "Cancel" + CONTINUE: "Continue" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "Confirmation Required" + MODAL_CHANGED_DETECTED_TITLE: "Changes Detected" + MODAL_CHANGED_DETECTED_DESC: "You have unsaved changes. Are you sure you want to leave without saving?" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Confirmation Required" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Are you sure you want to delete this file? This action cannot be undone." + ADD_FILTERS: "Add Filters" + SEARCH_PAGES: "Search Pages" + VERSION: "Version" + WAS_MADE_WITH: "Was made with" + BY: "By" + UPDATE_THEME: "Update Theme" + UPDATE_PLUGIN: "Update Plugin" + OF_THIS_THEME_IS_NOW_AVAILABLE: "of this theme is now available" + OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "of this plugin is now available" + AUTHOR: "Author" + HOMEPAGE: "Homepage" + DEMO: "Demo" + BUG_TRACKER: "Bug Tracker" + KEYWORDS: "Keywords" + LICENSE: "License" + DESCRIPTION: "Description" + README: "Readme" + REMOVE_THEME: "Remove Theme" + INSTALL_THEME: "Install Theme" + THEME: "Theme" + BACK_TO_THEMES: "Back to Themes" + BACK_TO_PLUGINS: "Back to Plugins" + CHECK_FOR_UPDATES: "Check for Updates" + ADD: "Add" + CLEAR_CACHE: "Clear Cache" + CLEAR_CACHE_ALL_CACHE: "All Cache" + CLEAR_CACHE_ASSETS_ONLY: "Assets Only" + CLEAR_CACHE_IMAGES_ONLY: "Images Only" + CLEAR_CACHE_CACHE_ONLY: "Cache Only" + DASHBOARD: "Dashboard" + UPDATES_AVAILABLE: "Updates Available" + DAYS: "Days" + UPDATE: "Update" + BACKUP: "Backup" + STATISTICS: "Statistics" + TODAY: "Today" + WEEK: "Week" + MONTH: "Month" + LATEST_PAGE_UPDATES: "Latest Page Updates" + MAINTENANCE: "Maintenance" + UPDATED: "Updated" + MON: "Mon" + TUE: "Tue" + WED: "Wed" + THU: "Thu" + FRI: "Fri" + SAT: "Sat" + SUN: "Sun" + COPY: "Copy" + EDIT: "Edit" + CREATE: "Create" + GRAV_ADMIN: "Grav Admin" + GRAV_OFFICIAL_PLUGIN: "Grav Official Plugin" + GRAV_OFFICIAL_THEME: "Grav Official Theme" + PLUGIN_SYMBOLICALLY_LINKED: "This plugin is symbolically linked. Updates won't be detected." + THEME_SYMBOLICALLY_LINKED: "This theme is symbolically linked. Updates won't be detected" + REMOVE_PLUGIN: "Remove Plugin" + INSTALL_PLUGIN: "Install Plugin" + AVAILABLE: "Available" + INSTALLED: "Installed" + INSTALL: "Install" + ACTIVE_THEME: "Active Theme" + SWITCHING_TO: "Switching to" + SWITCHING_TO_DESCRIPTION: "By switching to a different theme, there is no guarantee that all the layout pages are supported, potentially causing errors when trying to load said pages." + SWITCHING_TO_CONFIRMATION: "Do you want to continue and switch to the theme" + CREATE_NEW_USER: "Create New User" + REMOVE_USER: "Remove User" + ACCESS_DENIED: "Access denied" + ACCOUNT_NOT_ADMIN: "your account does not have administrator permissions" + PHP_INFO: "PHP Info" + INSTALLER: "Installer" + AVAILABLE_THEMES: "Available Themes" + AVAILABLE_PLUGINS: "Available Plugins" + INSTALLED_THEMES: "Installed Themes" + INSTALLED_PLUGINS: "Installed Plugins" + BROWSE_ERROR_LOGS: "Browse Error Logs" + SITE: "Site" + INFO: "Info" + SYSTEM: "System" + USER: "User" + ADD_ACCOUNT: "Add Account" + SWITCH_LANGUAGE: "Switch Language" + SUCCESSFULLY_ENABLED_PLUGIN: "Successfully enabled plugin" + SUCCESSFULLY_DISABLED_PLUGIN: "Successfully disabled plugin" + SUCCESSFULLY_CHANGED_THEME: "Successfully changed default theme" + INSTALLATION_FAILED: "Installation failed" + INSTALLATION_SUCCESSFUL: "Installation successful" + UNINSTALL_FAILED: "Uninstall failed" + UNINSTALL_SUCCESSFUL: "Uninstall successful" + SUCCESSFULLY_SAVED: "Successfully saved" + SUCCESSFULLY_COPIED: "Successfully copied" + REORDERING_WAS_SUCCESSFUL: "Reordering was successful" + SUCCESSFULLY_DELETED: "Successfully deleted" + SUCCESSFULLY_SWITCHED_LANGUAGE: "Successfully switched language" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "You have insufficient permissions for task" + CACHE_CLEARED: "Cache cleared" + METHOD: "Method" + ERROR_CLEARING_CACHE: "Error clearing cache" + AN_ERROR_OCCURRED: "An error occurred" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "Your backup is ready for download" + DOWNLOAD_BACKUP: "Download backup" + PAGES_FILTERED: "Pages filtered" + NO_PAGE_FOUND: "No Page found" + INVALID_PARAMETERS: "Invalid Parameters" + NO_FILES_SENT: "No files sent" + EXCEEDED_FILESIZE_LIMIT: "Exceeded filesize limit" + UNKNOWN_ERRORS: "Unkown errors" + EXCEEDED_GRAV_FILESIZSE_LIMIT: "Exceeded Grav filesize limit." + UNSUPPORTED_FILE_TYPE: "Unsupported file type" + FAILED_TO_MOVE_UPLOADED_FILE: "Failed to move uploaded file." + FILE_UPLOADED_SUCCESSFULLY: "File uploaded successfully" + FILE_DELETED: "File deleted" + FILE_COULD_NOT_BE_DELETED: "File could not be deleted" + FILE_NOT_FOUND: "File not found" + NO_FILE_FOUND: "No file found" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "Grav was successfully updated to" + GRAV_UPDATE_FAILED: "Grav update failed" + EVERYTHING_UPDATED: "Everything updated" + UPDATES_FAILED: "Updates failed" + AVATAR_BY: "Avatar by" + LAST_BACKUP: "Last Backup" + FULL_NAME: "Full name" + USERNAME: "Username" + EMAIL: "Email" + PASSWORD: "Password" + TITLE: "Title" + LANGUAGE: "Language" + ACCOUNT: "Account" + EMAIL_VALIDATION_MESSAGE: "Must be a valid email address" + PASSWORD_VALIDATION_MESSAGE: "Password must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters" + LANGUAGE_HELP: "Set the favorite language" + MEDIA: "Media" + DEFAULTS: "Defaults" + SITE_TITLE: "Site Title" + SITE_TITLE_PLACEHOLDER: "Site wide title" + SITE_TITLE_HELP: "Default title for your site, often used in themes" + DEFAULT_AUTHOR: "Default Author" + DEFAULT_AUTHOR_HELP: "A default author name, often used in themes or page content" + DEFAULT_EMAIL: "Default Email" + DEFAULT_EMAIL_HELP: "A default email to reference in themes or pages" + TAXONOMY_TYPES: "Taxonomy Types" + TAXONOMY_TYPES_HELP: "Taxonomy types must be defined here if you wish to use them in pages" + PAGE_SUMMARY: "Page Summary" + ENABLED: "Enabled" + ENABLED_HELP: "Enable page summary (the summary returns the same as the page content)" + 'YES': "Yes" + 'NO': "No" + SUMMARY_SIZE: "Summary Size" + SUMMARY_SIZE_HELP: "The amount of characters of a page to use as a content summary" + FORMAT: "Format" + FORMAT_HELP: "short = use the first occurrence of delimiter or size; long = summary delimiter will be ignored" + SHORT: "Short" + LONG: "Long" + DELIMITER: "Delimiter" + DELIMITER_HELP: "The summary delimiter (default '===')" + METADATA: "Metadata" + METADATA_HELP: "Default metadata values that will be displayed on every page unless overridden by the page" + NAME: "Name" + CONTENT: "Content" + REDIRECTS_AND_ROUTES: "Redirects & Routes" + CUSTOM_REDIRECTS: "Custom Redirects" + CUSTOM_REDIRECTS_HELP: "routes to redirect to other pages. Standard Regex replacement is valid" + CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/your/redirect" + CUSTOM_ROUTES: "Custom Routes" + CUSTOM_ROUTES_HELP: "routes to alias to other pages. Standard Regex replacement is valid" + CUSTOM_ROUTES_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/your/route" + FILE_STREAMS: "File Streams" + DEFAULT: "Default" + PAGE_MEDIA: "Page Media" + OPTIONS: "Options" + PUBLISHED: "Published" + PUBLISHED_HELP: "By default, a page is published unless you explicitly set published: false or via a publish_date being in the future, or unpublish_date in the past" + DATE: "Date" + DATE_HELP: "The date variable allows you to specifically set a date associated with this page." + PUBLISHED_DATE: "Published Date" + PUBLISHED_DATE_HELP: "Can provide a date to automatically trigger publication." + UNPUBLISHED_DATE: "Unpublished Date" + UNPUBLISHED_DATE_HELP: "can provide a date to automatically trigger un-publication." + ROBOTS: "Robots" + TAXONOMIES: "Taxonomies" + TAXONOMY: "Taxonomy" + ADVANCED: "Advanced" + SETTINGS: "Settings" + FOLDER_NUMERIC_PREFIX: "Folder Numeric Prefix" + FOLDER_NUMERIC_PREFIX_HELP: "Numeric prefix that provides manual ordering and implies visibility" + FOLDER_NAME: "Folder Name" + FOLDER_NAME_HELP: "The folder name that will be stored in the filesystem for this page" + PARENT: "Parent" + DEFAULT_OPTION_ROOT: "- Root -" + DEFAULT_OPTION_SELECT: "- Select -" + DISPLAY_TEMPLATE: "Display Template" + DISPLAY_TEMPLATE_HELP: "The page type that translates into which twig template renders the page" + BODY_CLASSES: "Body Classes" + ORDERING: "Ordering" + PAGE_ORDER: "Page Order" + OVERRIDES: "Overrides" + MENU: "Menu" + MENU_HELP: "The string to be used in a menu. If not set, Title will be used." + SLUG: "Slug" + SLUG_HELP: "The slug variable allows you to specifically set the page's portion of the URL" + SLUG_VALIDATE_MESSAGE: "A slug must contain only lowercase alphanumeric characters and dashes" + PROCESS: "Process" + PROCESS_HELP: "Control how pages are processed. Can be set per-page rather than globally" + DEFAULT_CHILD_TYPE: "Default Child Type" + USE_GLOBAL: "Use Global" + ROUTABLE: "Routable" + ROUTABLE_HELP: "If this page is reachable by a URL" + CACHING: "Caching" + VISIBLE: "Visible" + VISIBLE_HELP: "Determines if a page is visible in the navigation." + DISABLED: "Disabled" + ITEMS: "Items" + ORDER_BY: "Order By" + ORDER: "Order" + FOLDER: "Folder" + ASCENDING: "Ascending" + DESCENDING: "Descending" + ADD_MODULAR_CONTENT: "Add Modular Content" + PAGE_TITLE: "Page Title" + PAGE_TITLE_HELP: "The title of the page" + PAGE: "Page" + MODULAR_TEMPLATE: "Modular Template" + FRONTMATTER: "Frontmatter" + FILENAME: "Filename" + PARENT_PAGE: "Parent Page" + HOME_PAGE: "Home page" + HOME_PAGE_HELP: "The page that Grav will use as the default landing page" + DEFAULT_THEME: "Default theme" + DEFAULT_THEME_HELP: "Set the default theme for Grav to use (default is Antimatter)" + TIMEZONE: "Timezone" + TIMEZONE_HELP: "Override the default timezone the server" + SHORT_DATE_FORMAT: "Short display date format" + SHORT_DATE_FORMAT_HELP: "Set the short date format that can be used by themes" + LONG_DATE_FORMAT: "Long display date format" + LONG_DATE_FORMAT_HELP: "Set the long date format that can be used by themes" + DEFAULT_ORDERING: "Default ordering" + DEFAULT_ORDERING_HELP: "Pages in a list will render using this order unless it is overridden" + DEFAULT_ORDERING_DEFAULT: "Default - based on folder name" + DEFAULT_ORDERING_FOLDER: "Folder - based on prefix-less folder name" + DEFAULT_ORDERING_TITLE: "Title - based on title field in header" + DEFAULT_ORDERING_DATE: "Date - based on date field in header" + DEFAULT_ORDER_DIRECTION: "Default order direction" + DEFAULT_ORDER_DIRECTION_HELP: "The direction of pages in a list" + DEFAULT_PAGE_COUNT: "Default page count" + DEFAULT_PAGE_COUNT_HELP: "Default maximum pages count in a list" + DATE_BASED_PUBLISHING: "Date-based publishing" + DATE_BASED_PUBLISHING_HELP: "Automatically (un)publish posts based on their date" + EVENTS: "Events" + EVENTS_HELP: "Enable or Disable specific events. Disabling these can break plugins" + REDIRECT_DEFAULT_ROUTE: "Redirect default route" + REDIRECT_DEFAULT_ROUTE_HELP: "Automatically redirect to a page's default route" + LANGUAGES: "Languages" + SUPPORTED: "Supported" + SUPPORTED_HELP: "Comma separated list of 2 letter language codes (for example 'en,fr,de')" + TRANSLATIONS_ENABLED: "Translations enabled" + TRANSLATIONS_ENABLED_HELP: "Support translations in Grav, plugins and extensions" + TRANSLATIONS_FALLBACK: "Translations fallback" + TRANSLATIONS_FALLBACK_HELP: "Fallback through supported translations if active language doesn't exist" + ACTIVE_LANGUAGE_IN_SESSION: "Active language in session" + ACTIVE_LANGUAGE_IN_SESSION_HELP: "Store the active language in the session" + HTTP_HEADERS: "HTTP Headers" + EXPIRES: "Expires" + EXPIRES_HELP: "Sets the expires header. The value is in seconds." + LAST_MODIFIED: "Last modified" + LAST_MODIFIED_HELP: "Sets the last modified header that can help optimize proxy and browser caching" + ETAG: "ETag" + ETAG_HELP: "Sets the etag header to help identify when a page has been modified" + VARY_ACCEPT_ENCODING: "Vary accept encoding" + VARY_ACCEPT_ENCODING_HELP: "Sets the `Vary: Accept Encoding` header to help with proxy and CDN caching" + MARKDOWN_EXTRA_HELP: "Enable default support for Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" + AUTO_LINE_BREAKS: "Auto line breaks" + AUTO_LINE_BREAKS_HELP: "Enable support for automatic line breaks in markdown" + AUTO_URL_LINKS: "Auto URL links" + AUTO_URL_LINKS_HELP: "Enable automatic conversion of URLs into HTML hyperlinks" + ESCAPE_MARKUP: "Escape markup" + ESCAPE_MARKUP_HELP: "Escape markup tags into HTML entities" + CACHING_HELP: "Global ON/OFF switch to enable/disable Grav caching" + CACHE_CHECK_METHOD: "Cache check method" + CACHE_CHECK_METHOD_HELP: "Select the method that Grav uses to check if page files have been modified." + CACHE_DRIVER: "Cache driver" + CACHE_DRIVER_HELP: "Choose which cache driver Grav should use. 'Auto Detect' attempts to find the best for you" + CACHE_PREFIX: "Cache prefix" + CACHE_PREFIX_HELP: "An identifier for part of the Grav key. Don't change unless you know what your doing." + CACHE_PREFIX_PLACEHOLDER: "Derived from base URL (override by entering random string)" + LIFETIME: "Lifetime" + LIFETIME_HELP: "Sets the cache lifetime in seconds. 0 = infinite" + GZIP_COMPRESSION: "Gzip compression" + GZIP_COMPRESSION_HELP: "Enable GZip compression of the Grav page for increased performance." + TWIG_TEMPLATING: "Twig Templating" + TWIG_CACHING: "Twig caching" + TWIG_CACHING_HELP: "Control the Twig caching mechanism. Leave this enabled for best performance." + TWIG_DEBUG: "Twig debug" + TWIG_DEBUG_HELP: "Allows the option of not loading the Twig Debugger extension" + DETECT_CHANGES: "Detect changes" + DETECT_CHANGES_HELP: "Twig will automatically recompile the Twig cache if it detects any changes in Twig templates" + AUTOESCAPE_VARIABLES: "Autoescape variables" + AUTOESCAPE_VARIABLES_HELP: "Autoescapes all variables. This will break your site most likely" + ASSETS: "Assets" + CSS_PIPELINE: "CSS pipeline" + CSS_PIPELINE_HELP: "The CSS pipeline is the unification of multiple CSS resources into one file" + CSS_MINIFY: "CSS minify" + CSS_MINIFY_HELP: "Minify the CSS during pipelining" + CSS_MINIFY_WINDOWS_OVERRIDE: "CSS minify Windows override" + CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Minify Override for Windows platforms. False by default due to ThreadStackSize" + CSS_REWRITE: "CSS rewrite" + CSS_REWRITE_HELP: "Rewrite any CSS relative URLs during pipelining" + JAVASCRIPT_PIPELINE: "JavaScript pipeline" + JAVASCRIPT_PIPELINE_HELP: "The JS pipeline is the unification of multiple JS resources into one file" + JAVASCRIPT_MINIFY: "JavaScript minify" + JAVASCRIPT_MINIFY_HELP: "Minify the JS during pipelining" + ENABLED_TIMESTAMPS_ON_ASSETS: "Enable timestamps on assets" + ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Enable asset timestamps" + COLLECTIONS: "Collections" + ERROR_HANDLER: "Error handler" + DISPLAY_ERRORS: "Display errors" + DISPLAY_ERRORS_HELP: "Display full backtrace-style error page" + LOG_ERRORS: "Log errors" + LOG_ERRORS_HELP: "Log errors to /logs folder" + DEBUGGER: "Debugger" + DEBUGGER_HELP: "Enable Grav debugger and following settings" + DEBUG_TWIG: "Debug Twig" + DEBUG_TWIG_HELP: "Enable debugging of Twig templates" + SHUTDOWN_CLOSE_CONNECTION: "Shutdown close connection" + SHUTDOWN_CLOSE_CONNECTION_HELP: "Close the connection before calling onShutdown(). false for debugging" + DEFAULT_IMAGE_QUALITY: "Default image quality" + DEFAULT_IMAGE_QUALITY_HELP: "Default image quality to use when resampling or caching images (85%)" + CACHE_ALL: "Cache all images" + CACHE_ALL_HELP: "Run all images through Grav's cache system even if they have no media manipulations" + IMAGES_DEBUG: "Image debug watermark" + IMAGES_DEBUG_HELP: "Show an overlay over images indicating the pixel depth of the image when working with retina for example" + UPLOAD_LIMIT: "File upload limit" + UPLOAD_LIMIT_HELP: "Set maximum upload size in bytes (0 is unlimited)" + ENABLE_MEDIA_TIMESTAMP: "Enable timestamps on media" + ENABLE_MEDIA_TIMESTAMP_HELP: "Appends a timestamp based on last modified date to each media item" + SESSION: "Session" + SESSION_ENABLED_HELP: "Enable session support within Grav" + TIMEOUT: "Timeout" + TIMEOUT_HELP: "Sets the session timeout in seconds" + SESSION_NAME_HELP: "An identifier used to form the name of the session cookie" + ABSOLUTE_URLS: "Absolute URLs" + ABSOLUTE_URLS_HELP: "Absolute or relative URLs for `base_url`" + PARAMETER_SEPARATOR: "Parameter separator" + PARAMETER_SEPARATOR_HELP: "Separater for passed parameters that can be changed for Apache on Windows" + TASK_COMPLETED: "Task completed" + EVERYTHING_UP_TO_DATE: "Everything is up to date" + UPDATES_ARE_AVAILABLE: "updates are available" + IS_AVAILABLE_FOR_UPDATE: "is available for update" + IS_NOW_AVAILABLE: "is now available" + CURRENT: "Current" + UPDATE_GRAV_NOW: "Update Grav Now" + GRAV_SYMBOLICALLY_LINKED: "Grav is symbolically linked. Upgrade won\'t be available" + UPDATING_PLEASE_WAIT: "Updating... please wait, downloading" + OF_THIS: "of this" + OF_YOUR: "of your" + HAVE_AN_UPDATE_AVAILABLE: "have an update available" + SAVE_AS: "Save as" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: "Are you sure you want to delete this page and all it's children? If the page is translated in other languages, those translations will be kept and must be deleted separately. Otherwise the page folder will be deleted along with its subpages. This action cannot be undone." + AND: "and" + UPDATE_AVAILABLE: "Update available" + METADATA_KEY: "Key (e.g. 'Keywords')" + METADATA_VALUE: "Value (e.g. 'Blog, Grav')" + USERNAME_HELP: "Username should be between 3 and 16 characters, including lowercase letters, numbers, underscores, and hyphens. Uppercase letters, spaces, and special characters are not allowed" + FULLY_UPDATED: "Fully Updated" + SAVE_LOCATION: "Save location" + PAGE_FILE: "Page File" + PAGE_FILE_HELP: "Page file name, and by default the display template for this page" + NO_USER_ACCOUNTS: "No user accounts found, please create one first..." + REDIRECT_TRAILING_SLASH: "Redirect trailing slash" + REDIRECT_TRAILING_SLASH_HELP: "Perform a 301 redirect rather than transparently handling trailing slash URIs." + DEFAULT_DATE_FORMAT: "Page date format" + DEFAULT_DATE_FORMAT_HELP: "Page date format used by Grav. By default, Grav attempts to guess your date format, however you can specifiy a format using PHP's date syntax (e.g.: Y-m-d H:i)" + DEFAULT_DATE_FORMAT_PLACEHOLDER: "Guess automatically if blank" + IGNORE_FILES: "Ignore files" + IGNORE_FILES_HELP: "Specific files to ignore when processing pages" + IGNORE_FOLDERS: "Ignore folders" + IGNORE_FOLDERS_HELP: "Specific folders to ignore when processing pages" + HTTP_ACCEPT_LANGUAGE: "Set language from browser" + HTTP_ACCEPT_LANGUAGE_HELP: "You can opt to try to set the language based on `http_accept_language` header tag in the browser" + OVERRIDE_LOCALE: "Override locale" + OVERRIDE_LOCALE_HELP: "Override the locale setting in PHP based on the current language" + REDIRECT: "Page redirect" + REDIRECT_HELP: "Enter a page route or external URL for this page to redirect to. e.g. `/some/route` or `http://somesite.com`" + PLUGIN_STATUS: "Plugin status" + INCLUDE_DEFAULT_LANG: "Include default language" + INCLUDE_DEFAULT_LANG_HELP: "This will prepend all URLs in the default language with the default language. e.g. `/en/blog/my-post`" + ALLOW_URL_TAXONOMY_FILTERS: "URL Taxonomy Filters" + ALLOW_URL_TAXONOMY_FILTERS_HELP: "Page-based collections allow you to filter via `/taxonomy:value`." + REDIRECT_DEFAULT_CODE: "Default redirect code" + REDIRECT_DEFAULT_CODE_HELP: "The HTTP status code to use for redirects" + IGNORE_HIDDEN: "Ignore hidden" + IGNORE_HIDDEN_HELP: "Ignore all files and folders that being with a DOT" + WRAPPED_SITE: "Wrapped site" + WRAPPED_SITE_HELP: "For themes/plugins to know if Grav is wrapped by another platform" + FALLBACK_TYPES: "Allowed fallback types" + FALLBACK_TYPES_HELP: "Allowed file types that can be found if accessed via Page route" +es: + PLUGIN_ADMIN: + ADMIN_BETA_MSG: "¡Está es una versión Beta! Utilízala bajo tu propio riesgo..." + ADMIN_REPORT_ISSUE: "¿Encontraste algún problema de funcionamiento? Por favor, repórtalo en GitHub." + EMAIL_FOOTER: "Funcionando con Grav - El CMS de archivos planos moderno" + LOGIN_BTN: "Login" + LOGIN_BTN_FORGOT: "Me olvidé" + LOGIN_BTN_RESET: "Restablecer contraseña" + LOGIN_BTN_SEND_INSTRUCTIONS: "Enviar instrucciones de restablecimiento" + LOGIN_LOGGED_IN: "Has conseguido iniciar sesión con éxito" + LOGIN_FAILED: "El inicio de sesión falló" + LOGGED_OUT: "Te has desconectado" + RESET_LINK_EXPIRED: "El enlace de restablecimiento ha caducado, por favor, inténtalo de nuevo" + RESET_PASSWORD_RESET: "La contraseña ha sido restablecida" + RESET_INVALID_LINK: "El enlace de restablecimiento no es válido, por favor, inténtalo otra vez" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Las instrucciones para restablecer tu contraseña han sido enviadas por email a %s" + FORGOT_FAILED_TO_EMAIL: "Fallo al enviar las instrucciones por email, por favor inténtalo de nuevo más tarde" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "No se puede restablecer la contraseña para %s, no se ha establecido una dirección de email" + FORGOT_USERNAME_DOES_NOT_EXIST: "El usuario %s no existe" + FORGOT_EMAIL_NOT_CONFIGURED: "No se puede restablecer contraseña. Este sitio no está configurado para enviar emails" + FORGOT_EMAIL_SUBJECT: "%s Petición de restablecimiento de contraseña" + FORGOT_EMAIL_BODY: "

Restablecimiento de contraseña

Estimado %1$s,

Se ha realizado una petición el %4$s para restablecer tu contraseña.


Pincha aquí para restablecer tu contraseña

Alternativamente, copia la siguiente URL en la barra de direcciones de tu navegador:

%2$s


Atentamente,

%3$s

" + MANAGE_PAGES: "Adminitrar páginas" + CONFIGURATION: "Configuración" + PAGES: "Páginas" + PLUGINS: "Plugins" + PLUGIN: "Plugin" + THEMES: "Temas" + LOGOUT: "Logout" + BACK: "Atrás" + ADD_PAGE: "Agregar Página" + ADD_MODULAR: "Agregar Módulo" + MOVE: "Mover" + DELETE: "Borrar" + SAVE: "Guardar" + NORMAL: "Normal" + EXPERT: "Experto" + EXPAND_ALL: "Expandir Todo" + COLLAPSE_ALL: "Cerrar Todo" + ERROR: "Error" + CLOSE: "Cerrar" + CANCEL: "Cancelar" + CONTINUE: "Continuar" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "Confirmación Requerida" + MODAL_CHANGED_DETECTED_TITLE: "Cambios elminados" + MODAL_CHANGED_DETECTED_DESC: "Usted tiene cambios sin guardar. Está seguro que desea irse sin guardar?" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Confirmación Requerida" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Está seguro que desea eliminar este archivo? Está acción no se puede deshacer." + ADD_FILTERS: "Agregar Filtros" + SEARCH_PAGES: "Buscar Páginas" + VERSION: "Versión" + WAS_MADE_WITH: "Fue hecho por" + BY: "Por" + UPDATE_THEME: "Actualizar Tema" + UPDATE_PLUGIN: "Actualizar Plugin" + OF_THIS_THEME_IS_NOW_AVAILABLE: "de este tema ya está disponible" + OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "de este plugin ya está disponible" + AUTHOR: "Autor" + HOMEPAGE: "Página de inicio" + DEMO: "Demo" + BUG_TRACKER: "Bug Tracker" + KEYWORDS: "Palabras Clave" + LICENSE: "Licencia" + DESCRIPTION: "Descripción" + README: "Léame" + REMOVE_THEME: "Eliminar Tema" + INSTALL_THEME: "Instalar Tema" + THEME: "Tema" + BACK_TO_THEMES: "Volver a Temas" + BACK_TO_PLUGINS: "Volver a Plugins" + CHECK_FOR_UPDATES: "Buscar Actualizaciones" + ADD: "Agregar" + CLEAR_CACHE: "Limpiar Cache" + CLEAR_CACHE_ALL_CACHE: "Limpiar Toda la Cache" + CLEAR_CACHE_ASSETS_ONLY: "Solo Assets" + CLEAR_CACHE_IMAGES_ONLY: "Solo Images" + CLEAR_CACHE_CACHE_ONLY: "Solo Cache" + DASHBOARD: "Dashboard" + UPDATES_AVAILABLE: "Actualizaciones disponibles" + DAYS: "Días" + UPDATE: "Actualizar" + BACKUP: "Respaldo" + STATISTICS: "Estadisticas" + TODAY: "Hoy" + WEEK: "Semana" + MONTH: "Mes" + LATEST_PAGE_UPDATES: "Última Página de Actualizaciones" + MAINTENANCE: "Mantenimiento" + UPDATED: "Actualizado" + MON: "Lun" + TUE: "Mar" + WED: "Mie" + THU: "Jue" + FRI: "Vie" + SAT: "Sab" + SUN: "Dom" + COPY: "Copiar" + EDIT: "Editar" + CREATE: "Crear" + GRAV_ADMIN: "Grav Admin" + GRAV_OFFICIAL_PLUGIN: "Grav Plugin Oficial" + GRAV_OFFICIAL_THEME: "Grav Tema Oficial" + PLUGIN_SYMBOLICALLY_LINKED: "Este plugin esta simbólicamente vinculado. No se podrá actualizar." + THEME_SYMBOLICALLY_LINKED: "Este tema esta simbólicamente vinculado. Las actualizaciones no se podrán eliminar." + REMOVE_PLUGIN: "Eliminar Plugin" + INSTALL_PLUGIN: "Instalar Plugin" + AVAILABLE: "Disponibile" + INSTALLED: "Instalado" + INSTALL: "Instalar" + ACTIVE_THEME: "Tema activo" + SWITCHING_TO: "Cambiando a" + SWITCHING_TO_DESCRIPTION: "By switching to a different theme, there is no guarantee that all the layout pages are supported, potentially causing errors when trying to load said pages." + SWITCHING_TO_CONFIRMATION: "Desea continuar y cambiar el tema" + CREATE_NEW_USER: "Crear nuevo usuario" + REMOVE_USER: "Eliminar usuario" + ACCESS_DENIED: "Acceso denegado" + ACCOUNT_NOT_ADMIN: "su cuenta no posee privilegios de administrador" + PHP_INFO: "PHP Info" + INSTALLER: "Instalador" + AVAILABLE_THEMES: "Temas Disponibiles" + AVAILABLE_PLUGINS: "Plugins Disponibiles" + INSTALLED_THEMES: "Temas Intalados" + INSTALLED_PLUGINS: "Plugins Intalados" + BROWSE_ERROR_LOGS: "Verregistros de errores" + SITE: "Sitio" + INFO: "Info" + SYSTEM: "Sistema" + USER: "Usuario" + ADD_ACCOUNT: "Añadir cuenta" + SWITCH_LANGUAGE: "Cambiar idioma" + SUCCESSFULLY_ENABLED_PLUGIN: "Plugin activado exitosamente" + SUCCESSFULLY_DISABLED_PLUGIN: "Plugin activado exitosamente" + SUCCESSFULLY_CHANGED_THEME: "Tema por defecto exitosamente modificado" + INSTALLATION_FAILED: "Installación fallida" + INSTALLATION_SUCCESSFUL: "Installación exitosa" + UNINSTALL_FAILED: "Desinstalación fallida" + UNINSTALL_SUCCESSFUL: "Desinstalación exitosa" + SUCCESSFULLY_SAVED: "Successfully saved" + SUCCESSFULLY_COPIED: "Successfully copied" + REORDERING_WAS_SUCCESSFUL: "Reordering was successful" + SUCCESSFULLY_DELETED: "Successfully deleted" + SUCCESSFULLY_SWITCHED_LANGUAGE: "Successfully switched language" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "You have insufficient permissions for task" + CACHE_CLEARED: "Cache cleared" + METHOD: "Method" + ERROR_CLEARING_CACHE: "Error clearing cache" + AN_ERROR_OCCURRED: "An error occurred" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "Your backup is ready for download" + DOWNLOAD_BACKUP: "Download backup" + PAGES_FILTERED: "Pages filtered" + NO_PAGE_FOUND: "No Page found" + INVALID_PARAMETERS: "Invalid Parameters" + NO_FILES_SENT: "No files sent" + EXCEEDED_FILESIZE_LIMIT: "Exceeded filesize limit" + UNKNOWN_ERRORS: "Unkown errors" + EXCEEDED_GRAV_FILESIZSE_LIMIT: "Exceeded Grav filesize limit." + UNSUPPORTED_FILE_TYPE: "Unsupported file type" + FAILED_TO_MOVE_UPLOADED_FILE: "Failed to move uploaded file." + FILE_UPLOADED_SUCCESSFULLY: "File uploaded successfully" + FILE_DELETED: "File deleted" + FILE_COULD_NOT_BE_DELETED: "File could not be deleted" + FILE_NOT_FOUND: "File not found" + NO_FILE_FOUND: "No file found" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "Grav was successfully updated to" + GRAV_UPDATE_FAILED: "Grav update failed" + EVERYTHING_UPDATED: "Everything updated" + UPDATES_FAILED: "Updates failed" + AVATAR_BY: "Avatar by" + LAST_BACKUP: "Last Backup" + FULL_NAME: "Full name" + USERNAME: "Username" + EMAIL: "Email" + PASSWORD: "Password" + TITLE: "Title" + LANGUAGE: "Language" + ACCOUNT: "Account" + EMAIL_VALIDATION_MESSAGE: "Must be a valid email address" + PASSWORD_VALIDATION_MESSAGE: "Password must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters" + LANGUAGE_HELP: "Set the favorite language" + MEDIA: "Media" + DEFAULTS: "Defaults" + SITE_TITLE: "Site Title" + SITE_TITLE_PLACEHOLDER: "Site wide title" + SITE_TITLE_HELP: "Default title for your site, often used in themes" + DEFAULT_AUTHOR: "Default Author" + DEFAULT_AUTHOR_HELP: "A default author name, often used in themes or page content" + DEFAULT_EMAIL: "Default Email" + DEFAULT_EMAIL_HELP: "A default email to reference in themes or pages" + TAXONOMY_TYPES: "Taxonomy Types" + TAXONOMY_TYPES_HELP: "Taxonomy types must be defined here if you wish to use them in pages" + PAGE_SUMMARY: "Page Summary" + ENABLED: "Enabled" + ENABLED_HELP: "Enable page summary (the summary returns the same as the page content)" + 'YES': "Yes" + 'NO': "No" + SUMMARY_SIZE: "Summary Size" + SUMMARY_SIZE_HELP: "The amount of characters of a page to use as a content summary" + FORMAT: "Format" + FORMAT_HELP: "short = use the first occurrence of delimiter or size; long = summary delimiter will be ignored" + SHORT: "Short" + LONG: "Long" + DELIMITER: "Delimiter" + DELIMITER_HELP: "The summary delimiter (default '===')" + METADATA: "Metadata" + METADATA_HELP: "Default metadata values that will be displayed on every page unless overridden by the page" + NAME: "Name" + CONTENT: "Content" + REDIRECTS_AND_ROUTES: "Redirects & Routes" + CUSTOM_REDIRECTS: "Custom Redirects" + CUSTOM_REDIRECTS_HELP: "routes to redirect to other pages. Standard Regex replacement is valid" + CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/your/redirect" + CUSTOM_ROUTES: "Custom Routes" + CUSTOM_ROUTES_HELP: "routes to alias to other pages. Standard Regex replacement is valid" + CUSTOM_ROUTES_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/your/route" + FILE_STREAMS: "File Streams" + DEFAULT: "Default" + PAGE_MEDIA: "Page Media" + OPTIONS: "Options" + PUBLISHED: "Published" + PUBLISHED_HELP: "By default, a page is published unless you explicitly set published: false or via a publish_date being in the future, or unpublish_date in the past" + DATE: "Date" + DATE_HELP: "The date variable allows you to specifically set a date associated with this page." + PUBLISHED_DATE: "Published Date" + PUBLISHED_DATE_HELP: "Can provide a date to automatically trigger publication." + UNPUBLISHED_DATE: "Unpublished Date" + UNPUBLISHED_DATE_HELP: "can provide a date to automatically trigger un-publication." + ROBOTS: "Robots" + TAXONOMIES: "Taxonomies" + TAXONOMY: "Taxonomy" + ADVANCED: "Advanced" + SETTINGS: "Settings" + FOLDER_NUMERIC_PREFIX: "Folder Numeric Prefix" + FOLDER_NUMERIC_PREFIX_HELP: "Numeric prefix that provides manual ordering and implies visibility" + FOLDER_NAME: "Folder Name" + FOLDER_NAME_HELP: "The folder name that will be stored in the filesystem for this page" + PARENT: "Parent" + DEFAULT_OPTION_ROOT: "- Root -" + DEFAULT_OPTION_SELECT: "- Select -" + DISPLAY_TEMPLATE: "Display Template" + DISPLAY_TEMPLATE_HELP: "The page type that translates into which twig template renders the page" + BODY_CLASSES: "Body Classes" + ORDERING: "Ordering" + PAGE_ORDER: "Page Order" + OVERRIDES: "Overrides" + MENU: "Menu" + MENU_HELP: "The string to be used in a menu. If not set, Title will be used." + SLUG: "Slug" + SLUG_HELP: "The slug variable allows you to specifically set the page's portion of the URL" + SLUG_VALIDATE_MESSAGE: "A slug must contain only lowercase alphanumeric characters and dashes" + PROCESS: "Process" + PROCESS_HELP: "Control how pages are processed. Can be set per-page rather than globally" + DEFAULT_CHILD_TYPE: "Default Child Type" + USE_GLOBAL: "Use Global" + ROUTABLE: "Routable" + ROUTABLE_HELP: "If this page is reachable by a URL" + CACHING: "Caching" + VISIBLE: "Visible" + VISIBLE_HELP: "Determines if a page is visible in the navigation." + DISABLED: "Disabled" + ITEMS: "Items" + ORDER_BY: "Order By" + ORDER: "Order" + FOLDER: "Folder" + ASCENDING: "Ascending" + DESCENDING: "Descending" + ADD_MODULAR_CONTENT: "Add Modular Content" + PAGE_TITLE: "Page Title" + PAGE_TITLE_HELP: "The title of the page" + PAGE: "Page" + MODULAR_TEMPLATE: "Modular Template" + FRONTMATTER: "Frontmatter" + FILENAME: "Filename" + PARENT_PAGE: "Parent Page" + HOME_PAGE: "Home page" + HOME_PAGE_HELP: "The page that Grav will use as the default landing page" + DEFAULT_THEME: "Default theme" + DEFAULT_THEME_HELP: "Set the default theme for Grav to use (default is Antimatter)" + TIMEZONE: "Timezone" + TIMEZONE_HELP: "Override the default timezone the server" + SHORT_DATE_FORMAT: "Short date format" + SHORT_DATE_FORMAT_HELP: "Set the short date format that can be used by themes" + LONG_DATE_FORMAT: "Long date format" + LONG_DATE_FORMAT_HELP: "Set the long date format that can be used by themes" + DEFAULT_ORDERING: "Default ordering" + DEFAULT_ORDERING_HELP: "Pages in a list will render using this order unless it is overridden" + DEFAULT_ORDERING_DEFAULT: "Default - based on folder name" + DEFAULT_ORDERING_FOLDER: "Folder - based on prefix-less folder name" + DEFAULT_ORDERING_TITLE: "Title - based on title field in header" + DEFAULT_ORDERING_DATE: "Date - based on date field in header" + DEFAULT_ORDER_DIRECTION: "Default order direction" + DEFAULT_ORDER_DIRECTION_HELP: "The direction of pages in a list" + DEFAULT_PAGE_COUNT: "Default page count" + DEFAULT_PAGE_COUNT_HELP: "Default maximum pages count in a list" + DATE_BASED_PUBLISHING: "Date-based publishing" + DATE_BASED_PUBLISHING_HELP: "Automatically (un)publish posts based on their date" + EVENTS: "Events" + EVENTS_HELP: "Enable or Disable specific events. Disabling these can break plugins" + REDIRECT_DEFAULT_ROUTE: "Redirect default route" + REDIRECT_DEFAULT_ROUTE_HELP: "Automatically redirect to a page's default route" + LANGUAGES: "Languages" + SUPPORTED: "Supported" + SUPPORTED_HELP: "Comma separated list of 2 letter language codes (for example 'en,fr,de')" + TRANSLATIONS_ENABLED: "Translations enabled" + TRANSLATIONS_ENABLED_HELP: "Support translations in Grav, plugins and extensions" + TRANSLATIONS_FALLBACK: "Translations fallback" + TRANSLATIONS_FALLBACK_HELP: "Fallback through supported translations if active language doesn't exist" + ACTIVE_LANGUAGE_IN_SESSION: "Active language in session" + ACTIVE_LANGUAGE_IN_SESSION_HELP: "Store the active language in the session" + HTTP_HEADERS: "HTTP Headers" + EXPIRES: "Expires" + EXPIRES_HELP: "Sets the expires header. The value is in seconds." + LAST_MODIFIED: "Last modified" + LAST_MODIFIED_HELP: "Sets the last modified header that can help optimize proxy and browser caching" + ETAG: "ETag" + ETAG_HELP: "Sets the etag header to help identify when a page has been modified" + VARY_ACCEPT_ENCODING: "Vary accept encoding" + VARY_ACCEPT_ENCODING_HELP: "Sets the `Vary: Accept Encoding` header to help with proxy and CDN caching" + MARKDOWN_EXTRA_HELP: "Enable default support for Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" + AUTO_LINE_BREAKS: "Auto line breaks" + AUTO_LINE_BREAKS_HELP: "Enable support for automatic line breaks in markdown" + AUTO_URL_LINKS: "Auto URL links" + AUTO_URL_LINKS_HELP: "Enable automatic conversion of URLs into HTML hyperlinks" + ESCAPE_MARKUP: "Escape markup" + ESCAPE_MARKUP_HELP: "Escape markup tags into HTML entities" + CACHING_HELP: "Global ON/OFF switch to enable/disable Grav caching" + CACHE_CHECK_METHOD: "Cache check method" + CACHE_CHECK_METHOD_HELP: "Select the method that Grav uses to check if page files have been modified." + CACHE_DRIVER: "Cache driver" + CACHE_DRIVER_HELP: "Choose which cache driver Grav should use. 'Auto Detect' attempts to find the best for you" + CACHE_PREFIX: "Cache prefix" + CACHE_PREFIX_HELP: "An identifier for part of the Grav key. Don't change unless you know what your doing." + CACHE_PREFIX_PLACEHOLDER: "Derived from base URL (override by entering random string)" + LIFETIME: "Lifetime" + LIFETIME_HELP: "Sets the cache lifetime in seconds. 0 = infinite" + GZIP_COMPRESSION: "Gzip compression" + GZIP_COMPRESSION_HELP: "Enable GZip compression of the Grav page for increased performance." + TWIG_TEMPLATING: "Twig Templating" + TWIG_CACHING: "Twig caching" + TWIG_CACHING_HELP: "Control the Twig caching mechanism. Leave this enabled for best performance." + TWIG_DEBUG: "Twig debug" + TWIG_DEBUG_HELP: "Allows the option of not loading the Twig Debugger extension" + DETECT_CHANGES: "Detect changes" + DETECT_CHANGES_HELP: "Twig will automatically recompile the Twig cache if it detects any changes in Twig templates" + AUTOESCAPE_VARIABLES: "Autoescape variables" + AUTOESCAPE_VARIABLES_HELP: "Autoescapes all variables. This will break your site most likely" + ASSETS: "Assets" + CSS_PIPELINE: "CSS pipeline" + CSS_PIPELINE_HELP: "The CSS pipeline is the unification of multiple CSS resources into one file" + CSS_MINIFY: "CSS minify" + CSS_MINIFY_HELP: "Minify the CSS during pipelining" + CSS_MINIFY_WINDOWS_OVERRIDE: "CSS minify Windows override" + CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Minify Override for Windows platforms. False by default due to ThreadStackSize" + CSS_REWRITE: "CSS rewrite" + CSS_REWRITE_HELP: "Rewrite any CSS relative URLs during pipelining" + JAVASCRIPT_PIPELINE: "JavaScript pipeline" + JAVASCRIPT_PIPELINE_HELP: "The JS pipeline is the unification of multiple JS resources into one file" + JAVASCRIPT_MINIFY: "JavaScript minify" + JAVASCRIPT_MINIFY_HELP: "Minify the JS during pipelining" + ENABLED_TIMESTAMPS_ON_ASSETS: "Enable timestamps on assets" + ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Enable asset timestamps" + COLLECTIONS: "Collections" + ERROR_HANDLER: "Error handler" + DISPLAY_ERRORS: "Display errors" + DISPLAY_ERRORS_HELP: "Display full backtrace-style error page" + LOG_ERRORS: "Log errors" + LOG_ERRORS_HELP: "Log errors to /logs folder" + DEBUGGER: "Debugger" + DEBUGGER_HELP: "Enable Grav debugger and following settings" + DEBUG_TWIG: "Debug Twig" + DEBUG_TWIG_HELP: "Enable debugging of Twig templates" + SHUTDOWN_CLOSE_CONNECTION: "Shutdown close connection" + SHUTDOWN_CLOSE_CONNECTION_HELP: "Close the connection before calling onShutdown(). false for debugging" + DEFAULT_IMAGE_QUALITY: "Default image quality" + DEFAULT_IMAGE_QUALITY_HELP: "Default image quality to use when resampling or caching images (85%)" + CACHE_ALL: "Cache all images" + CACHE_ALL_HELP: "Run all images through Grav's cache system even if they have no media manipulations" + IMAGES_DEBUG: "Image debug watermark" + IMAGES_DEBUG_HELP: "Show an overlay over images indicating the pixel depth of the image when working with retina for example" + UPLOAD_LIMIT: "File upload limit" + UPLOAD_LIMIT_HELP: "Set maximum upload size in bytes (0 is unlimited)" + ENABLE_MEDIA_TIMESTAMP: "Enable timestamps on media" + ENABLE_MEDIA_TIMESTAMP_HELP: "Appends a timestamp based on last modified date to each media item" + SESSION: "Session" + SESSION_ENABLED_HELP: "Enable session support within Grav" + TIMEOUT: "Timeout" + TIMEOUT_HELP: "Sets the session timeout in seconds" + SESSION_NAME_HELP: "An identifier used to form the name of the session cookie" + ABSOLUTE_URLS: "Absolute URLs" + ABSOLUTE_URLS_HELP: "Absolute or relative URLs for `base_url`" + PARAMETER_SEPARATOR: "Parameter separator" + PARAMETER_SEPARATOR_HELP: "Separater for passed parameters that can be changed for Apache on Windows" + TASK_COMPLETED: "Tarea completada" + EVERYTHING_UP_TO_DATE: "Todo está actualizado" + UPDATES_ARE_AVAILABLE: "hay actualizaciones disponibles" + IS_AVAILABLE_FOR_UPDATE: "está disponible para su actualización" + IS_NOW_AVAILABLE: "está ahora disponible" + CURRENT: "Actual" + UPDATE_GRAV_NOW: "Actualizadr Grav Ahora" + GRAV_SYMBOLICALLY_LINKED: "Grav está symbolicamente vinculado. No podrá ser actualizado" + UPDATING_PLEASE_WAIT: "Actualizado... por favor espere, descargando" + OF_THIS: "de esta" + OF_YOUR: "de su" + HAVE_AN_UPDATE_AVAILABLE: "Tiene una actualización disponible" + SAVE_AS: "Guardar como" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: "¿Está seguro que desea borrar esta página y todos sus subpaginas? Si la página está traducida en otros idiomas, esas traducciones se mantendrán y se deberán eliminar por separado. De lo contrario se borrará la carpeta de esta página junto con sus subpáginas. Esta acción no se puede deshacer." + AND: "y" + UPDATE_AVAILABLE: "Actualización disponible" + METADATA_KEY: "Key (e.g. 'Palabra clave')" + METADATA_VALUE: "Valor (e.g. 'Blog, Grav')" + USERNAME_HELP: "El nombre de usuario debe tener entre 3 y 16, incluyendo letras en minúsculas, números, guiones bajos y guiones. Las mayusculas, espacios y careacteres especiales no están permitidos" + FULLY_UPDATED: "Totalmente Actualizado" + SAVE_LOCATION: "Guardar ubicación" + PAGE_FILE: "Archivo página" + PAGE_FILE_HELP: "Nombre de archivo de página, y por defecto la plantilla de visualización de esta página" + NO_USER_ACCOUNTS: "No se encuentraron cuentas de usuario, por favor crear una..." + REDIRECT_TRAILING_SLASH: "Redirigir barra final" + REDIRECT_TRAILING_SLASH_HELP: "Realice una redirección 301 en lugar de manejo transparente barra final" + PLUGIN_STATUS: "Estado plugin" + +it: + PLUGIN_ADMIN: + ADMIN_BETA_MSG: "Questa è una versione beta! Usare in produzione a proprio rischio e pericolo…" + ADMIN_REPORT_ISSUE: "Trovato un problema? Per favore, apri un ticket su GitHub" + EMAIL_FOOTER: "Powered by Grav - The Modern Flat File CMS" + LOGIN_BTN_SEND_INSTRUCTIONS: "Invia istruzioni di reset" + LOGIN_LOGGED_IN: "Login effettuato con successo" + LOGIN_FAILED: "Login fallito" + LOGGED_OUT: "Sei stato disconnesso" + RESET_LINK_EXPIRED: "Il link di reset è scaduto, ritenta per favore" + RESET_PASSWORD_RESET: "La password è stata resettata" + RESET_INVALID_LINK: "Il link di reset non è valido, ritenta per favore" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Le istruzioni per resettare la password sono state inviate via email a %s" + FORGOT_FAILED_TO_EMAIL: "Invio della email fallito, per favore ritenta più tardi" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Impossibile resettare la password per %s, nessun indirizzo email impostato" + FORGOT_USERNAME_DOES_NOT_EXIST: "L'utente con username %s non esiste" + FORGOT_EMAIL_NOT_CONFIGURED: "Impossibile resettare la password. Il sito non è configurato per inviare email" + FORGOT_EMAIL_SUBJECT: "%s Richiesta di reset password" + FORGOT_EMAIL_BODY: "

Reset password

Caro %1$s,

Una richiesta di reset password è stata effettuata su %4$s.


Clicca qui per resettare la tua password

In alternativa, copia il seguente URL nella barra indirizzi del tuo browser:

%2$s


Cordiali saluti,

%3$s

" + LOGIN_BTN: "Login" + LOGIN_BTN_FORGOT: "Reset password" + LOGIN_BTN_RESET: "Resetta la password" + MANAGE_PAGES: "Gestione Pagine" + CONFIGURATION: "Settaggi" + PAGES: "Pagine" + PLUGINS: "Plugin" + PLUGIN: "Plugin" + THEMES: "Temi" + LOGOUT: "Logout" + BACK: "Indietro" + ADD_PAGE: "Aggiungi Pagina" + ADD_MODULAR: "Aggiungi Modular" + MOVE: "Sposta" + DELETE: "Elimina" + SAVE: "Salva" + NORMAL: "Normale" + EXPERT: "Esperto" + EXPAND_ALL: "Espandi tutto" + COLLAPSE_ALL: "Comprimi tutto" + ERROR: "Errore" + CLOSE: "Chiudi" + CANCEL: "Cancella" + CONTINUE: "Continua" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "Conferma richiesta" + MODAL_CHANGED_DETECTED_TITLE: "Rilevate modifiche" + MODAL_CHANGED_DETECTED_DESC: "Vi sono cambiamenti non salvati. Sicuro di voler lasciare la pagina senza salvare?" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Conferma richiesta" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Sicuro di voler eliminare questo file? Questa azione non può essere annullata." + ADD_FILTERS: "Aggiungi filtro" + SEARCH_PAGES: "Cerca pagine" + VERSION: "Versione" + WAS_MADE_WITH: "Prodotta con il" + BY: "Da" + UPDATE_THEME: "Aggiorna tema" + OF_THIS_THEME_IS_NOW_AVAILABLE: "di questo tema è ora disponibile" + AUTHOR: "Autore" + HOMEPAGE: "Homepage" + DEMO: "Demo" + BUG_TRACKER: "Bug Tracker" + KEYWORDS: "Parole chiave" + LICENSE: "Licenza" + DESCRIPTION: "Descrizione" + README: "Readme" + REMOVE_THEME: "Rimuovo tema" + INSTALL_THEME: "Installa tema" + THEME: "Tema" + BACK_TO_THEMES: "Torna ai temi" + BACK_TO_PLUGINS: "Torna ai plugin" + CHECK_FOR_UPDATES: "Controlla aggiornamenti" + ADD: "Aggiungi" + CLEAR_CACHE: "Pulisci cache" + CLEAR_CACHE_ALL_CACHE: "Tutta la cache" + CLEAR_CACHE_ASSETS_ONLY: "Solo asset" + CLEAR_CACHE_IMAGES_ONLY: "Solo immagini" + CLEAR_CACHE_CACHE_ONLY: "Solo cache" + DASHBOARD: "Dashboard" + UPDATES_AVAILABLE: "Aggiornamenti disponibili" + DAYS: "Giorni" + UPDATE: "Aggiorna" + BACKUP: "Backup" + STATISTICS: "Statistiche" + TODAY: "Oggi" + WEEK: "Settimana" + MONTH: "Mese" + LATEST_PAGE_UPDATES: "Ultimi aggiornamenti pagine" + MAINTENANCE: "Manutenzione" + UPDATED: "Aggiornato" + MON: "Lun" + TUE: "Mar" + WED: "Mer" + THU: "Gio" + FRI: "Ven" + SAT: "Sab" + SUN: "Dom" + COPY: "Copia" + EDIT: "Modifica" + CREATE: "Crea" + GRAV_ADMIN: "Grav Admin" + GRAV_OFFICIAL_PLUGIN: "Plugin Ufficiale Grav" + GRAV_OFFICIAL_THEME: "Tema Ufficiale Grav" + PLUGIN_SYMBOLICALLY_LINKED: "Questo plugin ha un link simbolico. Gli aggiornamenti non possono essere installati da qui" + THEME_SYMBOLICALLY_LINKED: "Questo tema ha un link simbolico. Gli aggiornamenti non possono essere installati da qui" + REMOVE_PLUGIN: "Rimuovi Plugin" + INSTALL_PLUGIN: "Installa Plugin" + AVAILABLE: "Disponibile" + INSTALLED: "Installato" + INSTALL: "Installa" + ACTIVE_THEME: "Tema attivo" + SWITCHING_TO: "Passare a" + SWITCHING_TO_DESCRIPTION: "Cambiando il tema, non è garantito che tutti i layout di pagina siano supportati, potenzialmente causando errori quando si tenta di caricare tali pagine." + SWITCHING_TO_CONFIRMATION: "Vuoi continuare e passare al tema" + CREATE_NEW_USER: "Crea nuovo utente" + REMOVE_USER: "Rimuovi utente" + ACCESS_DENIED: "Accesso negato" + ACCOUNT_NOT_ADMIN: "il tuo account non ha permessi di amministratore" + PHP_INFO: "PHP Info" + INSTALLER: "Installazione" + AVAILABLE_THEMES: "Temi disponibili" + AVAILABLE_PLUGINS: "Plugin disponibili" + INSTALLED_THEMES: "Temi installati" + INSTALLED_PLUGINS: "Plugin installati" + BROWSE_ERROR_LOGS: "Vedi log errori" + SITE: "Sito" + INFO: "Info" + SYSTEM: "Sistema" + USER: "Utente" + ADD_ACCOUNT: "Aggiungi utente" + SWITCH_LANGUAGE: "Cambia lingua" + SUCCESSFULLY_ENABLED_PLUGIN: "Plugin abilitato con successo" + SUCCESSFULLY_DISABLED_PLUGIN: "Plugin disabilitato con successo" + SUCCESSFULLY_CHANGED_THEME: "Tema cambiato con successo" + INSTALLATION_FAILED: "Intallazione fallita" + INSTALLATION_SUCCESSFUL: "Installazione avvenuta con successo" + SUCCESSFULLY_SAVED: "Salvato con successo" + SUCCESSFULLY_COPIED: "Copiato con successo" + REORDERING_WAS_SUCCESSFUL: "Riordinato con successo" + SUCCESSFULLY_DELETED: "Eliminato con successo" + SUCCESSFULLY_SWITCHED_LANGUAGE: "Lingua cambiata con successo" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "Permissi insufficenti per l'operazione" + CACHE_CLEARED: "Cache pulita" + METHOD: "Metodo" + ERROR_CLEARING_CACHE: "Errore nella pulizia della cache" + AN_ERROR_OCCURRED: "Errore rilevato" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "Il tuo backup è pronto per il download" + DOWNLOAD_BACKUP: "Scarica backup" + PAGES_FILTERED: "Pagine filtrate" + NO_PAGE_FOUND: "Nessuna pagina trovata" + INVALID_PARAMETERS: "Parametri invalidi" + NO_FILES_SENT: "Nessun file inviato" + EXCEEDED_FILESIZE_LIMIT: "Superati i limiti di dimensione file" + UNKNOWN_ERRORS: "Errore sconosciuto" + EXCEEDED_GRAV_FILESIZE_LIMIT: "Superato il limite di upload file" + UNSUPPORTED_FILE_TYPE: "Tipo di file non supportato" + FAILED_TO_MOVE_UPLOADED_FILE: "Fallito lo spostamento del file caricato" + FILE_UPLOADED_SUCCESSFULLY: "File caricato con successo" + FILE_DELETED: "File eliminato" + FILE_COULD_NOT_BE_DELETED: "Il file non può essere eliminato" + FILE_NOT_FOUND: "File non trovato" + NO_FILE_FOUND: "Nessun file trovato" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "Grav è stato correttamente aggiornato a" + GRAV_UPDATE_FAILED: "Aggiornamento di Grav fallito" + EVERYTHING_UPDATED: "Tutto aggiornato" + UPDATES_FAILED: "Aggiornamento fallito" + AVATAR_BY: "Avatar da" + LAST_BACKUP: "Ultimo Backup" + FULL_NAME: "Nome completo" + USERNAME: "Nome utente" + EMAIL: "Email" + PASSWORD: "Password" + TITLE: "Titolo" + LANGUAGE: "Lingua" + ACCOUNT: "Account" + EMAIL_VALIDATION_MESSAGE: "Deve essere un indirizzo email valido" + PASSWORD_VALIDATION_MESSAGE: "La password deve contenere almeno un numero, una lettera maiuscola e una minuscola, ed essere lunga almeno 8 caratteri" + LANGUAGE_HELP: "Imposta la lingua preferita" + DEFAULTS: "Defaults" + SITE_TITLE: "Titolo del sito" + SITE_TITLE_PLACEHOLDER: "Titolo di tutto il sito" + SITE_TITLE_HELP: "Il titolo di default per il tuo sito, usato soprattutto dai temi" + DEFAULT_AUTHOR: "Autore predefinito" + DEFAULT_AUTHOR_HELP: "Un nome autore di default, usato dai temi o dal contenuto delle pagine" + DEFAULT_EMAIL: "Email predefinita" + DEFAULT_EMAIL_HELP: "Una email predefinita, usata dal tema o dalle pagine" + TAXONOMY_TYPES: "Tassonomie" + TAXONOMY_TYPES_HELP: "Le tassonomie devono essere definite qui per essere utilizzate nelle pagine" + PAGE_SUMMARY: "Sommario pagina" + ENABLED: "Abilitato" + ENABLED_HELP: "Abilita il sommario pagina (il sommario viene preso dal contenuto della pagina)" + 'YES': "Si" + 'NO': "No" + SUMMARY_SIZE: "Dimensione del sommario" + SUMMARY_SIZE_HELP: "Il numero di caratteri del contenuto della pagina da usare come sommario" + FORMAT: "Formato" + FORMAT_HELP: "corto = usa la prima occorrenza di un delimitatore o strings; lungo = il delimitatore di sommario verrà ignorato" + SHORT: "Corto" + LONG: "Lungo" + DELIMITER: "Delimitatore" + DELIMITER_HELP: "Il delimitatore di sommario (default '===')" + METADATA: "Metadata" + METADATA_HELP: "I valori metadata di default che saranno mostrati in ogni pagina se non vi è un override nella pagina" + NAME: "Nome" + CONTENT: "Contenuto" + REDIRECTS_AND_ROUTES: "Redirect & Route" + CUSTOM_REDIRECTS: "Redirect custom" + CUSTOM_REDIRECTS_HELP: "route impostate per redirigere gli alias indicati verso altre pagine. Regex accettate." + CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/il-tuo/alias" + CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/il-tuo/redirect" + CUSTOM_ROUTES: "Route custom" + CUSTOM_ROUTES_HELP: "route impostate per essere alias di altre pagine. Regex accettate." + CUSTOM_ROUTES_PLACEHOLDER_KEY: "/il-tuo/alias" + CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/la-tua/route" + FILE_STREAMS: "File Streams" + PAGE_MEDIA: "Media della pagina" + OPTIONS: "Opzioni" + PUBLISHED: "Pubblicato" + PUBLISHED_HELP: "Per default una pagina è pubblicata a meno che sia esplicitamente impostata published: false o con una publish_date settata nel futuro, oppure unpublish_date settata nel passato." + DATE: "Data" + DATE_HELP: "La variabile data permette di specificare una data associata alla pagina" + PUBLISHED_DATE: "Data di pubblicazione" + PUBLISHED_DATE_HELP: "Può fornire una data di pubblicazione automatica della pagina" + UNPUBLISHED_DATE: "Data di rimozione pubblicazione" + UNPUBLISHED_DATE_HELP: "Può fornire una data di rimozione della pubblicazione automatica della pagina" + ROBOTS: "Robot" + TAXONOMIES: "Tassonomie" + TAXONOMY: "Tassonomia" + ADVANCED: "Avanzati" + SETTINGS: "Settaggi" + FOLDER_NUMERIC_PREFIX: "Prefisso numerico della cartella" + FOLDER_NUMERIC_PREFIX_HELP: "Prefisso numerico che fornisce ordinamento manuale ed implica visibilità" + FOLDER_NAME: "Nome Cartella" + FOLDER_NAME_HELP: "Il nome della cartella che sarà memorizzato nel filesystem per questa pagina" + PARENT: "Padre" + DEFAULT_OPTION_ROOT: "- Root -" + DEFAULT_OPTION_SELECT: "- Seleziona -" + DISPLAY_TEMPLATE: "Template di visualizzazione" + DISPLAY_TEMPLATE_HELP: "Il tipo di pagina si traduce in quale template Twig genera la pagina" + BODY_CLASSES: "Classi body" + ORDERING: "Ordinamento" + PAGE_ORDER: "Ordine pagina" + OVERRIDES: "Override" + MENU: "Menu" + MENU_HELP: "La stringa da usare nel menu. Se non impostato viene usato il titolo" + SLUG: "Slug" + SLUG_HELP: "La variabile slug permette di specificare la porzione di URL associato alla pagina" + SLUG_VALIDATE_MESSAGE: "Lo slug deve contenere solo caratteri alfanumerici minuscoli o trattini" + PROCESS: "Processa" + PROCESS_HELP: "Controlla come sono processate le pagine. Può essere impostato per pagina anzichè globale" + DEFAULT_CHILD_TYPE: "Child Type di default" + USE_GLOBAL: "Usa globali" + ROUTABLE: "Routabile" + ROUTABLE_HELP: "Se questa pagina è raggiungibile tramite URL" + CACHING: "Caching" + VISIBLE: "Visibile" + VISIBLE_HELP: "Determina se una pagina è visible nella navigazione" + DISABLED: "Disabilitata" + ITEMS: "Elementi" + ORDER_BY: "Ordina per" + FOLDER: "Cartella" + DEFAULT: "Default" + ORDER: "Ordine" + ASCENDING: "Ascendente" + DESCENDING: "Discendente" + ADD_MODULAR_CONTENT: "Aggiungi contenuto modulare" + PAGE_TITLE: "Titolo pagina" + PAGE_TITLE_HELP: "Il titolo della pagina" + PAGE: "Pagina" + MODULAR_TEMPLATE: "Template modulare" + FRONTMATTER: "Frontmatter" + FILENAME: "Nome del file" + PARENT_PAGE: "Pagina padre" + HOME_PAGE: "Home page" + HOME_PAGE_HELP: "La pagina che Grav userà come pagina landing di default" + DEFAULT_THEME: "Tema di default" + DEFAULT_THEME_HELP: "Imposta il tema di default utilizzato da Grav (il predefinito è Antimatter)" + TIMEZONE: "Fuso orario" + TIMEZONE_HELP: "Sovrascrivi il fuso orario predefinito del server" + SHORT_DATE_FORMAT: "Formato di data corto" + SHORT_DATE_FORMAT_HELP: "Imposta il formato di data corto che può essere usato dai temi" + LONG_DATE_FORMAT: "Formato di data lungo" + LONG_DATE_FORMAT_HELP: "Imposta il formato di data lungo che può essere usato dai temi" + DEFAULT_ORDERING: "Ordine predefinito" + DEFAULT_ORDERING_HELP: "Le pagine in una lista saranno disposte in questo ordine a meno che sia sovrascritto" + DEFAULT_ORDERING_DEFAULT: "Predefinito - basato sul nome della cartella" + DEFAULT_ORDERING_FOLDER: "Cartella - basato su nome della cartella senza prefisso" + DEFAULT_ORDERING_TITLE: "Titolo - basato sul campo titolo nell'intestazione della pagina" + DEFAULT_ORDERING_DATE: "Data - basato sul campo 'date' nell'intestazione della pagina" + DEFAULT_ORDER_DIRECTION: "Direzione ordinamento predefinita" + DEFAULT_ORDER_DIRECTION_HELP: "La direzione dell'ordine delle pagine in una lista" + DEFAULT_PAGE_COUNT: "Numero di pagine predefinito" + DEFAULT_PAGE_COUNT_HELP: "Il numero massimo predefinito di pagine elencate in una lista" + DATE_BASED_PUBLISHING: "Pubblicazione basata sulla data" + DATE_BASED_PUBLISHING_HELP: "Rimuovi dalla pubblicazione automaticamente i post in base alla data" + EVENTS: "Eventi" + EVENTS_HELP: "Abilita o disabilita specifici eventi. Disabitando questo campo può causare problemi nei plugin" + REDIRECT_DEFAULT_ROUTE: "Redirect alla route predefinita" + REDIRECT_DEFAULT_ROUTE_HELP: "Esegui il redirect automatico di una pagina verso la sua route predefinita" + LANGUAGES: "Linguaggi" + SUPPORTED: "Supportati" + SUPPORTED_HELP: "Lista separata da virgole dei codici di linguaggio a 2 caratteri supportati (ad esempio en,fr,de)" + TRANSLATIONS_ENABLED: "Abilita traduzioni" + TRANSLATIONS_ENABLED_HELP: "Supporta le traduzioni in Grav, plugin e temi" + TRANSLATIONS_FALLBACK: "Fallback delle traduzioni" + TRANSLATIONS_FALLBACK_HELP: "Esegui il fallback delle traduzioni se la lingua attiva non ha una traduzione disponibile" + ACTIVE_LANGUAGE_IN_SESSION: "Linguaggio attivo nella sessione" + ACTIVE_LANGUAGE_IN_SESSION_HELP: "Memorizza il linguaggio attivo nella sessione" + HTTP_HEADERS: "Intestazioni HTTP" + EXPIRES: "Expires" + EXPIRES_HELP: "Imposta l'header expires. Il valore è espresso in secondi" + LAST_MODIFIED: "Last modified" + LAST_MODIFIED_HELP: "Imposta l'header di ultima modifica che può aiutare ad ottimizzare caching proxy e browser" + ETAG: "ETag" + ETAG_HELP: "Imposta l'header etag per aiutare ad identificare quanto è stata modificata una pagina" + VARY_ACCEPT_ENCODING: "Vary accept encoding" + VARY_ACCEPT_ENCODING_HELP: "Imposta l'header `Vary: Accept Encoding` per aiutare con caching proxy e CDN" + MARKDOWN_EXTRA_HELP: "Abilita il supporto predefinito per Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" + AUTO_LINE_BREAKS: "Line break automatici" + AUTO_LINE_BREAKS_HELP: "Abilita il supporto per nuove linee automatiche in markdown" + AUTO_URL_LINKS: "Link URL automatici" + AUTO_URL_LINKS_HELP: "Abilita la conversione automatica di URL in link HTML" + ESCAPE_MARKUP: "Escape del markup" + ESCAPE_MARKUP_HELP: "Abilita l'escape automatico di tags di markup in entità HTML" + CACHING_HELP: "Switch globale per abilitare o disabilitare la cache di Grav" + CACHE_CHECK_METHOD: "Metodo controllo cache" + CACHE_CHECK_METHOD_HELP: "Seleziona il metodo usato da Grav per controllare che i file di una pagina siano stati modificati" + CACHE_DRIVER: "Driver di cache" + CACHE_DRIVER_HELP: "Scegli quale driver di cache deve essere usato da Grav. 'Auto Detect' troverà il migliore automaticamente" + CACHE_PREFIX: "Prefisso cache" + CACHE_PREFIX_HELP: "Un identificatore per parte della chiave cache di Grav. Non cambiare a meno di essere sicuri di quello che si sta facendo" + CACHE_PREFIX_PLACEHOLDER: "Derivato dal base URL (sovrascrivere con una stringa random)" + LIFETIME: "Scadenza" + LIFETIME_HELP: "Imposta la scadenza della cache in secondi. 0 = infinita" + GZIP_COMPRESSION: "Compressione GZip" + GZIP_COMPRESSION_HELP: "Abilita la compressione GZip per incrementare la performance della pagina" + TWIG_TEMPLATING: "Template Twig" + TWIG_CACHING: "Cache di Twig" + TWIG_CACHING_HELP: "Controlla il sistema di caching di Twig. Abilitare per una migliore prestazione" + TWIG_DEBUG: "Twig debug" + TWIG_DEBUG_HELP: "Abilita o meno l'estensione Debugger di Twig" + DETECT_CHANGES: "Rileva cambiamenti" + DETECT_CHANGES_HELP: "Ricompila automaticamente la cache Twig se vengono rilevati cambiamenti nei template Twig" + AUTOESCAPE_VARIABLES: "Autoescape variabili" + AUTOESCAPE_VARIABLES_HELP: "Autoescape tutte le variabili. Questo potrebbe facilmente causare errori nel sito" + ASSETS: "Asset" + CSS_PIPELINE: "CSS pipeline" + CSS_PIPELINE_HELP: "La pipeline CSS è l'unificazione di più file CSS in uno solo" + CSS_MINIFY: "Minify CSS" + CSS_MINIFY_HELP: "Minify il CSS durante il pipelining" + CSS_MINIFY_WINDOWS_OVERRIDE: "Override CSS minify su Windows" + CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Override minify su piattaforma Windows. Falso di default a causa di ThreadStackSize" + CSS_REWRITE: "Riscrivi URL CSS" + CSS_REWRITE_HELP: "Riscrivi tutti gli URL relativi contenuti nei file CSS durante il pipelining" + JAVASCRIPT_PIPELINE: "JavaScript pipeline" + JAVASCRIPT_PIPELINE_HELP: "La pipeline di JavaScript è l'unificazione di più file JS in uno solo" + JAVASCRIPT_MINIFY: "Minify JavaScript" + JAVASCRIPT_MINIFY_HELP: "Attiva il minify di JavaScript durante il pipelining" + ENABLED_TIMESTAMPS_ON_ASSETS: "Abilita timestamp sugli asset" + ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Abilita timestamp sugli asset" + COLLECTIONS: "Collezioni" + ERROR_HANDLER: "Gestione degli errori" + DISPLAY_ERRORS: "Mostra errori" + DISPLAY_ERRORS_HELP: "Mostra l'output completo degli errori" + LOG_ERRORS: "Log errori" + LOG_ERRORS_HELP: "Logga gli errori nella cartella /logs" + DEBUGGER: "Debugger" + DEBUGGER_HELP: "Abilita il debugger di Grav ed i seguenti settaggi" + DEBUG_TWIG: "Debug Twig" + DEBUG_TWIG_HELP: "Abilita il debug dei template Twig" + SHUTDOWN_CLOSE_CONNECTION: "Chiudi la connessione in onShutdown" + SHUTDOWN_CLOSE_CONNECTION_HELP: "Chiudi la connessione prima di chiamare onShutdown(). Disabilita in fase di debug." + DEFAULT_IMAGE_QUALITY: "Qualità delle immagini predefinita" + DEFAULT_IMAGE_QUALITY_HELP: "La qualità predefinita per le immagini, utilizzata durante resampling o caching delle immagini (85%)" + CACHE_ALL: "Attiva la cache su tutte le immagini" + CACHE_ALL_HELP: "Attiva la cache su tutte le immagini, anche quelle che non subiscono manipolazioni da parte di Grav" + IMAGES_DEBUG: "Debug immagini" + IMAGES_DEBUG_HELP: "Mostra un overlay sopra le immagini riportante ad esempio la densità di pixel" + UPLOAD_LIMIT: "Limite di upload dei file" + UPLOAD_LIMIT_HELP: "Imposta la dimensione di massimo upload dei file, in byte (0 = illimitato)" + ENABLE_MEDIA_TIMESTAMP: "Abilita timestamps sui media" + ENABLE_MEDIA_TIMESTAMP_HELP: "Aggiunge un identificativo basato sulla data di ultima modifica di ogni media file" + SESSION: "Sessione" + SESSION_ENABLED_HELP: "Abilita il supporto alle sessioni in Grav" + TIMEOUT: "Timeout" + TIMEOUT_HELP: "Imposta il timeout di sessione, espresso in secondi" + SESSION_NAME_HELP: "Indentificatore usato per formare il nome del cookie di sessione" + ABSOLUTE_URLS: "URL assoluti" + ABSOLUTE_URLS_HELP: "URL assoluti o relativi per `base_url`" + PARAMETER_SEPARATOR: "Separatore dei parametri" + PARAMETER_SEPARATOR_HELP: "Separatore dei parametri passati, che può essere cambiato per Apache su Windows" + TASK_COMPLETED: "Operazione completata" + EVERYTHING_UP_TO_DATE: "Tutto aggiornato" + UPDATES_ARE_AVAILABLE: "aggiornamenti disponibili" + IS_AVAILABLE_FOR_UPDATE: "è disponibile per aggiornamento" + IS_NOW_AVAILABLE: "è ora disponibile" + CURRENT: "Corrente" + UPDATE_GRAV_NOW: "Aggiorna Grav adesso" + GRAV_SYMBOLICALLY_LINKED: "Grav è linkato simbolicamente, non è possibile aggiornare da qui" + UPDATING_PLEASE_WAIT: "Aggiornando... attendi per favore, sto scaricando" + OF_THIS: "di questo" + OF_YOUR: "del tuo" + HAVE_AN_UPDATE_AVAILABLE: "ha un aggiornamento disponibile" + SAVE_AS: "Salva come" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: "Sicuro di voler cancellare questa pagina? Se la pagina è tradotta in altre lingue, tali lingue verranno preservate e dovranno essere cancellate a parte. Altrimenti verrà cancellata la pagina e tutte le sottopagine. Questa azione non può essere annullata." + AND: "e" + UPDATE_AVAILABLE: "Aggiornamento disponibile" + METADATA_KEY: "Key (e.g. 'Keywords')" + METADATA_VALUE: "Value (e.g. 'Blog, Grav')" + USERNAME_HELP: "Il nome utente deve essere compreso tra 3 e 16 caratteri, composti da lettere minuscole, numeri, trattini o il carattere di sottolineatura. Lettere maiuscole, spazi e caratteri speciali non sono consentiti" + FULLY_UPDATED: "Tutto aggiornato" + SAVE_LOCATION: "Salvato in" + PAGE_FILE: "Pagina File" + PAGE_FILE_HELP: "Nome pagina per il file e visualizza come template predefinita per questa pagina" + NO_USER_ACCOUNTS: "Nessun utente trovato, per cortesia creane uno prima..." + REDIRECT_TRAILING_SLASH: "Redirect trailing slash" + REDIRECT_TRAILING_SLASH_HELP: "Eseguire un redirect 301 piuttosto che utilizzare la gestione delle URI." + DEFAULT_DATE_FORMAT: "Formato data pagina" + DEFAULT_DATE_FORMAT_HELP: "Formato data della pagina utilizzata da Grav. Come impostazione predefinita Grav cerca di utilizzare il tuo formato data, oppure puoi utilizzare un formato personalizzato seguendo la sintassi di PHP (esempio: Y-m-d H:i)" + DEFAULT_DATE_FORMAT_PLACEHOLDER: "Rileva automaticamente se vuoto" + IGNORE_FILES: "Ignora i files" + IGNORE_FILES_HELP: "Files da ignorare quando le pagine vengono processate" + IGNORE_FOLDERS: "Ignora le cartelle" + IGNORE_FOLDERS_HELP: "Cartelle ignorate quando le pagine vengono processate" + HTTP_ACCEPT_LANGUAGE: "Importa la lingua dal Browser" + HTTP_ACCEPT_LANGUAGE_HELP: "Si può scegliere di tentare di impostare la lingua sulla base del tag utilizzato in `http_accept_language` nel browser" + OVERRIDE_LOCALE: "Sovrascrivi locale" + OVERRIDE_LOCALE_HELP: "Sovrascrivi l'impostazione locale in PHP basato sulla tua lingua corrente" + REDIRECT: "Pagina di reindirizzamento" + REDIRECT_HELP: "Inserisci la route alla pagina oppure un URL esterno per questa pagina. Esempio: `/some/route` or `http://somesite.com`" + PLUGIN_STATUS: "Stato plugin" + +de: + PLUGIN_ADMIN: + ADMIN_BETA_MSG: "Dies ist eine Beta-Version! Benutzung auf eigene Gefahr..." + ADMIN_REPORT_ISSUE: "Fehler gefunden? Bitte melden Sie ihn auf GitHub." + EMAIL_FOOTER: "Powered by Grav - The Modern Flat File CMS" + LOGIN_BTN: "Login" + LOGIN_BTN_FORGOT: "Passwort vergessen" + LOGIN_BTN_RESET: "Passwort zurücksetzen" + LOGIN_BTN_SEND_INSTRUCTIONS: "Neues Passwort anfordern" + LOGIN_LOGGED_IN: "Anmeldung erfolgreich" + LOGIN_FAILED: "Anmeldung fehlgeschlagen" + LOGGED_OUT: "Sie wurden abgemeldet" + RESET_LINK_EXPIRED: "Der Link zum Zurücksetzen Ihres Passwortes ist abgelaufen, bitte probieren Sie es erneut" + RESET_PASSWORD_RESET: "Das Passwort wurde zurückgesetzt" + RESET_INVALID_LINK: "Der Link zum Zurücksetzen Ihres Passwortes ist ungültig, bitte probieren Sie es erneut" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Anweisungen zum Zurücksetzen des Passwortes wurden an %s gesendet" + FORGOT_FAILED_TO_EMAIL: "Anweisungen zum Zurücksetzen des Passwortes konnten nicht versendet werden, bitte probieren Sie es erneut" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Das Passwort für %s kann nicht geändert werden, da keine E-Mail-Adresse hinterlegt ist" + FORGOT_USERNAME_DOES_NOT_EXIST: "Es existiert kein Benutzer mit dem Namen %s" + FORGOT_EMAIL_NOT_CONFIGURED: "Passwort konnte nicht zurückgesetzt werden, da diese Seite nicht zum Versenden von E-Mails konfiguriert worden ist" + FORGOT_EMAIL_SUBJECT: "Zurücksetzen des Passwortes von %s" + FORGOT_EMAIL_BODY: "

Passwort zurücksetzen

Hallo %1$s,

Auf %4$s wurde die Zurücksetzung Ihres Passwortes angefordert.


Klicken Sie hier um Ihr Passwort zurückzusetzen.

Alternativ können Sie auch die folgende Adresse in die Adresszeile Ihres Browsers kopieren:

%2$s


Viele Grüße,

%3$s

" + MANAGE_PAGES: "Seiten verwalten" + CONFIGURATION: "Konfiguration" + PAGES: "Seiten" + PLUGINS: "Plugins" + PLUGIN: "Plugin" + THEMES: "Themes" + LOGOUT: "Logout" + BACK: "Zurück" + ADD_PAGE: "Seite hinzufügen" + ADD_MODULAR: "Modulare Seite hinzufügen" + MOVE: "Verschieben" + DELETE: "Löschen" + SAVE: "Speichern" + NORMAL: "Normal" + EXPERT: "Expertenansicht" + EXPAND_ALL: "Alle ausklappen" + COLLAPSE_ALL: "Alle einklappen" + ERROR: "Fehler" + CLOSE: "Schließen" + CANCEL: "Abbrechen" + CONTINUE: "Weiter" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "Bestätigung erforderlich" + MODAL_CHANGED_DETECTED_TITLE: "Änderungen erkannt" + MODAL_CHANGED_DETECTED_DESC: "Einige Änderungen wurden noch nicht gespeichert. Wollen Sie diese Seite wirklich verlassen?" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Bestätigung erforderlich" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Wollen Sie diese Datei wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden." + ADD_FILTERS: "Filter hinzufügen" + SEARCH_PAGES: "Seiten durchsuchen" + VERSION: "Version" + WAS_MADE_WITH: "Erstellt mit" + BY: "Von" + UPDATE_THEME: "Update Theme" + UPDATE_PLUGIN: "Update Plugin" + OF_THIS_THEME_IS_NOW_AVAILABLE: "dieses Themes ist verfügbar" + OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "dieses Plugins ist verfügbar" + AUTHOR: "Autor" + HOMEPAGE: "Homepage" + DEMO: "Demo" + BUG_TRACKER: "Bug Tracker" + KEYWORDS: "Schlagwörter" + LICENSE: "Lizenz" + DESCRIPTION: "Beschreibung" + README: "Readme" + REMOVE_THEME: "Theme löschen" + INSTALL_THEME: "Theme installieren" + THEME: "Theme" + BACK_TO_THEMES: "Zurück zu den Themes" + BACK_TO_PLUGINS: "Zurück zu den Plugins" + CHECK_FOR_UPDATES: "Updates suchen" + ADD: "Hinzufügen" + CLEAR_CACHE: "Cache leeren" + CLEAR_CACHE_ALL_CACHE: "Alle Caches" + CLEAR_CACHE_ASSETS_ONLY: "Nur Assets" + CLEAR_CACHE_IMAGES_ONLY: "Nur Bilder" + CLEAR_CACHE_CACHE_ONLY: "Nur Cache" + DASHBOARD: "Dashboard" + UPDATES_AVAILABLE: "Updates verfügbar" + DAYS: "Tage" + UPDATE: "Update" + BACKUP: "Backup" + STATISTICS: "Statistik" + TODAY: "Heute" + WEEK: "Woche" + MONTH: "Monat" + LATEST_PAGE_UPDATES: "Zuletzt bearbeitete Seiten" + MAINTENANCE: "Wartung" + UPDATED: "Aktualisiert" + MON: "Mo" + TUE: "Di" + WED: "Mi" + THU: "Do" + FRI: "Fr" + SAT: "Sa" + SUN: "So" + COPY: "Kopieren" + EDIT: "Bearbeiten" + CREATE: "Erstellen" + GRAV_ADMIN: "Grav Admin" + GRAV_OFFICIAL_PLUGIN: "Offizielles Grav Plugin" + GRAV_OFFICIAL_THEME: "Offizieller Grav Theme" + PLUGIN_SYMBOLICALLY_LINKED: "Dieses Plugin basiert auf einer symbolischen Verknüpfung. Updates werden daher nicht erkannt." + THEME_SYMBOLICALLY_LINKED: "Dieser Theme basiert auf einer symbolischen Verknüpfung. Updates werden daher nicht erkannt." + REMOVE_PLUGIN: "Plugin entfernen" + INSTALL_PLUGIN: "Plugin installieren" + AVAILABLE: "Verfügbar" + INSTALLED: "Installiert" + INSTALL: "Installieren" + ACTIVE_THEME: "Ausgewählter Theme" + SWITCHING_TO: "Wechseln zu" + SWITCHING_TO_DESCRIPTION: "Durch das Wechseln des Themes kann nicht garantiert werden, dass das Layout aller Seiten unterstützt wird. Daher können beim Aufrufen der Seiten Fehler entstehen." + SWITCHING_TO_CONFIRMATION: "Fortfahren und Theme wechseln" + CREATE_NEW_USER: "Neuen Benutzer erstellen" + REMOVE_USER: "Benutzer entfernen" + ACCESS_DENIED: "Zugriff verweigert" + ACCOUNT_NOT_ADMIN: "Ihr Account verfügt über keine Administrationsberechtigungen" + PHP_INFO: "PHP Info" + INSTALLER: "Installer" + AVAILABLE_THEMES: "Verfügbare Themes" + AVAILABLE_PLUGINS: "Verfügbare Plugins" + INSTALLED_THEMES: "Installierte Themes" + INSTALLED_PLUGINS: "Installierte Plugins" + BROWSE_ERROR_LOGS: "Error Logs anzeigen" + SITE: "Seite" + INFO: "Info" + SYSTEM: "System" + USER: "Benutzer" + ADD_ACCOUNT: "Benutzer hinzufügen" + SWITCH_LANGUAGE: "Sprache wechseln" + SUCCESSFULLY_ENABLED_PLUGIN: "Plugin erfolgreich aktiviert" + SUCCESSFULLY_DISABLED_PLUGIN: "Plugin erfolgreich deaktiviert" + SUCCESSFULLY_CHANGED_THEME: "Standard Theme erfolgreich geändert" + INSTALLATION_FAILED: "Installation fehlgeschlagen" + INSTALLATION_SUCCESSFUL: "Installation erfolgreich" + SUCCESSFULLY_SAVED: "Speichern erfolgreich" + SUCCESSFULLY_COPIED: "Kopieren erfolgreich" + REORDERING_WAS_SUCCESSFUL: "Neuanordnung erfolgreich" + SUCCESSFULLY_DELETED: "Erfolgreich gelöscht" + SUCCESSFULLY_SWITCHED_LANGUAGE: "Sprache erfolgreich gewechselt" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "Sie haben nicht ausreichende Berechtigungen für diese Aktion" + CACHE_CLEARED: "Cache geleert" + METHOD: "Methode" + ERROR_CLEARING_CACHE: "Fehler beim leeren des Cache" + AN_ERROR_OCCURRED: "Ein Fehler ist aufgetreten" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "Ihr Backup steht zum Download bereit" + DOWNLOAD_BACKUP: "Backup herunterladen" + PAGES_FILTERED: "Seiten sortiert" + NO_PAGE_FOUND: "Keine Seite gefunden" + INVALID_PARAMETERS: "Ungültige Eingabe" + NO_FILES_SENT: "Keine Dateien übertragen" + EXCEEDED_FILESIZE_LIMIT: "Maximale Dateigröße überschritten" + UNKNOWN_ERRORS: "Unbekannte Fehler" + EXCEEDED_GRAV_FILESIZSE_LIMIT: "Maximale Grav Dateigröße überschritten." + UNSUPPORTED_FILE_TYPE: "Dateityp nicht unterstützt" + FAILED_TO_MOVE_UPLOADED_FILE: "Hochgeladene Datei konnte nicht verschoben werden." + FILE_UPLOADED_SUCCESSFULLY: "Datei erfolgreich hochgeladen" + FILE_DELETED: "Datei gelöscht" + FILE_COULD_NOT_BE_DELETED: "Datei konnte nicht gelöscht werden" + FILE_NOT_FOUND: "Datei nicht gefunden" + NO_FILE_FOUND: "Keine Datei gefunden" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "Grav wurde erfolgreich aktualisiert auf" + GRAV_UPDATE_FAILED: "Grav Update fehlgeschlagen" + EVERYTHING_UPDATED: "Alles aktualisiert" + UPDATES_FAILED: "Updates fehlgeschlagen" + AVATAR_BY: "Avatar von" + LAST_BACKUP: "Letztes Backup" + FULL_NAME: "Voller Name" + USERNAME: "Benutzername" + EMAIL: "E-Mail" + PASSWORD: "Passwort" + TITLE: "Titel" + LANGUAGE: "Sprache" + ACCOUNT: "Benutzer" + EMAIL_VALIDATION_MESSAGE: "Muss eine gültige E-Mail Adresse sein" + PASSWORD_VALIDATION_MESSAGE: "Das Passwort muss mindestens eine Zahl, einen Groß- und einen Kleinbuchstaben enthalten sowie mindestens 8 Zeichen lang sein." + LANGUAGE_HELP: "Setzen der bevorzugten Sprache" + MEDIA: "Medien" + DEFAULTS: "Standards" + SITE_TITLE: "Seitentitel" + SITE_TITLE_PLACEHOLDER: "Seitentitel" + SITE_TITLE_HELP: "Titel der Seite. Wird häufig von Themes verwendet." + DEFAULT_AUTHOR: "Hauptautor" + DEFAULT_AUTHOR_HELP: "Name des Hauptautors, häufig verwendet in Themes und Inhalten" + DEFAULT_EMAIL: "Haupt-E-Mail" + DEFAULT_EMAIL_HELP: "Standard E-Mail Adresse, die in Plugins und Themes verwendet wird" + TAXONOMY_TYPES: "Tag-Typen" + TAXONOMY_TYPES_HELP: "Wenn sie verschiedene Tag-Typen verwenden wollen, müssen Sie hier die verschiedenen Typen angeben." + PAGE_SUMMARY: "Seitenzusammenfassung" + ENABLED: "Aktiviert" + ENABLED_HELP: "Aktiviert die Seitenzusammenfasung (die Seitenzusammenfassung entspricht dem Inhalt der Seite)" + 'YES': "Ja" + 'NO': "Nein" + SUMMARY_SIZE: "Zusammenfassungslänge" + SUMMARY_SIZE_HELP: "Länge der Zusammenfassung in Buchstaben" + FORMAT: "Format" + FORMAT_HELP: "kurz = Kürzung der Zusammenfassung bis zum Trennzeichen oder der Zusammenfassungslänge; lang = Trennzeichen wird ignoriert" + SHORT: "Kurz" + LONG: "Lang" + DELIMITER: "Trennzeichen" + DELIMITER_HELP: "Das Trennzeichen für die Zusammenfassung (Standard '===')" + METADATA: "Metadaten" + METADATA_HELP: "Standardmetadaten, die auf jeder Seite angezeigt werden, es sei denn sie werden von einer Seite überschrieben" + NAME: "Name" + CONTENT: "Inhalt" + REDIRECTS_AND_ROUTES: "Weiterleitungen & Routen" + CUSTOM_REDIRECTS: "Eigene Weiterleitungen" + CUSTOM_REDIRECTS_HELP: "Routen, die auf andere Seiten weiterleiten. Standard Regex Ersetzungen sind erlaubt" + CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/your/redirect" + CUSTOM_ROUTES: "Eigene Routen" + CUSTOM_ROUTES_HELP: "Routen, die auf andere Seiten verweisen. Standard Regex Ersetzungen sind erlaubt" + CUSTOM_ROUTES_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/your/route" + FILE_STREAMS: "Datei Streams" + DEFAULT: "Standard" + PAGE_MEDIA: "Seitenmedien" + OPTIONS: "Optionen" + PUBLISHED: "Veröffentlicht" + PUBLISHED_HELP: "Standardmäßig ist eine Seite veröffentlicht, es sei denn sie wird explizit auf nicht veröffentlicht gesetzt, das Veröffentlichungsdatum liegt in der Zukunft oder das Ablaufdatum wurde erreicht." + DATE: "Datum" + DATE_HELP: "Die Datumsangabe erlaubt es diese Seite mit einem Datum zu versehen." + PUBLISHED_DATE: "Veröffentlichungsdatum" + PUBLISHED_DATE_HELP: "Datum ab dem die Seite automatisch veröffentlicht wird." + UNPUBLISHED_DATE: "Ablaufdatum" + UNPUBLISHED_DATE_HELP: "Datum ab dem die Veröffentlichung der Seite zurückgenommen wird." + ROBOTS: "Robots" + TAXONOMIES: "Tags" + TAXONOMY: "Tag" + ADVANCED: "Erweitert" + SETTINGS: "Einstellungen" + FOLDER_NUMERIC_PREFIX: "Numerischer Ordnerprefix" + FOLDER_NUMERIC_PREFIX_HELP: "Numerischer Prefix der die Reihenfolge und Sichtbarkeit der Seiten beeinflusst" + FOLDER_NAME: "Ordnername" + FOLDER_NAME_HELP: "Name des Ordners, der für diese Seite angelegt werden sollen" + PARENT: "Übergeordnet" + DEFAULT_OPTION_ROOT: "- Ursprung -" + DEFAULT_OPTION_SELECT: "- Auswählen -" + DISPLAY_TEMPLATE: "Template anzeigen" + DISPLAY_TEMPLATE_HELP: "Der Seitentyp der zur Wahl des richtigen Twig Templates verwendet wird." + BODY_CLASSES: "Body Klassen" + ORDERING: "Sortierung" + PAGE_ORDER: "Seitensortierung" + OVERRIDES: "Überschreibungen" + MENU: "Menü" + MENU_HELP: "Beschriftung zur Anzeige im Menu. Als Standard wird der Titel genutzt." + SLUG: "Slug" + SLUG_HELP: "Der Slug bestimmt den Namen der Seite innerhalb der URL." + SLUG_VALIDATE_MESSAGE: "Ein Slug darf nur auf Kleinbuchstaben und Bindestrichen bestehen" + PROCESS: "Verarbeitung" + PROCESS_HELP: "Steuert die Verarbeitung einer Seite. Sollte pro Seite und nicht global gesetzt werden." + DEFAULT_CHILD_TYPE: "Standardtyp für Unterseiten" + USE_GLOBAL: "Globale Einstellungen verwenden" + ROUTABLE: "Aufrufbar" + ROUTABLE_HELP: "Diese Seite kann mit einer URL aufgerufen werden" + CACHING: "Caching" + VISIBLE: "Sichtbar" + VISIBLE_HELP: "Steuert die Sichtbarkeit einer Seite im Menu." + DISABLED: "Deaktiviert" + ITEMS: "Items" + ORDER_BY: "Sortieren" + FOLDER: "Ordner" + ORDER: "Sortierung" + ASCENDING: "Aufsteigend" + DESCENDING: "Absteigend" + ADD_MODULAR_CONTENT: "Modularen Inhalt hinzufügen" + PAGE_TITLE: "Seitentitel" + PAGE_TITLE_HELP: "Titel der Seite" + PAGE: "Seite" + MODULAR_TEMPLATE: "Modulares Template" + FRONTMATTER: "Frontmatter" + FILENAME: "Dateiname" + PARENT_PAGE: "Übergeordnete Seite" + HOME_PAGE: "Startseite" + HOME_PAGE_HELP: "Seite die von Grav als Startseite genutzt werden soll" + DEFAULT_THEME: "Standard Theme" + DEFAULT_THEME_HELP: "Setzt den Standard Theme von Grav (Standard ist Antimatter)" + TIMEZONE: "Zeitzone" + TIMEZONE_HELP: "Überschreibt die Zeitzone des Servers" + SHORT_DATE_FORMAT: "Kurzes Datumsformat" + SHORT_DATE_FORMAT_HELP: "Setzt das von Themes genutzte Kurzdatumsformat" + LONG_DATE_FORMAT: "Langes Datumsformat" + LONG_DATE_FORMAT_HELP: "Setzt das von Themes genutzte Langdatumsformat" + DEFAULT_ORDERING: "Standard Sortierung" + DEFAULT_ORDERING_HELP: "Seiten in einer Liste werden in der Standard Sortierung angezeigt, falls diese nicht überschrieben wird." + DEFAULT_ORDERING_DEFAULT: "Standard - basierend auf dem Ordnernamen" + DEFAULT_ORDERING_FOLDER: "Ordner - basierend auf dem Ordnernamen ohne Prefix" + DEFAULT_ORDERING_TITLE: "Titel - basieren auf dem Seitentitel" + DEFAULT_ORDERING_DATE: "Datum - basierend auf dem Datum der Seite" + DEFAULT_ORDER_DIRECTION: "Standard Sortierrichtung" + DEFAULT_ORDER_DIRECTION_HELP: "Sortierrichtung von Seiten in einer Liste" + DEFAULT_PAGE_COUNT: "Standard Seitenzahl" + DEFAULT_PAGE_COUNT_HELP: "Maximale Anzahl von Seiten in einer Liste" + DATE_BASED_PUBLISHING: "Datumsbasierte Veröffentlichungen" + DATE_BASED_PUBLISHING_HELP: "Seiten mit Veröffentlichungs- und Ablaufdatum automatisch veröffentlichen oder zurückziehen" + EVENTS: "Events" + EVENTS_HELP: "Von Grav gesteuerte Events aktivieren. Ein Deaktivieren kann Plugins in ihrer Funktionsweise stören." + REDIRECT_DEFAULT_ROUTE: "Weiterleiten auf Standardroute" + REDIRECT_DEFAULT_ROUTE_HELP: "Automatisches Weiterleiten auf die Route einer Seite" + LANGUAGES: "Sprachen" + SUPPORTED: "Untersützt" + SUPPORTED_HELP: "Durch Kommata getrennte Liste mit 2-stelligen Sprachcodes (zum Beispiel 'en,fr,de')" + TRANSLATIONS_ENABLED: "Übersetzungen aktivieren" + TRANSLATIONS_ENABLED_HELP: "Aktiviert Übersetzungen in Grav, Plugins und Erweiterungen" + TRANSLATIONS_FALLBACK: "Fallbacksprache" + TRANSLATIONS_FALLBACK_HELP: "Falls Übersetzungen in einer Sprache nicht vorhanden sind, wird auf diese Sprache zurückgegriffen" + ACTIVE_LANGUAGE_IN_SESSION: "Aktive Sprache in Session speichern" + ACTIVE_LANGUAGE_IN_SESSION_HELP: "Speichert die aktive Sprache in der Sessin" + HTTP_HEADERS: "HTTP Headers" + EXPIRES: "Läuft ab" + EXPIRES_HELP: "Ändert den Expires-Header (Cache-Ablaufdatum). Angabe in Sekunden" + LAST_MODIFIED: "Zuletzt geändert" + LAST_MODIFIED_HELP: "Setzt das Datum der letzten Änderung um Caching zu optimieren" + ETAG: "ETag" + ETAG_HELP: "Setzt den ETag-Header um Änderungen der Seite für Proxies erkenntlich zu machen" + VARY_ACCEPT_ENCODING: "Vary accept encoding" + VARY_ACCEPT_ENCODING_HELP: "Setzt den `Vary: Accept Encoding`-Header um Proxies und CDNs zu optimieren" + MARKDOWN_EXTRA_HELP: "Aktiviert Markdown Extra Unterstützung - https://michelf.ca/projects/php-markdown/extra/" + AUTO_LINE_BREAKS: "Automatische Zeilenumbrüche" + AUTO_LINE_BREAKS_HELP: "Aktiviert Unterstützung für automatische Zeilenumbrüche in Markdown" + AUTO_URL_LINKS: "URLs zu Links verwandeln" + AUTO_URL_LINKS_HELP: "Verwandelt jede URL in einen HTML-Link" + ESCAPE_MARKUP: "HTML Ausgabe unterdrücken" + ESCAPE_MARKUP_HELP: "Ersetzt Markup-Tags durch HTML-Zeichen" + CACHING_HELP: "Globaler an/aus Schalter um Caching in Grav zu aktivieren/deaktivieren" + CACHE_CHECK_METHOD: "Cacheprüfungsmethode" + CACHE_CHECK_METHOD_HELP: "Methode die Grav verwendet um den Cache zu prüfen." + CACHE_DRIVER: "Cache-Treiber" + CACHE_DRIVER_HELP: "Cachetreiber den Grav verwendet um Dateien vorzuhalten. 'Automatisch' versucht selbstständig den besten Treiber zu ermitteln" + CACHE_PREFIX: "Cache-Prefix" + CACHE_PREFIX_HELP: "Cacheprefix der verwendet wird um Dateien zu cachen. Sollte nicht verändert werden, wenn man nicht genau weiß, was man tut" + CACHE_PREFIX_PLACEHOLDER: "Abgeleitet von der Basis-URL (überschreiben durch einen zufälligen Text)" + LIFETIME: "Cache-Lebensdauer" + LIFETIME_HELP: "Setzt die Dauer des Caches in Sekunden. 0 = unendlich" + GZIP_COMPRESSION: "Gzip-Komprimierung" + GZIP_COMPRESSION_HELP: "Aktiviert Gzip-Komprimierung um Grav schneller an Browser senden zu können." + TWIG_TEMPLATING: "Twig Templates" + TWIG_CACHING: "Twig caching" + TWIG_CACHING_HELP: "Twig Cache-Einstellungen. Sollte aktiviert bleiben um die beste Performance zu gewährleisten" + TWIG_DEBUG: "Twig debug" + TWIG_DEBUG_HELP: "Deaktiviert die Twig-Debug-Extension" + DETECT_CHANGES: "Änderungen erkennen" + DETECT_CHANGES_HELP: "Twig erkennt automatisch, wenn Themes geändert werden und baut den Cache neu auf" + AUTOESCAPE_VARIABLES: "Variablen automatisch escapen" + AUTOESCAPE_VARIABLES_HELP: "Alle Veriablen escapen. Ihre Seite könnte dadurch nicht korrekt angezeigt werden" + ASSETS: "Assets" + CSS_PIPELINE: "CSS pipeline" + CSS_PIPELINE_HELP: "Die CSS pipline fasst alle Ihre CSS Dateien in einer Einzigen Datei zusammen" + CSS_MINIFY: "CSS minify" + CSS_MINIFY_HELP: "Komprimiert ihre CSS Dateien nach dem pipelining" + CSS_MINIFY_WINDOWS_OVERRIDE: "CSS minify Windows" + CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Verwendet eine andere minify Version, die auf Windows-Betriebssystemen besser funktioniert" + CSS_REWRITE: "CSS rewrite" + CSS_REWRITE_HELP: "Ersetze alle relativen CSS URLs beim pipelining" + JAVASCRIPT_PIPELINE: "JavaScript pipeline" + JAVASCRIPT_PIPELINE_HELP: "Kombiniert alle JavaScript Dateien in eine einzige" + JAVASCRIPT_MINIFY: "JavaScript minify" + JAVASCRIPT_MINIFY_HELP: "Komprimiert die JavaScript Dateien nach dem pipelining" + ENABLED_TIMESTAMPS_ON_ASSETS: "Zeitstempel für assets" + ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Aktviert die Zeitstempel für assets" + COLLECTIONS: "Sammlungen" + ERROR_HANDLER: "Fehlerbehandlung" + DISPLAY_ERRORS: "Fehler Anzeigen" + DISPLAY_ERRORS_HELP: "Volle Backtrace-Error-Seite anzeigen" + LOG_ERRORS: "Fehler Speichern" + LOG_ERRORS_HELP: "Fehler im /logs Ordner speichern" + DEBUGGER: "Debugger" + DEBUGGER_HELP: "Aktiviert den Grav Debugger und die folgenden Einstellungen" + DEBUG_TWIG: "Debug Twig" + DEBUG_TWIG_HELP: "Twig Templates debuggen" + SHUTDOWN_CLOSE_CONNECTION: "Verbindung trennen" + SHUTDOWN_CLOSE_CONNECTION_HELP: "Trent die Verbindung vor dem Aufruf von onShutdown(). Deaktivieren für Debugging" + DEFAULT_IMAGE_QUALITY: "Standard Bildqualität" + DEFAULT_IMAGE_QUALITY_HELP: "Standardbilqualität bei der Veränderung von Bildern (85%)" + CACHE_ALL: "Alle Bilder cachen" + CACHE_ALL_HELP: "Alle Bilder, auch ohne Bearbeitung, im Grav Cache ablegen" + IMAGES_DEBUG: "Image Debug Wasserzeichen" + IMAGES_DEBUG_HELP: "Wasserzeichen mit der Auflösung der Bilder anzeigen um Retina-Displays zu testen" + UPLOAD_LIMIT: "Datei Upload Limit" + UPLOAD_LIMIT_HELP: "Maximale Dateigröße in Bytes (0 = ohne Beschränkung)" + ENABLE_MEDIA_TIMESTAMP: "Zeitstempel für Mediadateien" + ENABLE_MEDIA_TIMESTAMP_HELP: "Fügt jedem Bild einen Zeitstempel der letzten Bearbeitung hinzu" + SESSION: "Session" + SESSION_ENABLED_HELP: "Sessions in Grav aktivieren" + TIMEOUT: "Timeout" + TIMEOUT_HELP: "Session Timeout in Sekunden" + SESSION_NAME_HELP: "Name für den Session-Cookie" + ABSOLUTE_URLS: "Absolute URLs" + ABSOLUTE_URLS_HELP: "Absolute oder Relative Pfadangaben für `base_url`" + PARAMETER_SEPARATOR: "Parameter Trennzeichen" + PARAMETER_SEPARATOR_HELP: "Trennzeichen für Parameter in der URL" + TASK_COMPLETED: "Aufgabe erledigt" + EVERYTHING_UP_TO_DATE: "Keine Aktualisierungen verfügbar" + UPDATES_ARE_AVAILABLE: "Aktualisierungen verfügbar" + IS_AVAILABLE_FOR_UPDATE: "ist zur Aktualisierung verfügbar" + IS_NOW_AVAILABLE: "ist jetzt verfügbar" + CURRENT: "Aktuell" + UPDATE_GRAV_NOW: "Grav jetzt aktualisieren" + GRAV_SYMBOLICALLY_LINKED: "Grav ist symbolisch Verknüpft und kann daher nicht aktualisiert werden" + UPDATING_PLEASE_WAIT: "Update, ... bitte warten" + OF_THIS: "von diesem" + OF_YOUR: "von deinem" + HAVE_AN_UPDATE_AVAILABLE: "hat ein Update verfügbar" + SAVE_AS: "Speichern als" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: "Sind Sie sicher, dass Sie diese Seite und all deren Kinder löschen wollen? Wenn diese Seite noch in anderen Sprachen vorliegt, werden diese Übersetzungen behalten & müssen seperat gelöscht werden. Diese Aktion kann nicht rückgängig gemacht werden." + AND: "und" + UPDATE_AVAILABLE: "Aktualisierung verfügbar" + METADATA_KEY: "Schlüssel (z.B. 'Stichwort')" + METADATA_VALUE: "Wert (z.B. 'Blog, Grav')" + USERNAME_HELP: "Der Nutzername sollte 3 bis 16 Zeichen besitzen, inklusive kleiner Buchstaben, Nummern, Unterstrichen und Bindestrichen. Große Buchstaben, Leerzeichen und Spezialzeichen sind nicht erlaubt." + FULLY_UPDATED: "Vollständig aktualisiert" + SAVE_LOCATION: "Lokal speichern" + PLUGIN_STATUS: "Plugin Status" +ja: + PLUGIN_ADMIN: + ADMIN_BETA_MSG: "ã“れã¯ãƒ™ãƒ¼ã‚¿ç‰ˆã§ã™! 自己責任ã§ä½¿ç”¨ã—ã¦ãã ã•ã„..." + ADMIN_REPORT_ISSUE: "å•題を見ã¤ã‘ã¾ã—ãŸã‹? GitHubã§å ±å‘Šã—ã¦ãã ã•ã„" + EMAIL_FOOTER: "Powered by Grav - The Modern Flat File CMS" + LOGIN_BTN: "ログイン" + LOGIN_BTN_FORGOT: "忘れãŸ" + LOGIN_BTN_RESET: "パスワードリセット" + LOGIN_BTN_SEND_INSTRUCTIONS: "リセット命令をé€ä¿¡" + LOGIN_LOGGED_IN: "正常ã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¾ã—ãŸ" + LOGIN_FAILED: "ログイン失敗" + LOGGED_OUT: "ログアウトã—ã¾ã—ãŸ" + RESET_LINK_EXPIRED: "ãƒªã‚»ãƒƒãƒˆãƒªãƒ³ã‚¯ã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚ å†åº¦ãŠè©¦ã—ãã ã•ã„" + RESET_PASSWORD_RESET: "パスワードã¯ãƒªã‚»ãƒƒãƒˆã•れã¦ã„ã¾ã™" + RESET_INVALID_LINK: "無効リセットリンク使用ã•れã¾ã—ãŸã€‚å†è©¦è¡Œã—ã¦ãã ã•ã„" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "パスワードã®ãƒªã‚»ãƒƒãƒˆæ–¹æ³•ã¯ã€ %s ã«ãƒ¡ãƒ¼ãƒ«ã§é€ã‚Šã¾ã—ãŸ" + FORGOT_FAILED_TO_EMAIL: "メールé€ä¿¡ã«å¤±â€‹â€‹æ•—ã—ã¾ã—ãŸã€‚ ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "%s ã®ãƒ‘スワードã¯ãƒªã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“。 メールアドレスãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" + FORGOT_USERNAME_DOES_NOT_EXIST: "ユーザå %s ã¨ã„ã†ãƒ¦ãƒ¼ã‚¶ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + FORGOT_EMAIL_NOT_CONFIGURED: "パスワードã¯ãƒªã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“。ã“ã®ã‚µã‚¤ãƒˆã¯ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹è¨­å®šãŒã•れã¦ã„ã¾ã›ã‚“" + FORGOT_EMAIL_SUBJECT: "%s ã®ãƒ‘スワードリセットã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" + FORGOT_EMAIL_BODY: "

パスワードリセット

%1$s 様,

%4$s ã§ã‚ãªãŸã®ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãƒªã‚»ãƒƒãƒˆè¦æ±‚ãŒã‚りã¾ã—ãŸã€‚


パスワードをリセットã™ã‚‹ã«ã¯ã€ã“ã®ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„

ã¾ãŸã¯ã€æ¬¡ã®URLをブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«ã‚³ãƒ”ーã—ã¦ãã ã•ã„。:

%2$s


よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚

%3$s

" + MANAGE_PAGES: "ページ管ç†" + CONFIGURATION: "æ§‹æˆ" + PAGES: "ページ" + PLUGINS: "プラグイン" + PLUGIN: "プラグイン" + THEMES: "テーマ" + LOGOUT: "ログアウト" + BACK: "戻る" + ADD_PAGE: "ページ追加" + ADD_MODULAR: "モジュラ追加" + MOVE: "移動" + DELETE: "削除" + SAVE: "ä¿å­˜" + NORMAL: "ノーマル" + EXPERT: "エキスパート" + EXPAND_ALL: "ã™ã¹ã¦å±•é–‹" + COLLAPSE_ALL: "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€" + ERROR: "エラー" + CLOSE: "é–‰ã˜ã‚‹" + CANCEL: "キャンセル" + CONTINUE: "続行" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "確èªã—ã¦ãã ã•ã„" + MODAL_CHANGED_DETECTED_TITLE: "変更ãŒã‚りã¾ã™" + MODAL_CHANGED_DETECTED_DESC: "変更をä¿å­˜ã—ã¦ã„ã¾ã›ã‚“。 ä¿å­˜ã—ãªãã¦ã‚ˆã‚ã—ã„ã§ã™ã‹?" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "確èªã—ã¦ãã ã•ã„" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "ã“ã®ãƒ•ァイルを削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹? ã“ã®æ“ä½œã¯æˆ»ã›ã¾ã›ã‚“" + ADD_FILTERS: "フィルタ追加" + SEARCH_PAGES: "ページ検索" + WAS_MADE_WITH: "Was made with" + BY: "By" + UPDATE_THEME: "テーマ更新" + UPDATE_PLUGIN: "プラグイン更新" + OF_THIS_THEME_IS_NOW_AVAILABLE: "ä»¶ã®ãƒ†ãƒ¼ãƒžã§ç¾åœ¨æ›´æ–°ãŒã‚りã¾ã™" + OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "ä»¶ã®ãƒ—ラグインã§ç¾åœ¨æ›´æ–°ãŒã‚りã¾ã™" + VERSION: "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" + AUTHOR: "作者" + HOMEPAGE: "ホームページ" + DEMO: "デモ" + BUG_TRACKER: "ãƒã‚°ãƒˆãƒ©ãƒƒã‚«" + KEYWORDS: "キーワード" + LICENSE: "ライセンス" + DESCRIPTION: "説明" + README: "README" + REMOVE_THEME: "テーマ削除" + INSTALL_THEME: "テーマ追加" + THEME: "テーマ" + BACK_TO_THEMES: "ãƒ†ãƒ¼ãƒžã«æˆ»ã‚‹" + BACK_TO_PLUGINS: "ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ã«æˆ»ã‚‹" + CHECK_FOR_UPDATES: "更新確èª" + ADD: "追加" + CLEAR_CACHE: "キャッシュクリア" + CLEAR_CACHE_ALL_CACHE: "ã™ã¹ã¦ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥" + CLEAR_CACHE_ASSETS_ONLY: "アセットã®ã¿" + CLEAR_CACHE_IMAGES_ONLY: "ç”»åƒã®ã¿" + CLEAR_CACHE_CACHE_ONLY: "キャッシュã®ã¿" + DASHBOARD: "ダッシュボード" + UPDATES_AVAILABLE: "利用å¯èƒ½ãªæ›´æ–°" + DAYS: "æ—¥" + UPDATE: "æ›´æ–°" + BACKUP: "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—" + STATISTICS: "統計" + TODAY: "今日" + WEEK: "週" + MONTH: "月" + LATEST_PAGE_UPDATES: "最近ã®ãƒšãƒ¼ã‚¸æ›´æ–°" + MAINTENANCE: "メンテナンス" + UPDATED: "更新済" + MON: "月" + TUE: "ç«" + WED: "æ°´" + THU: "木" + FRI: "金" + SAT: "土" + SUN: "æ—¥" + COPY: "コピー" + EDIT: "編集" + CREATE: "作æˆ" + GRAV_ADMIN: "GRAV管ç†" + GRAV_OFFICIAL_PLUGIN: "GRAVå…¬å¼ãƒ—ラグイン" + GRAV_OFFICIAL_THEME: "GRAVå…¬å¼ãƒ†ãƒ¼ãƒž" + PLUGIN_SYMBOLICALLY_LINKED: "ã“ã®ãƒ—ラグインã¯ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ã™ã€‚ æ›´æ–°ã¯æ¤œå‡ºã•れã¾ã›ã‚“" + THEME_SYMBOLICALLY_LINKED: "ã“ã®ãƒ†ãƒ¼ãƒžã¯ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ã™ã€‚æ›´æ–°ã¯æ¤œå‡ºã•れã¾ã›ã‚“" + REMOVE_PLUGIN: "プラグイン削除" + INSTALL_PLUGIN: "プラグイン追加" + AVAILABLE: "利用å¯èƒ½" + INSTALLED: "インストール済" + INSTALL: "インストール" + ACTIVE_THEME: "使用中ã®ãƒ†ãƒ¼ãƒž" + SWITCHING_TO: "切替" + SWITCHING_TO_DESCRIPTION: "別ã®ãƒ†ãƒ¼ãƒžã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆãŒä¿è¨¼ã•れã¦ãŠã‚‰ãšã€ ロードã™ã‚‹éš›ã«æ½œåœ¨çš„ãªã‚¨ãƒ©ãƒ¼ã‚’引ãèµ·ã“ã™å ´åˆãŒã‚りã¾ã™" + SWITCHING_TO_CONFIRMATION: "テーマã®åˆ‡æ›¿ã‚’ç¶šã‘ã¾ã™ã‹" + CREATE_NEW_USER: "æ–°è¦â€‹â€‹ãƒ¦ãƒ¼ã‚¶ä½œæˆ" + REMOVE_USER: "ユーザ削除" + ACCESS_DENIED: "アクセス拒å¦" + ACCOUNT_NOT_ADMIN: "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ç®¡ç†è€…権é™ã‚’æŒã£ã¦ã„ã¾ã›ã‚“" + PHP_INFO: "PHP 情報" + INSTALLER: "インストーラ" + AVAILABLE_THEMES: "利用å¯èƒ½ãªãƒ†ãƒ¼ãƒž" + AVAILABLE_PLUGINS: "利用å¯èƒ½ãªãƒ—ラグイン" + INSTALLED_THEMES: "インストール済テーマ" + INSTALLED_PLUGINS: "インストール済プラグイン" + BROWSE_ERROR_LOGS: "エラーログを見る" + SITE: "サイト" + INFO: "情報" + SYSTEM: "システム" + USER: "ユーザ" + ADD_ACCOUNT: "アカウント追加" + SWITCH_LANGUAGE: "言語切替" + SUCCESSFULLY_ENABLED_PLUGIN: "正常ã«ãƒ—ラグインを有効化ã—ã¾ã—ãŸ" + SUCCESSFULLY_DISABLED_PLUGIN: "正常ã«ãƒ—ラグインを削除ã—ã¾ã—ãŸ" + SUCCESSFULLY_CHANGED_THEME: "正常ã«ãƒ‡ãƒ•ォルトテーマをを変更ã—ã¾ã—ãŸ" + INSTALLATION_FAILED: "インストール失敗" + INSTALLATION_SUCCESSFUL: "インストールæˆåŠŸ" + UNINSTALL_FAILED: "アンインストール失敗" + UNINSTALL_SUCCESSFUL: "アンインストールæˆåŠŸ" + SUCCESSFULLY_SAVED: "正常ã«ä¿å­˜ã•れã¾ã—ãŸ" + SUCCESSFULLY_COPIED: "正常ã«ã‚³ãƒ”ーã•れã¾ã—ãŸ" + REORDERING_WAS_SUCCESSFUL: "正常ã«ä¸¦ã³æ›¿ãˆã•れã¾ã—ãŸ" + SUCCESSFULLY_DELETED: "正常ã«å‰Šé™¤ã•れã¾ã—ãŸ" + SUCCESSFULLY_SWITCHED_LANGUAGE: "正常ã«è¨€èªžåˆ‡æ›¿ã•れã¾ã—ãŸ" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "タクスã®ãŸã‚ã®ååˆ†ãªæ¨©é™ã‚’æŒã£ã¦ã„ã¾ã™" + CACHE_CLEARED: "キャッシュクリア" + METHOD: "メソッド" + ERROR_CLEARING_CACHE: "キャッシュクリアエラー" + AN_ERROR_OCCURRED: "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã™" + DOWNLOAD_BACKUP: "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ダウンロード" + PAGES_FILTERED: "ページフィルタ" + NO_PAGE_FOUND: "ページãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + INVALID_PARAMETERS: "無効ãªãƒ‘ラメータ" + NO_FILES_SENT: "ファイルãŒé€ã‚Œã¾ã›ã‚“" + EXCEEDED_FILESIZE_LIMIT: "ファイルサイズã®åˆ¶é™ã‚’è¶…ãˆã¦ã„ã¾ã™" + UNKNOWN_ERRORS: "未知ã®ã‚¨ãƒ©ãƒ¼" + EXCEEDED_GRAV_FILESIZSE_LIMIT: "Gravã®ãƒ•ァイルサイズã®åˆ¶é™ã‚’è¶…ãˆã¦ã„ã¾ã™" + UNSUPPORTED_FILE_TYPE: "対応ã—ã¦ãªã„ファイルã®ç¨®é¡žã§ã™" + FAILED_TO_MOVE_UPLOADED_FILE: "アップロードファイルã®ç§»å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ" + FILE_UPLOADED_SUCCESSFULLY: "正常ã«ãƒ•ァイルãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸ" + FILE_DELETED: "ファイルã¯å‰Šé™¤ã•れã¾ã—ãŸ" + FILE_COULD_NOT_BE_DELETED: "ファイルã¯å‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸ" + FILE_NOT_FOUND: "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + NO_FILE_FOUND: "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "Gravã¯æ­£å¸¸ã«æ›´æ–°ã•れã¾ã—ãŸ" + GRAV_UPDATE_FAILED: "Gravã¯æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ" + EVERYTHING_UPDATED: "ã™ã¹ã¦æ›´æ–°ã•れã¾ã—ãŸ" + UPDATES_FAILED: "æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ" + AVATAR_BY: "Avatar by" + LAST_BACKUP: "最終ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—" + FULL_NAME: "åå‰" + USERNAME: "ユーザå" + EMAIL: "Eメール" + PASSWORD: "パスワード" + TITLE: "タイトル" + LANGUAGE: "言語" + ACCOUNT: "アカウント" + EMAIL_VALIDATION_MESSAGE: "有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ãªã‘れã°ã„ã‘ã¾ã›ã‚“" + PASSWORD_VALIDATION_MESSAGE: "パスワードã¯å°‘ãªãã¨ã‚‚æ•°å­—ãƒ»å¤§æ–‡å­—ãƒ»å°æ–‡å­—ã‚’å«ã‚€ï¼˜æ–‡å­—以上ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + LANGUAGE_HELP: "好ããªè¨€èªžã‚’設定ã—ã¦ãã ã•ã„" + MEDIA: "メディア" + DEFAULTS: "デフォルト" + SITE_TITLE: "サイトå" + SITE_TITLE_PLACEHOLDER: "é•·ã„サイトå" + SITE_TITLE_HELP: "サイトåã¯ãƒ†ãƒ¼ãƒžã§ä½¿ç”¨ã•れã¾ã™" + DEFAULT_AUTHOR: "著者å" + DEFAULT_AUTHOR_HELP: "著者åã¯ãƒ†ãƒ¼ãƒžã‚„ページコンテンツã§ä½¿ç”¨ã•れã¾ã™" + DEFAULT_EMAIL: "Eメール" + DEFAULT_EMAIL_HELP: "Eメールã¯ãƒ†ãƒ¼ãƒžã‚„ベージã§å‚ç…§ã•れã¾ã™" + TAXONOMY_TYPES: "タクソノミ" + TAXONOMY_TYPES_HELP: "ページã§ä½¿ç”¨ã—ãŸã„タクソノミã¯ã“ã“ã§å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + PAGE_SUMMARY: "ページè¦ç´„" + ENABLED: "有効" + ENABLED_HELP: "ページè¦ç´„を有効ã«ã—ã¾ã™ (è¦ç´„ã¯ãƒšãƒ¼ã‚¸ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¨åŒã˜ã§ã™)" + 'YES': "ã¯ã„" + 'NO': "ã„ã„ãˆ" + SUMMARY_SIZE: "è¦ç´„サイズ" + SUMMARY_SIZE_HELP: "è¦ç´„ã™ã‚‹æ–‡å­—æ•°" + FORMAT: "フォーマット" + FORMAT_HELP: "ショート = 最åˆã«ä½¿ç”¨ã—ãŸåŒºåˆ‡ã‚Šæ–‡å­—〠ã¾ãŸã¯ã‚µã‚¤ã‚º: ロング = 区切り文字ã¯ç„¡è¦–ã•れã¾ã™" + SHORT: "ショート" + LONG: "ロング" + DELIMITER: "区切り文字" + DELIMITER_HELP: "è¦ç´„ã§ä½¿ç”¨ã™ã‚‹åŒºåˆ‡ã‚Šæ–‡å­— (デフォルト '===')" + METADATA: "メタデータ" + METADATA_HELP: "デフォルトã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã¯ã€ ãƒšãƒ¼ã‚¸ã§æŒ‡å®šã—ãªã„é™ã‚Šã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã§ä½¿ç”¨ã•れã¾ã™" + METADATA_KEY: "キー (例 'Keywords')" + METADATA_VALUE: "値 (例 'Blog, Grav')" + USERNAME_HELP: "ユーザåã¯ã€æ•°å­—ãƒ»å°æ–‡å­—・アンダーãƒãƒ¼ãƒ»ãƒã‚¤ãƒ•ンをå«ã‚€3〜16文字ã«ã—ã¦ãã ã•ã„。大文字ã€ã‚¹ãƒšãƒ¼ã‚¹ã€ãŠã‚ˆã³ç‰¹æ®Šæ–‡å­—ã¯ä½¿ãˆã¾ã›ã‚“" + NAME: "キー" + CONTENT: "コンテンツ" + REDIRECTS_AND_ROUTES: "リダイレクト & ルート" + CUSTOM_REDIRECTS: "カスタムリダイレクト" + CUSTOM_REDIRECTS_HELP: "ä»–ã®ãƒšãƒ¼ã‚¸ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¾ã™ã€‚ æ¨™æº–çš„ãªæ­£è¦è¡¨ç¾ãŒä½¿ãˆã¾ã™" + CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/your/redirect" + CUSTOM_ROUTES: "カスタムルート" + CUSTOM_ROUTES_HELP: "ä»–ã®ãƒšãƒ¼ã‚¸ã«ã‚¨ã‚¤ãƒªã‚¢ã‚¹ã—ã¾ã™ã€‚ æ¨™æº–çš„ãªæ­£è¦è¡¨ç¾ãŒä½¿ãˆã¾ã™" + CUSTOM_ROUTES_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/your/route" + FILE_STREAMS: "ファイルストリーム" + DEFAULT: "デフォルト" + PAGE_MEDIA: "ページメディア" + OPTIONS: "オプション" + PUBLISHED: "公開" + PUBLISHED_HELP: "é€šå¸¸ã€ ãƒšãƒ¼ã‚¸ã¯æ¬¡ã®æ—¥ä»˜ã‚’設定ã—ãªã„é™ã‚Šå…¬é–‹ã•れã¾ã™: å½å€¤ã€ å…ˆã®å…¬é–‹æ—¥ã€ éŽãŽãŸéžå…¬é–‹æ—¥" + DATE: "日付" + DATE_HELP: "日付ã¯ã€ã“ã®ãƒšãƒ¼ã‚¸ã®æ—¥ä»˜ã‚’具体的ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" + PUBLISHED_DATE: "公開日" + PUBLISHED_DATE_HELP: "自動的ã«å…¬é–‹ã™ã‚‹æ—¥ä»˜ã‚’設定ã§ãã¾ã™" + UNPUBLISHED_DATE: "éžå…¬é–‹æ—¥" + UNPUBLISHED_DATE_HELP: "自動的ã«éžå…¬é–‹ã™ã‚‹æ—¥ä»˜ã‚’設定ã§ãã¾ã™" + ROBOTS: "ロボット" + TAXONOMIES: "タクソノミ" + TAXONOMY: "タクソノミ" + ADVANCED: "高度" + SETTINGS: "設定" + FOLDER_NUMERIC_PREFIX: "フォルダ数値プレフィックス" + FOLDER_NUMERIC_PREFIX_HELP: "æ•°å€¤ãƒ—ãƒ¬ãƒ•ã‚£ãƒƒã‚¯ã‚¹ã¯æ‰‹å‹•ã§é †åºã‚’変更ã§ãã€ è¦–èªæ€§ã‚’上ã’るフォルダã®å…ˆé ­ã«ã¤ã数値" + FOLDER_NAME: "フォルダå" + FOLDER_NAME_HELP: "ã“ã®ãƒšãƒ¼ã‚¸ãŒå…¥ã‚‹ãƒ•ォルダå" + PARENT: "親" + DEFAULT_OPTION_ROOT: "- Root -" + DEFAULT_OPTION_SELECT: "- Select -" + DISPLAY_TEMPLATE: "表示テンプレート" + DISPLAY_TEMPLATE_HELP: "ページを変æ›ã™ã‚‹twigテンプレートタイプ" + BODY_CLASSES: "ボディクラス" + ORDERING: "é †åº" + PAGE_ORDER: "ページ順åº" + OVERRIDES: "上書ã" + MENU: "メニュー" + MENU_HELP: "メニューã«ä½¿ã‚れる文字。 設定ã—ãªã„å ´åˆã€ タイトルãŒä½¿ã‚れã¾ã™" + SLUG: "スラッグ" + SLUG_HELP: "スラッグã¯ã€ã“ã®ãƒšãƒ¼ã‚¸ã®URLã‚’ä½çš„ã«è¨­å®šã§ãã¾ã™" + SLUG_VALIDATE_MESSAGE: "スラッグã¯å°æ–‡å­—英数字ã¨ãƒã‚¤ãƒ•ンã®ã¿ä½¿ç”¨ã§ãã¾ã™" + PROCESS: "å‡¦ç†æ–¹æ³•" + PROCESS_HELP: "ページã®å‡¦ç†æ–¹æ³•を設定ã—ã¾ã™ã€‚ ページã”ã¨ã§ã¯ãªãã€å…¨ä½“を設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" + DEFAULT_CHILD_TYPE: "標準 Child Type" + USE_GLOBAL: "全体設定を使ã†" + ROUTABLE: "ルーティングå¯èƒ½" + ROUTABLE_HELP: "URLã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªå ´åˆ" + CACHING: "キャッシュ" + VISIBLE: "å¯è¦–" + VISIBLE_HELP: "ページãŒãƒŠãƒ“ゲーションã«è¡¨ç¤ºã•れるã‹ã‚’設定ã—ã¾ã™" + DISABLED: "無効" + ITEMS: "アイテム" + ORDER_BY: "é †åºæ–¹æ³•" + ORDER: "é †åº" + FOLDER: "フォルダ" + ASCENDING: "昇順" + DESCENDING: "é™é †" + ADD_MODULAR_CONTENT: "モジュラーコンテンツ追加" + PAGE_TITLE: "ページå" + PAGE_TITLE_HELP: "ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚¿ã‚¤ãƒˆãƒ«" + PAGE: "ページ" + MODULAR_TEMPLATE: "モジュラテンプレート" + FRONTMATTER: "Frontmatter" + FILENAME: "ファイルå" + PARENT_PAGE: "親ページ" + HOME_PAGE: "ホームページ" + HOME_PAGE_HELP: "GravãŒãƒ‡ãƒ•ォルトã®ãƒ©ã‚¤ãƒ†ã‚£ãƒ³ã‚°ãƒšãƒ¼ã‚¸ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãƒšãƒ¼ã‚¸" + DEFAULT_THEME: "デフォルトテーマ" + DEFAULT_THEME_HELP: "GravãŒä½¿ç”¨ã™ã‚‹ãƒ‡ãƒ•ォルトã®ãƒ†ãƒ¼ãƒžã‚’設定ã—ã¾ã™ (デフォルト㯠Antimatter)" + TIMEZONE: "タイムゾーン" + TIMEZONE_HELP: "サーãƒã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚’上書ãã—ã¾ã™" + SHORT_DATE_FORMAT: "çŸ­ã„æ—¥ä»˜å½¢å¼" + SHORT_DATE_FORMAT_HELP: "テーマã§ä½¿ã‚ã‚Œã‚‹çŸ­ã„æ—¥ä»˜å½¢å¼ã‚’設定ã—ã¾ã™" + LONG_DATE_FORMAT: "é•·ã„æ—¥ä»˜å½¢å¼" + LONG_DATE_FORMAT_HELP: "テーマã§ä½¿ã‚ã‚Œã‚‹é•·ã„æ—¥ä»˜å½¢å¼ã‚’設定ã—ã¾ã™" + DEFAULT_ORDERING: "デフォルト順åº" + DEFAULT_ORDERING_HELP: "上書ãã•れãªã„é™ã‚Šã€ã“ã®ãƒšãƒ¼ã‚¸é †åºã‚’使用ã—ã¾ã™" + DEFAULT_ORDERING_DEFAULT: "デフォルト - フォルダåを基準ã«ã—ã¾ã™" + DEFAULT_ORDERING_FOLDER: "フォルダ - プレフィックスを抜ã„ãŸãƒ•ォルダåを基準ã«ã—ã¾ã™" + DEFAULT_ORDERING_TITLE: "タイトル - ヘッダã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’基準ã«ã—ã¾ã™" + DEFAULT_ORDERING_DATE: "日付 - ãƒ˜ãƒƒãƒ€ã®æ—¥ä»˜ã‚’基準ã«ã—ã¾ã™" + DEFAULT_ORDER_DIRECTION: "デフォルトã®ä¸¦ã³é †" + DEFAULT_ORDER_DIRECTION_HELP: "リスト内ã®ãƒšãƒ¼ã‚¸é †åº" + DEFAULT_PAGE_COUNT: "デフォルトã®ãƒšãƒ¼ã‚¸æ•°" + DEFAULT_PAGE_COUNT_HELP: "リスト内ã®ãƒ‡ãƒ•ォルトã®ãƒšãƒ¼ã‚¸ã‚«ã‚¦ãƒ³ãƒˆæœ€å¤§å€¤" + DATE_BASED_PUBLISHING: "公開日ã®åŸºæº–" + DATE_BASED_PUBLISHING_HELP: "自動的ã«(éž)公開ã™ã‚‹æ—¥ä»˜ã®åŸºæº–" + EVENTS: "イベント" + EVENTS_HELP: "特定ã®ã‚¤ãƒ™ãƒ³ãƒˆã‚’有効ã¾ãŸã¯ç„¡åйã«ã—ã¾ã™ã€‚ 無効ã™ã‚‹ã¨ãƒ—ラグインを無効ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" + REDIRECT_DEFAULT_ROUTE: "デフォルトルートã¸ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ" + REDIRECT_DEFAULT_ROUTE_HELP: "自動的ã«ãƒ‡ãƒ•ォルトルートã¸ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¾ã™" + LANGUAGES: "言語" + SUPPORTED: "対応" + SUPPORTED_HELP: "2文字ã®è¨€èªžã‚³ãƒ¼ãƒˆã‚’カンマã§åŒºåˆ‡ã£ã¦ãã ã•ã„ (例 'en,fr,de')" + TRANSLATIONS_ENABLED: "翻訳有効" + TRANSLATIONS_ENABLED_HELP: "プラグインや拡張機能ã§Gravã®ç¿»è¨³å¯¾å¿œ" + TRANSLATIONS_FALLBACK: "フォールãƒãƒƒã‚¯ç¿»è¨³" + TRANSLATIONS_FALLBACK_HELP: "有効ãªè¨€èªžãŒãªã„å ´åˆã¯ã€ 代替手段ã¸åˆ‡ã‚Šæ›¿ãˆã¦ç¿»è¨³å¯¾å¿œã—ã¾ã™" + ACTIVE_LANGUAGE_IN_SESSION: "ã‚»ãƒƒã‚·ãƒ§ãƒ³ã§æœ‰åйãªè¨€èªž" + ACTIVE_LANGUAGE_IN_SESSION_HELP: "ã‚»ãƒƒã‚·ãƒ§ãƒ³ã§æœ‰åйãªè¨€èªžã‚’ä¿å­˜ã—ã¾ã™" + HTTP_HEADERS: "HTTP ヘッダ" + EXPIRES: "Expires" + EXPIRES_HELP: "ãƒ˜ãƒƒãƒ€ã®æœ‰åŠ¹æœŸé™ã‚’設定ã—ã¾ã™ã€‚ 値ã¯ç§’å˜ä½ã§ã™" + LAST_MODIFIED: "Last modified" + LAST_MODIFIED_HELP: "プロキシã¨ãƒ–ラウザã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’最é©åŒ–ã™ã‚‹Last modifiedを設定ã—ã¾ã™" + ETAG: "ETag" + ETAG_HELP: "ページãŒå¤‰æ›´ã•れãŸã¨ã識別ã—ã‚„ã™ã„よã†Etagを設定ã—ã¾ã™" + VARY_ACCEPT_ENCODING: "Vary accept encoding" + VARY_ACCEPT_ENCODING_HELP: "プロキシ㨠CDN ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’助ã‘ã‚‹Vary Accept Encodingを設定ã—ã¾ã™" + MARKDOWN_EXTRA_HELP: "Markdown Extraã®ãƒ‡ãƒ•ォルト対応を有効ã«ã—ã¾ã™ https://michelf.ca/projects/php-markdown/extra/" + AUTO_LINE_BREAKS: "自動改行" + AUTO_LINE_BREAKS_HELP: "Markdownã§ã®è‡ªå‹•改行ã®å¯¾å¿œã‚’有効ã«ã—ã¾ã™" + AUTO_URL_LINKS: "自動URLリンク" + AUTO_URL_LINKS_HELP: "URLã®HTML HyperLinksã¸ã®è‡ªå‹•変æ›ã‚’有効ã«ã—ã¾ã™" + ESCAPE_MARKUP: "マークアップエスケープ" + ESCAPE_MARKUP_HELP: "HTMLã®ãƒžãƒ¼ã‚¯ã‚¢ãƒƒãƒ—タグをエスケープã—ã¾ã™" + CACHING_HELP: "Grav全体ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥æœ‰åй/無効を切り替ãˆã¾ã™" + CACHE_CHECK_METHOD: "キャッシュãƒã‚§ãƒƒã‚¯æ–¹æ³•" + CACHE_CHECK_METHOD_HELP: "Gravã®ãƒšãƒ¼ã‚¸ãƒ•ァイルãŒå¤‰æ›´ã•れã¦ã„ã‚‹ã‹ã‚’確èªã™ã‚‹æ–¹æ³•ã‚’é¸æŠžã—ã¾ã™" + CACHE_DRIVER: "キャッシュドライãƒ" + CACHE_DRIVER_HELP: "GravãŒä½¿ç”¨ã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ‰ãƒ©ã‚¤ãƒã‚’é¸ã³ã¾ã™ã€‚ 「Auto Detect〠ã«ã™ã‚‹ã¨è‡ªå‹•ã§æ¤œå‡ºã—ã¾ã™" + CACHE_PREFIX: "キャッシュプレフィックス" + CACHE_PREFIX_HELP: "Gravã®è­˜åˆ¥å­ã€‚ ã‚ã‹ã‚‰ãªã„å ´åˆã€ 変更ã—ãªã„ã§ãã ã•ã„" + CACHE_PREFIX_PLACEHOLDER: "base URL (ランダム文字列を入力ã—ã¦ä¸Šæ›¸ã)" + LIFETIME: "有効期é™" + LIFETIME_HELP: "ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã®æœ‰åŠ¹æœŸé™ã‚’設定ã—ã¾ã™ 0 = 無期é™" + GZIP_COMPRESSION: "Gzip 圧縮" + GZIP_COMPRESSION_HELP: "Gravã®ãƒ‘フォーマンスå‘上ã®ãŸã‚〠ページã®Gzip圧縮を有効ã«ã—ã¾ã™" + TWIG_TEMPLATING: "Twig テンプレート" + TWIG_CACHING: "Twig キャッシュ" + TWIG_CACHING_HELP: "Twig キャッシュを制御ã—ã¾ã™ã€‚ パフォーマンスã®ãŸã‚ã«ã¯æœ‰åйã«ã—ã¾ã™" + TWIG_DEBUG: "Twig デãƒãƒƒã‚°" + TWIG_DEBUG_HELP: "Twigデãƒãƒƒã‚°æ©Ÿèƒ½ã‚’読ã¿è¾¼ã¾ãªã„" + DETECT_CHANGES: "変更を検出" + DETECT_CHANGES_HELP: "Twigã¯TwigテンプレートãŒå¤‰æ›´ã•れるã¨ã€è‡ªå‹•çš„ã«Twigキャッシュをå†ã‚³ãƒ³ãƒ‘イルã—ã¾ã™" + AUTOESCAPE_VARIABLES: "Autoescape 変数" + AUTOESCAPE_VARIABLES_HELP: "Autoescape変数を有効ã«ã—ã¾ã™ã€‚ サイトデザインãŒå£Šã‚Œã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã§ã™" + ASSETS: "アセット" + CSS_PIPELINE: "CSS パイプライン" + CSS_PIPELINE_HELP: "CSSパイプラインã¯è¤‡æ•°ã®CSSファイルを一ã¤ã«ã¾ã¨ã‚ã¾ã™" + CSS_MINIFY: "CSS 縮å°" + CSS_MINIFY_HELP: "CSSパイプライン処ç†ä¸­ã«CSSを縮å°ã—ã¾ã™" + CSS_MINIFY_WINDOWS_OVERRIDE: "CSS Windows 上書ã縮å°" + CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Windowsプラットフォームã§ä¸Šæ›¸ã縮å°ã—ã¾ã™ã€‚ デフォルトã§hreadStackSizeã§å¤±æ•—ã™ã‚‹ã¨ã" + CSS_REWRITE: "CSS 書æ›" + CSS_REWRITE_HELP: "CSSパイプライン処ç†ä¸­ã«CSSã®URLã‚’ç›¸å¯¾çš„ã«æ›¸æ›" + JAVASCRIPT_PIPELINE: "JavaScript パイプライン" + JAVASCRIPT_PIPELINE_HELP: "JSパイプラインã¯è¤‡æ•°ã®JSファイルを一ã¤ã«ã¾ã¨ã‚ã¾ã™" + JAVASCRIPT_MINIFY: "JavaScript 縮å°" + JAVASCRIPT_MINIFY_HELP: "JSパイプライン処ç†ä¸­ã«JSを縮å°ã—ã¾ã™" + ENABLED_TIMESTAMPS_ON_ASSETS: "アセットã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を有効" + ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "アセットã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を有効ã«ã—ã¾ã™" + COLLECTIONS: "コレクション" + ERROR_HANDLER: "エラーãƒãƒ³ãƒ‰ãƒ©" + DISPLAY_ERRORS: "エラー表示" + DISPLAY_ERRORS_HELP: "Full backtrace-style エラーページを表示ã—ã¾ã™" + LOG_ERRORS: "エラーログ" + LOG_ERRORS_HELP: "/logs フォルダã«ã‚¨ãƒ©ãƒ¼ã‚’記録ã—ã¾ã™" + DEBUGGER: "デãƒãƒƒã‚¬" + DEBUGGER_HELP: "Gravデãƒãƒƒã‚¬ã¨æ¬¡ã®è¨­å®šã‚’有効ã«ã—ã¾ã™" + DEBUG_TWIG: "Twig デãƒãƒƒã‚°" + DEBUG_TWIG_HELP: "Twigテンプレートã®ãƒ‡ãƒãƒƒã‚°ã‚’有効ã«ã—ã¾ã™" + SHUTDOWN_CLOSE_CONNECTION: "Shutdown 接続を閉ã˜ã‚‹" + SHUTDOWN_CLOSE_CONNECTION_HELP: "onShutdown()を呼ã¶å‰ã«æŽ¥ç¶šã‚’é–‰ã˜ã¾ã™ã€‚ デãƒãƒƒã‚°ã«å¤±æ•—ã™ã‚‹ã¨ã" + DEFAULT_IMAGE_QUALITY: "デフォルト画質" + DEFAULT_IMAGE_QUALITY_HELP: "デフォルト画質ã¯ç”»åƒã‚’リサンプリングやキャッシュã™ã‚‹ã¨ã使ã‚れã¾ã™ (85%)" + CACHE_ALL: "ã™ã¹ã¦ã®ç”»åƒã‚’キャッシュ" + CACHE_ALL_HELP: "メディアを扱ã£ã¦ã„ãªã„å ´åˆã§ã‚‚〠Gravã¯ã™ã¹ã¦ã®ç”»åƒã‚’キャッシュã—ã¾ã™" + IMAGES_DEBUG: "ç”»åƒãƒ‡ãƒãƒƒã‚°é€ã‹ã—" + IMAGES_DEBUG_HELP: "ç”»åƒã®ä¸Šã«ç”»åƒã‚’上書ãã—ã¦è¡¨ç¤ºã—ã¾ã™" + UPLOAD_LIMIT: "ファイルアップロード制é™" + UPLOAD_LIMIT_HELP: "最大アップロードサイズを byte å˜ä½ã§è¨­å®šã—ã¾ã™ (0 制é™ãªã—)" + ENABLE_MEDIA_TIMESTAMP: "メディアã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を有効" + ENABLE_MEDIA_TIMESTAMP_HELP: "ãƒ¡ãƒ‡ã‚£ã‚¢ã®æœ€çµ‚更新日時ã«åŸºã¥ã„ã¦ã€ タイムスタンプを追加ã—ã¾ã™" + SESSION: "セッション" + SESSION_ENABLED_HELP: "Gravã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å¯¾å¿œã‚’有効ã«ã—ã¾ã™" + TIMEOUT: "タイムアウト" + TIMEOUT_HELP: "ç§’å˜ä½ã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’設定ã—ã¾ã™" + SESSION_NAME_HELP: "識別å­ã¯ã‚¯ãƒƒã‚­ãƒ¼ã®åå‰ã«ä½¿ç”¨ã•れã¾ã™" + ABSOLUTE_URLS: "絶対的 URL" + ABSOLUTE_URLS_HELP: "「base_urlã€ã®ãŸã‚ã®çµ¶å¯¾çš„ã‚‚ã—ãã¯ç›¸å¯¾çš„URL" + PARAMETER_SEPARATOR: "パラメータ区切り" + PARAMETER_SEPARATOR_HELP: "Windows上ã®Apacheã®ãŸã‚ã«å¤‰æ›´ã§ãるパラメータã®åŒºåˆ‡ã‚Š" + TASK_COMPLETED: "タスク完了" + EVERYTHING_UP_TO_DATE: "ã™ã¹ã¦æœ€æ–°ç‰ˆã§ã™" + UPDATES_ARE_AVAILABLE: "利用å¯èƒ½ãªæ›´æ–°ãŒã‚りã¾ã™" + IS_AVAILABLE_FOR_UPDATE: "ã®åˆ©ç”¨å¯èƒ½ãªæ›´æ–°ãŒãŒã‚りã¾ã™" + IS_NOW_AVAILABLE: "ãŒåˆ©ç”¨å¯èƒ½ã§ã™" + CURRENT: "ç¾åœ¨" + UPDATE_GRAV_NOW: "Grav 更新中" + GRAV_SYMBOLICALLY_LINKED: "Gravã¯ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ã™ã€‚ アップグレードã¯åˆ©ç”¨ã§ãã¾ã›ã‚“" + UPDATING_PLEASE_WAIT: "更新中... ダウンロードをãŠå¾…ã¡ãã ã•ã„" + OF_THIS: "ä»¶ã“ã®" + OF_YOUR: "ä»¶ã‚ãªãŸã®" + HAVE_AN_UPDATE_AVAILABLE: "ã¯åˆ©ç”¨å¯èƒ½ãªæ›´æ–°ãŒã‚りã¾ã™" + SAVE_AS: "æ–°è¦ä¿å­˜" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: "ã“ã®ãƒšãƒ¼ã‚¸ã¨å­ãƒšãƒ¼ã‚¸ã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? ã‚‚ã—é•ã†è¨€èªžã§ç¿»è¨³ã•れãŸãƒšãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã€ ãれらã®ãƒšãƒ¼ã‚¸ã¯æ®‹ã‚‹ã®ã§å€‹åˆ¥ã«å‰Šé™¤ã—ã¦ãã ã•ã„。 ãれ以外ã€ãƒ™ãƒ¼ã‚¸ãƒ•ォルダã¯ã‚µãƒ–フォルダã¨ä¸€ç·’ã«å‰Šé™¤ã•れã¾ã™ã€‚ ã“ã®æ“ä½œã¯æˆ»ã›ã¾ã›ã‚“。" + AND: "ã¨" + UPDATE_AVAILABLE: "利用å¯èƒ½ãªæ›´æ–°" + FULLY_UPDATED: "ã™ã¹ã¦æ›´æ–°ã—ã¾ã—ãŸ" + SAVE_LOCATION: "ä¿å­˜å ´æ‰€" + PAGE_FILE: "ページファイル" + PAGE_FILE_HELP: "ページファイルåã¨æ¨™æº–ã§è¡¨ç¤ºã•れるã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ†ãƒ³ãƒ—レート" + NO_USER_ACCOUNTS: "ユーザアカウントãŒã‚りã¾ã›ã‚“ã€‚åˆæœŸãƒ¦ãƒ¼ã‚¶ã‚’作æˆã—ã¦ãã ã•ã„.." + REDIRECT_TRAILING_SLASH: "末尾スラッシュã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ" + REDIRECT_TRAILING_SLASH_HELP: "URIã®æœ«å°¾ãŒã‚¹ãƒ©ãƒƒã‚·ãƒ¥ãªã‚‰ã€301リダイレクトã—ã¾ã™" + DEFAULT_DATE_FORMAT: "ページ日付フォーマット" + DEFAULT_DATE_FORMAT_HELP: "Gravã§ä½¿ã‚れる日付フォーマット。.標準ã§ã¯ã€PHPã®æ—¥ä»˜æ§‹æ–‡ã‚’使用ã—ã¦ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’æŽ¨æ¸¬ã—æ˜Žç¢ºã«ã—ã¾ã™(例 : Y-m-d H:i)" + DEFAULT_DATE_FORMAT_PLACEHOLDER: "空白ã®å ´åˆã¯ã€ 推測ã—ã¾ã™" + IGNORE_FILES: "無視ã™ã‚‹ãƒ•ァイル" + IGNORE_FILES_HELP: "ページを処ç†ã™ã‚‹ã¨ãã«ç„¡è¦–ã™ã‚‹ãƒ•ァイル" + IGNORE_FOLDERS: "無視ã™ã‚‹ãƒ•ォルダ" + IGNORE_FOLDERS_HELP: "ページを処ç†ã™ã‚‹ã«ç„¡è¦–ã™ã‚‹ãƒ•ォルダ" + HTTP_ACCEPT_LANGUAGE: "ブラウザã§è¨­å®šã•れã¦ã„る言語" + HTTP_ACCEPT_LANGUAGE_HELP: " ブラウザã®`http_accept_language` ヘッダタグã®è¨€èªžã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" + OVERRIDE_LOCALE: "ロケール上書ã" + OVERRIDE_LOCALE_HELP: "ç¾åœ¨ã®è¨€èªžè¨­å®šã§PHPã®ãƒ­ã‚±ãƒ¼ãƒ«è¨­å®šã‚’上書ãã—ã¾ã™" + REDIRECT: "ページリダイレクト" + REDIRECT_HELP: "ページルートã€ã‚‚ã—ãã¯å¤–部URLを入力ã—ã¾ã™ã€‚ 例 `/some/route` or `http://somesite.com`" + PLUGIN_STATUS: "プラグインã®çŠ¶æ…‹" + +ru: + PLUGIN_ADMIN: + ADMIN_BETA_MSG: "Это бета-релиз! Ð’Ñ‹ иÑпользуете Ñто раÑширение на Ñвой Ñтрах и риÑк..." + ADMIN_REPORT_ISSUE: "Ðашли ошибку? ПожалуйÑта, Ñообщите об Ñтом на GitHub." + EMAIL_FOOTER: "Разработано Grav - The Modern Flat File CMS" + LOGIN_BTN: "Логин" + LOGIN_BTN_FORGOT: "Забыл" + LOGIN_BTN_RESET: "ВоÑтановить Пароль" + LOGIN_BTN_SEND_INSTRUCTIONS: "Отправить инÑтрукции по ÑброÑу" + LOGIN_LOGGED_IN: "Ð’Ñ‹ уÑпешно вошли в ÑиÑтему" + LOGIN_FAILED: "Ошибка при входе" + LOGGED_OUT: "Ð’Ñ‹ вышли" + RESET_LINK_EXPIRED: "Ð’Ñ€ÐµÐ¼Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸Ñтекло, пожалуйÑта, попробуйте еще раз" + RESET_PASSWORD_RESET: "Пароль был Ñброшен" + RESET_INVALID_LINK: "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ, пожалуйÑта, попробуйте еще раз" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "ИнÑтрукции Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±Ñ‹Ð»Ð¸ выÑланы на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты %s" + FORGOT_FAILED_TO_EMAIL: "Ðе удалоÑÑŒ отправить инÑтрукции по Ñлектронной почте, пожалуйÑта, повторите попытку позже" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Ðевозможно ÑброÑить пароль Ð´Ð»Ñ %s, так как Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не уÑтановлен" + FORGOT_USERNAME_DOES_NOT_EXIST: "Пользователь Ñ Ð»Ð¾Ð³Ð¸Ð½Ð¾Ð¼ %s не ÑущеÑтвует" + FORGOT_EMAIL_NOT_CONFIGURED: "Ðе удаётÑÑ ÑброÑить пароль. Этот Ñайт не наÑтроен Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Ñлектронной почты" + FORGOT_EMAIL_SUBJECT: "%s Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° воÑÑтановление паролÑ" + FORGOT_EMAIL_BODY: "

ВоÑÑтановление паролÑ

Уважемый %1$s,

Было отправлен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° %4$s Ð´Ð»Ñ ÑброÑа паролÑ.


Ðажмите Ñту кнопку, чтобы ÑброÑить Ñвой пароль

Или Ñкопируйте Ñледующий URL в адреÑную Ñтроку вашего браузера:

%2$s


С уважением,

%3$s

" + MANAGE_PAGES: "Менеджер Страниц" + CONFIGURATION: "ÐаÑтройки" + PAGES: "Страницы" + PLUGINS: "Плагины" + PLUGIN: "Плагины" + THEMES: "Темы" + LOGOUT: "Выход" + BACK: "Ðазад" + ADD_PAGE: "Добавить Страницу" + ADD_MODULAR: "Добавить Блок" + MOVE: "ПеренеÑти" + DELETE: "Удалить" + SAVE: "Сохранить" + NORMAL: "Стандартный" + EXPERT: "ЭкÑпертный" + EXPAND_ALL: "Развернуть Ð’Ñе" + COLLAPSE_ALL: "Свернуть Ð’Ñе" + ERROR: "Ошибка" + CLOSE: "Закрыть" + CANCEL: "Отменить" + CONTINUE: "Продолжить" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "ТребуетÑÑ ÐŸÐ¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ðµ" + MODAL_CHANGED_DETECTED_TITLE: "Обнаружены ИзменениÑ" + MODAL_CHANGED_DETECTED_DESC: "У Ð²Ð°Ñ ÐµÑть неÑохраненные изменениÑ. Ð’Ñ‹ уверены, что хотите выйти без ÑохранениÑ?" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "ТребуетÑÑ ÐŸÐ¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ðµ" + MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Ð’Ñ‹ уверены, что хотите удалить Ñтот файл? Это дейÑтвие не может быть отменено." + ADD_FILTERS: "Добавить Фильтры" + SEARCH_PAGES: "ПоиÑк Страницы" + VERSION: "ВерÑиÑ" + WAS_MADE_WITH: "Ñделано Ñ" + BY: "От" + UPDATE_THEME: "Обновление Темы" + UPDATE_PLUGIN: "Обновление Плагина" + OF_THIS_THEME_IS_NOW_AVAILABLE: "Ñта тема теперь доÑтупна" + OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "Ñтот плагин теперь доÑтупен" + AUTHOR: "Ðвтор" + HOMEPAGE: "Сайт" + DEMO: "Демо" + BUG_TRACKER: "Баг-Трекер" + KEYWORDS: "Ключевые Слова" + LICENSE: "ЛицензиÑ" + DESCRIPTION: "ОпиÑание" + README: "Readme" + REMOVE_THEME: "Удалить Тему" + INSTALL_THEME: "УÑтановить Тему" + THEME: "Тема" + BACK_TO_THEMES: "Ðазад к Темам" + BACK_TO_PLUGINS: "Ðазад к Плагинам" + CHECK_FOR_UPDATES: "Проверить ОбновлениÑ" + ADD: "Добавить" + CLEAR_CACHE: "ОчиÑтить кÑш" + CLEAR_CACHE_ALL_CACHE: "ВеÑÑŒ кÑш" + CLEAR_CACHE_ASSETS_ONLY: "Только текущий" + CLEAR_CACHE_IMAGES_ONLY: "Только картинки" + CLEAR_CACHE_CACHE_ONLY: "Только кÑш" + DASHBOARD: "Панель управлениÑ" + UPDATES_AVAILABLE: "ДоÑтупны ОбновлениÑ" + DAYS: "Дни" + UPDATE: "Обновление" + BACKUP: "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ" + STATISTICS: "СтатиÑтика" + TODAY: "СегоднÑ" + WEEK: "ÐеделÑ" + MONTH: "МеÑÑц" + LATEST_PAGE_UPDATES: "ПоÑледние обновленные Ñтраницы" + MAINTENANCE: "ТехничеÑкое обÑлуживание" + UPDATED: "Обновлен" + MON: "Пн" + TUE: "Ð’Ñ‚" + WED: "Ср" + THU: "Чт" + FRI: "Пт" + SAT: "Сб" + SUN: "Ð’Ñ" + COPY: "Копировать" + EDIT: "Редактировать" + CREATE: "Создать" + GRAV_ADMIN: "Ðдмин Панель Grav" + GRAV_OFFICIAL_PLUGIN: "Официальные Плагины Grav" + GRAV_OFFICIAL_THEME: "Официальные Темы Grav" + PLUGIN_SYMBOLICALLY_LINKED: "Этот плагин ÑимволичеÑки ÑвÑзаны. ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ будут найдены." + THEME_SYMBOLICALLY_LINKED: "Эта тема ÑимволичеÑки ÑвÑзана. ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ будут найдены." + REMOVE_PLUGIN: "Удалить Плагин" + INSTALL_PLUGIN: "УÑтановить Плагин" + AVAILABLE: "ДоÑтупен" + INSTALLED: "УÑтановлен" + INSTALL: "УÑтановить" + ACTIVE_THEME: "Ðктивировать Тему" + SWITCHING_TO: "Переключить" + SWITCHING_TO_DESCRIPTION: "При переключении на другую тему нет никакой гарантии того, что поддерживаютÑÑ Ð²Ñе Ñтраницы макетов. Возможно, Ñто приведет к ошибкам при попытке загрузки указанных Ñтраниц." + SWITCHING_TO_CONFIRMATION: "Ð’Ñ‹ дейÑтвительно хотите продолжить и перейти к теме" + CREATE_NEW_USER: "Создать Ðового ПользователÑ" + REMOVE_USER: "Удалить ПользователÑ" + ACCESS_DENIED: "ДоÑтуп запрещен" + ACCOUNT_NOT_ADMIN: "ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не имеет прав админиÑтратора" + PHP_INFO: "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ PHP" + INSTALLER: "УÑтановщик" + AVAILABLE_THEMES: "ДоÑтупные Темы" + AVAILABLE_PLUGINS: "ДоÑтупные Плагины" + INSTALLED_THEMES: "УÑтановленные Темы" + INSTALLED_PLUGINS: "УÑтановленные Плагины" + BROWSE_ERROR_LOGS: "ПроÑмотр Журналов Ошибок" + SITE: "Сайт" + INFO: "ИнформациÑ" + SYSTEM: "СиÑтема" + USER: "Пользователь" + ADD_ACCOUNT: "Добавить Учетную ЗапиÑÑŒ" + SWITCH_LANGUAGE: "Переключить Ñзык" + SUCCESSFULLY_ENABLED_PLUGIN: "Плагин уÑпешно включен" + SUCCESSFULLY_DISABLED_PLUGIN: "Плагин уÑпешно отключен" + SUCCESSFULLY_CHANGED_THEME: "УÑпешно изменена тема по умолчанию" + INSTALLATION_FAILED: "Ошибка при уÑтановке" + INSTALLATION_SUCCESSFUL: "УÑтановка завершена уÑпешно" + UNINSTALL_FAILED: "Удалить не удалоÑÑŒ" + UNINSTALL_SUCCESSFUL: "Удаление уÑпешно" + SUCCESSFULLY_SAVED: "Сохранение уÑпешно" + SUCCESSFULLY_COPIED: "Копирование уÑпешно" + REORDERING_WAS_SUCCESSFUL: "Изменение порÑдка прошло уÑпешно" + SUCCESSFULLY_DELETED: "УÑпешно удалено" + SUCCESSFULLY_SWITCHED_LANGUAGE: "Язык подключен уÑпешно" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав доÑтупа Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ñ‡Ð¸" + CACHE_CLEARED: "кÑш очищаетÑÑ" + METHOD: "Метод" + ERROR_CLEARING_CACHE: "Ошибка отчиÑтки кÑша" + AN_ERROR_OCCURRED: "Произошла ошибка" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "Ваша Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð° Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" + DOWNLOAD_BACKUP: "Скачать резервную копию" + PAGES_FILTERED: "Фильтр Ñтраниц" + NO_PAGE_FOUND: "Страница не найдена" + INVALID_PARAMETERS: "Ðеверные Параметры" + NO_FILES_SENT: "Файлы не отправлÑÑŽÑ‚ÑÑ" + EXCEEDED_FILESIZE_LIMIT: "Превышен предел размера файла" + UNKNOWN_ERRORS: "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" + EXCEEDED_GRAV_FILESIZSE_LIMIT: "Превышен предел размера файла GRAV." + UNSUPPORTED_FILE_TYPE: "Ðеподдерживаемый тип файла" + FAILED_TO_MOVE_UPLOADED_FILE: "Ðе удалоÑÑŒ перемеÑтить загруженный файл." + FILE_UPLOADED_SUCCESSFULLY: "Файл загружен уÑпешно" + FILE_DELETED: "Файл удален" + FILE_COULD_NOT_BE_DELETED: "Файл не может быть удален" + FILE_NOT_FOUND: "Файл не найден" + NO_FILE_FOUND: "Ðет файл не найден" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "Grav уÑпешно обновлен" + GRAV_UPDATE_FAILED: "Ошибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Grav" + EVERYTHING_UPDATED: "ОбновлÑÑŽÑ‚ÑÑ" + UPDATES_FAILED: "Обновление не удалоÑÑŒ" + AVATAR_BY: "Ðватар" + LAST_BACKUP: "ПоÑледнÑÑ Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐšÐ¾Ð¿Ð¸Ñ" + FULL_NAME: "Полное имÑ" + USERNAME: "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + EMAIL: "Email" + PASSWORD: "Пароль" + TITLE: "Заголовок" + LANGUAGE: "Язык" + ACCOUNT: "Ðккаунт" + EMAIL_VALIDATION_MESSAGE: "Должен быть дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + PASSWORD_VALIDATION_MESSAGE: "Пароль должен Ñодержать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну цифру и одну заглавную и Ñтрочную букву, и по крайней мере 8 или более Ñимволов" + LANGUAGE_HELP: "Выберите предпочитаемый Ñзык" + MEDIA: "Медиа" + DEFAULTS: "По умолчанию" + SITE_TITLE: "Заголовок Сайта" + SITE_TITLE_PLACEHOLDER: "Ðазвание Сайта" + SITE_TITLE_HELP: "Ðазвание Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта по умолчанию, которое чаÑто иÑпользуетÑÑ Ð² темах" + DEFAULT_AUTHOR: "Ðвтор По Умолчанию" + DEFAULT_AUTHOR_HELP: "Ð˜Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° по умолчанию, которое чаÑто иÑпользуетÑÑ Ð² темах или Ñтраницах Ñодержимого" + DEFAULT_EMAIL: "Email По Умолчанию" + DEFAULT_EMAIL_HELP: "Электронной почты по умолчанию, иÑпользуетÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑылки на почту в темах или Ñтраницах" + TAXONOMY_TYPES: "Типы ТакÑономии" + TAXONOMY_TYPES_HELP: "ТакÑÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ñ‚Ð¸Ð¿Ð¾Ð² должна быть определена здеÑÑŒ, еÑли вы хотите иÑпользовать их на Ñтраницах вашего Ñайта" + PAGE_SUMMARY: "Страница Резюме" + ENABLED: "Включено" + ENABLED_HELP: "Включить Ñтраницу резюме (резюме возвращает то же Ñамое, что и Ñодержание Ñтраницы)" + 'YES': "Да" + 'NO': "Ðет" + SUMMARY_SIZE: "Размер Резюме" + SUMMARY_SIZE_HELP: "КоличеÑтво Ñимволов Ñтраницы, чтобы иÑпользовать в качеÑтве резюме ÑодержаниÑ" + FORMAT: "Формат" + FORMAT_HELP: "Короткий = иÑпользовать первое вхождение Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ размер; Длинный = разделитель резюме игнорируетÑÑ" + SHORT: "Короткий" + LONG: "Длинный" + DELIMITER: "Разделитель" + DELIMITER_HELP: "Разделитель Резюме (По умолчанию '===')" + METADATA: "Метаданные" + METADATA_HELP: "По умолчанию Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ…, которые будут отображатьÑÑ Ð½Ð° каждой Ñтранице, еÑли Ñто не определено у Ñтраницы" + NAME: "ИмÑ" + CONTENT: "Содержание" + REDIRECTS_AND_ROUTES: "Редиректы и МаршрутизациÑ" + CUSTOM_REDIRECTS: "ПользовательÑкие Редиректы" + CUSTOM_REDIRECTS_HELP: "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° другие Ñтраницы. ДейÑтвует замена Ñтандартных регулÑрных выражений" + CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/your/redirect" + CUSTOM_ROUTES: "ÐеÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ" + CUSTOM_ROUTES_HELP: "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð°Ð»Ð¸Ñов других Ñтраниц. ДейÑтвует замена Ñтандартных регулÑрных выражений" + CUSTOM_ROUTES_PLACEHOLDER_KEY: "/your/alias" + CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/your/route" + FILE_STREAMS: "Файловые пути" + DEFAULT: "По умолчанию" + PAGE_MEDIA: "Страница Медиа" + OPTIONS: "Опции" + PUBLISHED: "Опубликованный" + PUBLISHED_HELP: "По умолчанию, Ñтраница опубликована, еÑли вы Ñвно не указали что не материал не опубликован или через дату публикации находÑÑÑŒ в будущем, или дату ÑнÑÑ‚Ð¸Ñ Ñ Ð¿ÑƒÐ±Ð»Ð¸Ð°Ñ†Ð¸Ð¸ находÑÑÑŒ в в прошлом" + DATE: "Дата" + DATE_HELP: "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð°Ñ‚Ñ‹ позволÑет Ñпециально уÑтановить дату, ÑвÑзанную Ñ Ñтой Ñтраницей." + PUBLISHED_DATE: "Дата публикации" + PUBLISHED_DATE_HELP: "Можете указать дату автоматичеÑкой публикации." + UNPUBLISHED_DATE: "Дата ÑнÑÑ‚Ð¸Ñ Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸" + UNPUBLISHED_DATE_HELP: "Можете указать дату автоматичеÑкого ÑнÑÑ‚Ð¸Ñ Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸." + ROBOTS: "Робот" + TAXONOMIES: "ТакÑономии" + TAXONOMY: "ТакÑономиÑ" + ADVANCED: "Дополнительно" + SETTINGS: "ÐаÑтройки" + FOLDER_NUMERIC_PREFIX: "ЧиÑловой Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ð°Ð¿ÐºÐ¸" + FOLDER_NUMERIC_PREFIX_HELP: "ЧиÑловой префикÑ, который обеÑпечивает ручное упорÑдочение и подразумевает отображение чиÑла" + FOLDER_NAME: "Ð˜Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸" + FOLDER_NAME_HELP: "Ð˜Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸, которое будут хранитьÑÑ Ð² файловой ÑиÑтеме Ð´Ð»Ñ Ñтой Ñтраницы" + PARENT: "Родитель" + DEFAULT_OPTION_ROOT: "- Корень -" + DEFAULT_OPTION_SELECT: "- Выбрать -" + DISPLAY_TEMPLATE: "Шаблон отображениÑ" + DISPLAY_TEMPLATE_HELP: "Тип Ñтраницы, который определÑет ÐºÐ°ÐºÐ°Ñ Ð²ÐµÑ‚ÐºÐ° шаблона отображает Ñтраницу" + BODY_CLASSES: "КлаÑÑ Ð¡Ñ‚Ñ€Ð°Ð½Ð¸Ñ†Ñ‹" + ORDERING: "ПорÑдок" + PAGE_ORDER: "ПорÑдок Страниц" + OVERRIDES: "ПереопределениÑ" + MENU: "Меню" + MENU_HELP: "Строка, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð² меню. ЕÑли не уÑтановить, будет иÑпользоватьÑÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº." + SLUG: "ÐлиаÑ" + SLUG_HELP: "Эта Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет уÑтановить Ð°Ð»Ð¸Ð°Ñ Ñтраницы (чаÑть URL-адреÑа)" + SLUG_VALIDATE_MESSAGE: "ÐÐ»Ð¸Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑоÑтоÑть только из Ñтрочных алфавитно-цифровых Ñимволов и дефиÑов" + PROCESS: "ПроцеÑÑор" + PROCESS_HELP: "Контроль над тем, как Ñтраницы обрабатываютÑÑ. Может быть уÑтановлен индивидуально Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтраницы" + DEFAULT_CHILD_TYPE: "Тип вложенного Ñлемента" + USE_GLOBAL: "ИÑпользовать Глобальный" + ROUTABLE: "Маршрутизируемый" + ROUTABLE_HELP: "ИÑпользовать маршрутизацию Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñтраницы" + CACHING: "КÑширование" + VISIBLE: "Видимый" + VISIBLE_HELP: "Отображать материал в меню Ñайта или нет" + DISABLED: "Отключено" + ITEMS: "Элементы" + ORDER_BY: "Сортировать по" + ORDER: "ПорÑдок" + FOLDER: "Папка" + ASCENDING: "По возраÑтанию" + DESCENDING: "По убыванию" + ADD_MODULAR_CONTENT: "Добавить Модульное Содержимое" + PAGE_TITLE: "Заголовок Страницы" + PAGE_TITLE_HELP: "Заголовок Ñтраницы" + PAGE: "Страница" + MODULAR_TEMPLATE: "Шаблон Модульный" + FRONTMATTER: "Ð’Ñтупление" + FILENAME: "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" + PARENT_PAGE: "РодительÑÐºÐ°Ñ Ñтраница" + HOME_PAGE: "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница" + HOME_PAGE_HELP: "Страница Grav, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать в качеÑтве главной Ñтраницы по умолчанию" + DEFAULT_THEME: "Тема по умолчанию" + DEFAULT_THEME_HELP: "УÑтановите тему по умолчанию Ð´Ð»Ñ Grav (по умолчанию Ñто Antimatter)" + TIMEZONE: "ЧаÑовой поÑÑ" + TIMEZONE_HELP: "Измененить значение по умолчанию чаÑового поÑÑа Ñервера" + SHORT_DATE_FORMAT: "Краткий формат даты" + SHORT_DATE_FORMAT_HELP: "УÑтановить короткий формат даты, который может быть иÑпользован темами" + LONG_DATE_FORMAT: "Длинный формат даты" + LONG_DATE_FORMAT_HELP: "Задайте длинный формат даты, который может быть иÑпользован темами" + DEFAULT_ORDERING: "ПорÑдок по умолчанию" + DEFAULT_ORDERING_HELP: "Страницы в ÑпиÑке будут выводитьÑÑ Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ Ñтого порÑдка, еÑли он не переопределен." + DEFAULT_ORDERING_DEFAULT: "По умолчанию - в завиÑимоÑти от имени папки" + DEFAULT_ORDERING_FOLDER: "Папка - в завиÑимоÑти от приÑтавки имени папки" + DEFAULT_ORDERING_TITLE: "Заголовок - в завиÑимоÑти от Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°" + DEFAULT_ORDERING_DATE: "Дата - в завиÑимоÑти от Ð¿Ð¾Ð»Ñ Ð´Ð°Ñ‚Ñ‹" + DEFAULT_ORDER_DIRECTION: "ПорÑдок Ñортировки по умолчанию" + DEFAULT_ORDER_DIRECTION_HELP: "Ðаправление Ñортировки Ñтраниц в ÑпиÑке материалов" + DEFAULT_PAGE_COUNT: "КоличеÑтво Ñтраниц по умолчанию" + DEFAULT_PAGE_COUNT_HELP: "МакÑимальное количеÑтво Ñтраниц в ÑпиÑке по умолчанию " + DATE_BASED_PUBLISHING: "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° оÑнове даты" + DATE_BASED_PUBLISHING_HELP: "ÐвтоматичеÑки (не)публикует поÑты на оÑнове их даты" + EVENTS: "Событие" + EVENTS_HELP: "Включить или отключить ÑпецифичеÑкие ÑобытиÑ. Отключение Ñтих Ñобытий можно привеÑти к ошибкам в работе плагинов" + REDIRECT_DEFAULT_ROUTE: "Перенаправление маршрутизатора по умолчанию" + REDIRECT_DEFAULT_ROUTE_HELP: "ÐвтоматичеÑкое перенаправление Ñтраниц ÑоглаÑно маршрутизатору" + LANGUAGES: "Язык" + SUPPORTED: "МультиÑзычноÑть" + SUPPORTED_HELP: "Укажите необходимые вам Ñзыки через запÑтую (пример 'en,fr,de')" + TRANSLATIONS_ENABLED: "Поддержка перевода" + TRANSLATIONS_ENABLED_HELP: "Поддержка в Grav перевода плагинов и раÑширений" + TRANSLATIONS_FALLBACK: "Резервный перевод" + TRANSLATIONS_FALLBACK_HELP: "ИÑпользовать запаÑной вариант перевода, еÑли активный Ñзык не ÑущеÑтвует" + ACTIVE_LANGUAGE_IN_SESSION: "Ðктивный Ñзык в ÑеÑÑии" + ACTIVE_LANGUAGE_IN_SESSION_HELP: "Хранить активный Ñзык в ÑеÑÑии пользователÑ" + HTTP_HEADERS: "HTTP Заголовки" + EXPIRES: "Expires" + EXPIRES_HELP: "УÑтанавливает заголовок Expires. Значение в Ñекундах." + LAST_MODIFIED: "Last modified" + LAST_MODIFIED_HELP: "УÑтанавливает заголовок поÑледнего изменениÑ, который может помочь оптимизировать кÑширование и браузере" + ETAG: "ETag" + ETAG_HELP: "УÑтанавливает заголовок ETag, чтобы помочь определить, когда Ñтраница была изменена" + VARY_ACCEPT_ENCODING: "Vary accept encoding" + VARY_ACCEPT_ENCODING_HELP: "УÑтановите заголовок `Vary: Accept Encoding` Ð´Ð»Ñ Ð¿Ð¾Ð¼Ð¾Ñ‡Ð¸ прокÑи-кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ cdn" + MARKDOWN_EXTRA_HELP: "Включение по умолчанию Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" + AUTO_LINE_BREAKS: "Ðвто разрывы Ñтрок" + AUTO_LINE_BREAKS_HELP: "Включить поддержку автоматичеÑкой линии перерывы в markdown" + AUTO_URL_LINKS: "Ðвто URL ÑÑылки" + AUTO_URL_LINKS_HELP: "Включить автоматичеÑкое преобразование URL в HTML-код гиперÑÑылки" + ESCAPE_MARKUP: "Избегать разметки" + ESCAPE_MARKUP_HELP: "Избегать тегов разметки в HTML объектах" + CACHING_HELP: "Глобальное управлением кÑша выключить/выключить кÑширование Grav" + CACHE_CHECK_METHOD: "Метод проверки кÑша" + CACHE_CHECK_METHOD_HELP: "Выберите метод, который Grav иÑпользует Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, еÑли файлы подкачки были изменены." + CACHE_DRIVER: "Драйвер кÑшированиÑ" + CACHE_DRIVER_HELP: "Выберите метод ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¹ должен иÑпользовать Grav. 'ÐвтоматичеÑкое выбор' CMS попытаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ лучшый метод Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта" + CACHE_PREFIX: "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ ÐºÑша" + CACHE_PREFIX_HELP: "Идентификатор Ð´Ð»Ñ Ñ‡Ð°Ñти ключа Grav. Ðе изменÑйте, еÑли Ð’Ñ‹ не знаете к чему Ñто приведет." + CACHE_PREFIX_PLACEHOLDER: "Производный от базового URL (переопределите, Ð²Ð²ÐµÐ´Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½ÑƒÑŽ Ñтроку)" + LIFETIME: "ПрододжительноÑть жизни" + LIFETIME_HELP: "Задает Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ кÑша в Ñекундах. 0 = беÑконечно" + GZIP_COMPRESSION: "Gzip Ñжатие" + GZIP_COMPRESSION_HELP: "Включить Ñжатие GZip в GRAV Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти загрузки Ñтраниц" + TWIG_TEMPLATING: "Шаблоны Twig" + TWIG_CACHING: "Кеширование Twig" + TWIG_CACHING_HELP: "Управление механизм кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Twig. Включите его Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ðµ ÑкороÑти иÑполнениÑ." + TWIG_DEBUG: "Отладка Twig" + TWIG_DEBUG_HELP: "ПозволÑет не загружаетÑÑ Ñ€Ð°Ñширение отладчика Twig" + DETECT_CHANGES: "Обнаружение изменений" + DETECT_CHANGES_HELP: "Twig автоматичеÑки перекомпилировать кÑш Twig, еÑли он обнаружит какие-либо Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² шаблонах Twig" + AUTOESCAPE_VARIABLES: "Ðвто иÑключение переменных" + AUTOESCAPE_VARIABLES_HELP: "Ðвто иÑключение вÑех переменные. Это Ñкорей вÑего нарушит работу вашего Ñайта." + ASSETS: "Дополнительные библиотеки" + CSS_PIPELINE: "Объединение CSS" + CSS_PIPELINE_HELP: "Позволит объединить неÑколько файлов CSS один." + CSS_MINIFY: "Минимизировать CSS" + CSS_MINIFY_HELP: "Минимизировать в CSS во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±ÐµÐ´Ð¸ÐµÐ½Ð¸Ñ" + CSS_MINIFY_WINDOWS_OVERRIDE: "Минимизировать CSS переопределение Ð´Ð»Ñ Windows." + CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Минимизировать переопределение Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼ Windows. Отключено по умолчанию из-за ThreadStackSize" + CSS_REWRITE: "ПерепиÑать CSS" + CSS_REWRITE_HELP: "ПерепиÑать любые CSS отноÑительные URL-адреÑа во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ" + JAVASCRIPT_PIPELINE: "Объединение JavaScript" + JAVASCRIPT_PIPELINE_HELP: "Объединение неÑкольких JS файлов в один файл" + JAVASCRIPT_MINIFY: "Минимизировать JavaScript" + JAVASCRIPT_MINIFY_HELP: "Минимизировать в JS во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±ÐµÐ´Ð¸ÐµÐ½Ð¸Ñ" + ENABLED_TIMESTAMPS_ON_ASSETS: "Включить временные метки по активам" + ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Включить временные метки активов" + COLLECTIONS: "Коллекции" + ERROR_HANDLER: "Обработчик ошибок" + DISPLAY_ERRORS: "Выводить ошибки" + DISPLAY_ERRORS_HELP: "Отобразить полную цепочку Ñтилей при ошибке на Ñтранице" + LOG_ERRORS: "Логи ошибок" + LOG_ERRORS_HELP: "Логи ошибок находÑÑ‚ÑÑ Ð² папке /logs" + DEBUGGER: "Отладчик" + DEBUGGER_HELP: "Включите отладчик Grav и поÑле параметров наÑтройки" + DEBUG_TWIG: "Отладчик Twig" + DEBUG_TWIG_HELP: "Включите отладчик шаблонов Twig" + SHUTDOWN_CLOSE_CONNECTION: "Завершение открытых Ñоединений" + SHUTDOWN_CLOSE_CONNECTION_HELP: "Закройте Ñоединение до вызова onShutdown(). ложно Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸" + DEFAULT_IMAGE_QUALITY: "КачеÑтво изображений по умолчанию" + DEFAULT_IMAGE_QUALITY_HELP: "КачеÑтво Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ повторной выборки или кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ (85%)" + CACHE_ALL: "КÑшировать вÑе картинки" + CACHE_ALL_HELP: "Выполните вÑе Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· ÑиÑтему кÑша Grav, даже еÑли у них нет взаимодейÑÑ‚Ð²Ð¸Ñ Ð´Ð¸Ñком" + IMAGES_DEBUG: "Отладка водÑного знака изображениÑ" + IMAGES_DEBUG_HELP: "Показать накладку над изображениÑми Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ глубины пикÑÐµÐ»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ работе Ñ Ñеткой" + UPLOAD_LIMIT: "Лимит загрузки файла" + UPLOAD_LIMIT_HELP: "УÑтановите макÑимальный размер в байтах Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ (0 безлимита)" + ENABLE_MEDIA_TIMESTAMP: "Включить временные метки на медиа" + ENABLE_MEDIA_TIMESTAMP_HELP: "ДобавлÑет метку на оÑнове даты поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñлемента в медиа" + SESSION: "СеÑÑиÑ" + SESSION_ENABLED_HELP: "Включить поддержку ÑеÑÑий в рамках Grav" + TIMEOUT: "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ" + TIMEOUT_HELP: "УÑтанавливает тайм-аут ÑеанÑа в Ñекундах" + SESSION_NAME_HELP: "Идентификатор иÑпользуетÑÑ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑеÑÑионной куки" + ABSOLUTE_URLS: "ОбÑалютный путь" + ABSOLUTE_URLS_HELP: "ÐбÑолютных или отноÑительных URL-адреÑов Ð´Ð»Ñ `base_url`" + PARAMETER_SEPARATOR: "Параметр разделителÑ" + PARAMETER_SEPARATOR_HELP: "Разделитель Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°ÐµÐ¼Ñ‹Ñ… параметров, которые могут быть изменены Ð´Ð»Ñ Apache на Windows" + TASK_COMPLETED: "Задача завершена" + EVERYTHING_UP_TO_DATE: "Ð’Ñе актуально" + UPDATES_ARE_AVAILABLE: "Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны" + IS_AVAILABLE_FOR_UPDATE: "доÑтупно Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ" + IS_NOW_AVAILABLE: "теперь доÑтупно" + CURRENT: "Текущий" + UPDATE_GRAV_NOW: "Обновить Grav ÑейчаÑ" + GRAV_SYMBOLICALLY_LINKED: "Grav Ñимволично ÑвÑзаны. Обновление не будет доÑтупно" + UPDATING_PLEASE_WAIT: "Обновление... ПожалуйÑта, подождите, загрузка" + OF_THIS: "Ñтого" + OF_YOUR: "из ваших" + HAVE_AN_UPDATE_AVAILABLE: "еÑть доÑтупное обновление" + SAVE_AS: "Сохранить как" + MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: "Ð’Ñ‹ уверены, что хотите удалить Ñту Ñтраницу и вÑе вложенные? ЕÑли Ñтраница переведена на другие Ñзыки, Ñти переводы будут Ñохранены и должны быть удалены отдельно. Ð’ противном Ñлучае папка Ñтраницы будет удалена вмеÑте Ñо Ñвоими подÑтраницами. Это дейÑтвие не может быть отменено." + AND: "и" + UPDATE_AVAILABLE: "ДоÑтупно обновление" + METADATA_KEY: "Ключ (например 'Ключевые Ñлова')" + METADATA_VALUE: "Значение (например 'Blog, Grav')" + USERNAME_HELP: "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть от 3 до 16 Ñимволов, в том чиÑле Ñтрочных букв, цифр, Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¸ дефиÑа. ПропиÑные буквы, пробелы и Ñпециальные Ñимволы не допуÑкаютÑÑ" + FULLY_UPDATED: "ПолноÑтью Обновлено" + SAVE_LOCATION: "Сохранить раÑположение" + PAGE_FILE: "Шаблон Ñтраницы" + PAGE_FILE_HELP: "Тип Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñтраницы, по умолчанию шаблон Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтой Ñтраницы" + NO_USER_ACCOUNTS: "Учетные запиÑи не найдены, пожалуйÑта Ñоздайте первую запиÑÑŒ..." + REDIRECT_TRAILING_SLASH: "Перенаправление замыкающей ÑлÑш" + REDIRECT_TRAILING_SLASH_HELP: "Выполните 301 редирект на замыкающий ÑлÑш." + DEFAULT_DATE_FORMAT: "Формат Даты" + DEFAULT_DATE_FORMAT_HELP: "Страница формата даты, иÑпользуемого в Grav. По умолчанию, Grav пытаетÑÑ ÑƒÐ³Ð°Ð´Ð°Ñ‚ÑŒ правильный формат даты, однако вы можете выбирать Формат Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ РÐР ÑинтакÑÐ¸Ñ Ð”Ð°Ñ‚Ð° (например: Г-М-Д ч:м)" + DEFAULT_DATE_FORMAT_PLACEHOLDER: "ОпределÑет автоматичеÑки еÑли пуÑто" + IGNORE_FILES: "Игнорировать файлы" + IGNORE_FILES_HELP: "Файлы, которые будут проигнорированы при обработке Ñтраниц" + IGNORE_FOLDERS: "Игнорировать папки" + IGNORE_FOLDERS_HELP: "Папки, которые будут проигнорированы при обработке Ñтраниц" + HTTP_ACCEPT_LANGUAGE: "ОпределÑть Ñзык браузера" + HTTP_ACCEPT_LANGUAGE_HELP: "Ð’Ñ‹ можете разрешить попытатьÑÑ ÑƒÑтановить Ñзык на оÑнове 'http_accept_language' тега заголовка в браузере пользователÑ" + OVERRIDE_LOCALE: "Переопределение локали" + OVERRIDE_LOCALE_HELP: "Переопределите Ñзыковой локали в PHP на оÑнове текущего Ñзыка" + REDIRECT: "Страница редиректа" + REDIRECT_HELP: "Введите Ð°Ð´Ñ€ÐµÑ Ñтраницы или внешний URL Ð´Ð»Ñ Ñтраницы Ñайта, чтобы перенаправить например, '/some/route' или 'http://somesite.com'" + PLUGIN_STATUS: "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°" + INCLUDE_DEFAULT_LANG: "Включить Ñзык по умочанию" + INCLUDE_DEFAULT_LANG_HELP: "Это позволит добавить вÑе URL-адреÑа по умолчанию, Ñзык по умолчанию. Ðапример, `/en/blog/my-post`" + ALLOW_URL_TAXONOMY_FILTERS: "URL Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð² такÑономии" + ALLOW_URL_TAXONOMY_FILTERS_HELP: "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ñтраница Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð²`/taxonomy:value`." + REDIRECT_DEFAULT_CODE: "Перенаправление по умолчанию" + REDIRECT_DEFAULT_CODE_HELP: "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° HTTP при перенаправлении URL" + IGNORE_HIDDEN: "Игнорировать Ñкрытые" + IGNORE_HIDDEN_HELP: "Игнорировать вÑе Ñкрытые файлы и папки" diff --git a/user/plugins/admin/pages/admin/backup.md b/user/plugins/admin/pages/admin/backup.md new file mode 100644 index 0000000..37a26a4 --- /dev/null +++ b/user/plugins/admin/pages/admin/backup.md @@ -0,0 +1,8 @@ +--- +title: Backup +template: ajax + +access: + admin.maintenance: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/cache.md b/user/plugins/admin/pages/admin/cache.md new file mode 100644 index 0000000..a8bc331 --- /dev/null +++ b/user/plugins/admin/pages/admin/cache.md @@ -0,0 +1,7 @@ +--- +title: Cache + +access: + admin.cache: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/dashboard.md b/user/plugins/admin/pages/admin/dashboard.md new file mode 100644 index 0000000..eb1f7e2 --- /dev/null +++ b/user/plugins/admin/pages/admin/dashboard.md @@ -0,0 +1,91 @@ +--- +title: Dashboard + +access: + admin.login: true + admin.super: true +--- + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/user/plugins/admin/pages/admin/denied.md b/user/plugins/admin/pages/admin/denied.md new file mode 100644 index 0000000..1dc329d --- /dev/null +++ b/user/plugins/admin/pages/admin/denied.md @@ -0,0 +1,4 @@ +--- +title: Access Denied +--- + diff --git a/user/plugins/admin/pages/admin/forgot.md b/user/plugins/admin/pages/admin/forgot.md new file mode 100644 index 0000000..85a816e --- /dev/null +++ b/user/plugins/admin/pages/admin/forgot.md @@ -0,0 +1,11 @@ +--- +title: Forgot password + +form: + fields: + - name: username + type: text + placeholder: Username + autofocus: true +--- + diff --git a/user/plugins/admin/pages/admin/info.md b/user/plugins/admin/pages/admin/info.md new file mode 100644 index 0000000..cd08494 --- /dev/null +++ b/user/plugins/admin/pages/admin/info.md @@ -0,0 +1,7 @@ +--- +title: PHP Info + +access: + admin.settings: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/installer.md b/user/plugins/admin/pages/admin/installer.md new file mode 100644 index 0000000..85a7d08 --- /dev/null +++ b/user/plugins/admin/pages/admin/installer.md @@ -0,0 +1,7 @@ +--- +title: Installer + +access: + admin.install: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/login.md b/user/plugins/admin/pages/admin/login.md new file mode 100644 index 0000000..80c7cb8 --- /dev/null +++ b/user/plugins/admin/pages/admin/login.md @@ -0,0 +1,15 @@ +--- +title: Dashboard Login + +form: + fields: + - name: username + type: text + placeholder: Username + autofocus: true + + - name: password + type: password + placeholder: Password +--- + diff --git a/user/plugins/admin/pages/admin/logout.md b/user/plugins/admin/pages/admin/logout.md new file mode 100644 index 0000000..371ebd8 --- /dev/null +++ b/user/plugins/admin/pages/admin/logout.md @@ -0,0 +1,14 @@ +--- +title: Dashboard Logout + +form: + fields: + - name: username + type: text + placeholder: Username + autofocus: true + + - name: password + type: password + placeholder: Password +--- diff --git a/user/plugins/admin/pages/admin/logs.md b/user/plugins/admin/pages/admin/logs.md new file mode 100644 index 0000000..58d6435 --- /dev/null +++ b/user/plugins/admin/pages/admin/logs.md @@ -0,0 +1,7 @@ +--- +title: Error Log + +access: + admin.logs: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/media.md b/user/plugins/admin/pages/admin/media.md new file mode 100644 index 0000000..c0e358b --- /dev/null +++ b/user/plugins/admin/pages/admin/media.md @@ -0,0 +1,7 @@ +--- +title: Media + +access: + admin.pages: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/pages-filter.md b/user/plugins/admin/pages/admin/pages-filter.md new file mode 100644 index 0000000..7a7463e --- /dev/null +++ b/user/plugins/admin/pages/admin/pages-filter.md @@ -0,0 +1,7 @@ +--- +title: Pages Filter + +access: + admin.pages: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/pages.md b/user/plugins/admin/pages/admin/pages.md new file mode 100644 index 0000000..b1f7fc4 --- /dev/null +++ b/user/plugins/admin/pages/admin/pages.md @@ -0,0 +1,7 @@ +--- +title: Pages + +access: + admin.pages: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/plugins.md b/user/plugins/admin/pages/admin/plugins.md new file mode 100644 index 0000000..d61155f --- /dev/null +++ b/user/plugins/admin/pages/admin/plugins.md @@ -0,0 +1,7 @@ +--- +title: Plugins + +access: + admin.plugins: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/reset.md b/user/plugins/admin/pages/admin/reset.md new file mode 100644 index 0000000..092b4e5 --- /dev/null +++ b/user/plugins/admin/pages/admin/reset.md @@ -0,0 +1,17 @@ +--- +title: Reset password + +form: + fields: + - name: username + type: text + placeholder: Username + readonly: true + - name: password + type: password + placeholder: Password + autofocus: true + - name: token + type: hidden +--- + diff --git a/user/plugins/admin/pages/admin/site.md b/user/plugins/admin/pages/admin/site.md new file mode 100644 index 0000000..699bf79 --- /dev/null +++ b/user/plugins/admin/pages/admin/site.md @@ -0,0 +1,7 @@ +--- +title: Site Settings + +access: + admin.settings: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/statistics.md b/user/plugins/admin/pages/admin/statistics.md new file mode 100644 index 0000000..9a6f968 --- /dev/null +++ b/user/plugins/admin/pages/admin/statistics.md @@ -0,0 +1,7 @@ +--- +title: Statistics + +access: + admin.statistics: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/system.md b/user/plugins/admin/pages/admin/system.md new file mode 100644 index 0000000..f38e9b8 --- /dev/null +++ b/user/plugins/admin/pages/admin/system.md @@ -0,0 +1,7 @@ +--- +title: Configuration + +access: + admin.configuration: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/themes.md b/user/plugins/admin/pages/admin/themes.md new file mode 100644 index 0000000..57d6217 --- /dev/null +++ b/user/plugins/admin/pages/admin/themes.md @@ -0,0 +1,7 @@ +--- +title: Grav Themes + +access: + admin.themes: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/update.md b/user/plugins/admin/pages/admin/update.md new file mode 100644 index 0000000..b5437c4 --- /dev/null +++ b/user/plugins/admin/pages/admin/update.md @@ -0,0 +1,7 @@ +--- +title: Cache + +access: + admin.maintenance: true + admin.super: true +--- diff --git a/user/plugins/admin/pages/admin/users.md b/user/plugins/admin/pages/admin/users.md new file mode 100644 index 0000000..91a6a69 --- /dev/null +++ b/user/plugins/admin/pages/admin/users.md @@ -0,0 +1,7 @@ +--- +title: Users + +access: + admin.users: true + admin.super: true +--- diff --git a/user/plugins/admin/themes/grav/css-compiled/nucleus.css b/user/plugins/admin/themes/grav/css-compiled/nucleus.css new file mode 100644 index 0000000..59bc6b4 --- /dev/null +++ b/user/plugins/admin/themes/grav/css-compiled/nucleus.css @@ -0,0 +1,626 @@ +*, *::before, *::after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +@-webkit-viewport { + width: device-width; } +@-moz-viewport { + width: device-width; } +@-ms-viewport { + width: device-width; } +@-o-viewport { + width: device-width; } +@viewport { + width: device-width; } +html { + font-size: 100%; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +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: transparent; + text-decoration: none; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: 1px dotted; } + +b, +strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +mark { + background: #ff0; + color: #000; } + +sub, +sup { + font-size: 0.75rem; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + border: 0; + max-width: 100%; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + height: 0; } + +pre { + overflow: auto; } + +code, +kbd, +pre, +samp { + font-size: 1rem; } + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; } + +button { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], +html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-appearance: textfield; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +legend { + border: 0; + padding: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; + width: 100%; } + +tr, td, th { + vertical-align: middle; } + +th, td { + padding: 0.425rem 0; } + +th { + text-align: left; } + +.container { + width: 75em; + margin: 0 auto; + padding: 0; } + @media only all and (min-width: 60em) and (max-width: 74.938em) { + .container { + width: 60em; } } + @media only all and (min-width: 48em) and (max-width: 59.938em) { + .container { + width: 48em; } } + @media only all and (min-width: 30.063em) and (max-width: 47.938em) { + .container { + width: 30em; } } + @media only all and (max-width: 30em) { + .container { + width: 100%; } } + +.grid { + display: -webkit-box; + display: -moz-box; + display: box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row; + -moz-flex-flow: row; + flex-flow: row; + list-style: none; + margin: 0; + padding: 0; } + @media only all and (max-width: 47.938em) { + .grid { + -webkit-flex-flow: row wrap; + -moz-flex-flow: row wrap; + flex-flow: row wrap; } } + +.block { + -webkit-box-flex: 1; + -moz-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; } + @media only all and (max-width: 47.938em) { + .block { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 100%; + -moz-flex: 0 100%; + -ms-flex: 0 100%; + flex: 0 100%; } } + +.content { + margin: 0.625rem; + padding: 0.938rem; } + +@media only all and (max-width: 47.938em) { + body [class*="size-"] { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 100%; + -moz-flex: 0 100%; + -ms-flex: 0 100%; + flex: 0 100%; } } + +.size-1-2 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 50%; + -moz-flex: 0 50%; + -ms-flex: 0 50%; + flex: 0 50%; } + +.size-1-3 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 33.33333%; + -moz-flex: 0 33.33333%; + -ms-flex: 0 33.33333%; + flex: 0 33.33333%; } + +.size-1-4 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 25%; + -moz-flex: 0 25%; + -ms-flex: 0 25%; + flex: 0 25%; } + +.size-1-5 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 20%; + -moz-flex: 0 20%; + -ms-flex: 0 20%; + flex: 0 20%; } + +.size-1-6 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 16.66667%; + -moz-flex: 0 16.66667%; + -ms-flex: 0 16.66667%; + flex: 0 16.66667%; } + +.size-1-7 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 14.28571%; + -moz-flex: 0 14.28571%; + -ms-flex: 0 14.28571%; + flex: 0 14.28571%; } + +.size-1-8 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 12.5%; + -moz-flex: 0 12.5%; + -ms-flex: 0 12.5%; + flex: 0 12.5%; } + +.size-1-9 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 11.11111%; + -moz-flex: 0 11.11111%; + -ms-flex: 0 11.11111%; + flex: 0 11.11111%; } + +.size-1-10 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 10%; + -moz-flex: 0 10%; + -ms-flex: 0 10%; + flex: 0 10%; } + +.size-1-11 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 9.09091%; + -moz-flex: 0 9.09091%; + -ms-flex: 0 9.09091%; + flex: 0 9.09091%; } + +.size-1-12 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 8.33333%; + -moz-flex: 0 8.33333%; + -ms-flex: 0 8.33333%; + flex: 0 8.33333%; } + +@media only all and (min-width: 48em) and (max-width: 59.938em) { + .size-tablet-1-2 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 50%; + -moz-flex: 0 50%; + -ms-flex: 0 50%; + flex: 0 50%; } + + .size-tablet-1-3 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 33.33333%; + -moz-flex: 0 33.33333%; + -ms-flex: 0 33.33333%; + flex: 0 33.33333%; } + + .size-tablet-1-4 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 25%; + -moz-flex: 0 25%; + -ms-flex: 0 25%; + flex: 0 25%; } + + .size-tablet-1-5 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 20%; + -moz-flex: 0 20%; + -ms-flex: 0 20%; + flex: 0 20%; } + + .size-tablet-1-6 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 16.66667%; + -moz-flex: 0 16.66667%; + -ms-flex: 0 16.66667%; + flex: 0 16.66667%; } + + .size-tablet-1-7 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 14.28571%; + -moz-flex: 0 14.28571%; + -ms-flex: 0 14.28571%; + flex: 0 14.28571%; } + + .size-tablet-1-8 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 12.5%; + -moz-flex: 0 12.5%; + -ms-flex: 0 12.5%; + flex: 0 12.5%; } + + .size-tablet-1-9 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 11.11111%; + -moz-flex: 0 11.11111%; + -ms-flex: 0 11.11111%; + flex: 0 11.11111%; } + + .size-tablet-1-10 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 10%; + -moz-flex: 0 10%; + -ms-flex: 0 10%; + flex: 0 10%; } + + .size-tablet-1-11 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 9.09091%; + -moz-flex: 0 9.09091%; + -ms-flex: 0 9.09091%; + flex: 0 9.09091%; } + + .size-tablet-1-12 { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + -webkit-flex: 0 8.33333%; + -moz-flex: 0 8.33333%; + -ms-flex: 0 8.33333%; + flex: 0 8.33333%; } } +@media only all and (max-width: 47.938em) { + @supports not (flex-wrap: wrap) { + .grid { + display: block; + -webkit-box-lines: inherit; + -moz-box-lines: inherit; + box-lines: inherit; + -webkit-flex-wrap: inherit; + -moz-flex-wrap: inherit; + -ms-flex-wrap: inherit; + flex-wrap: inherit; } + + .block { + display: block; + -webkit-box-flex: inherit; + -moz-box-flex: inherit; + box-flex: inherit; + -webkit-flex: inherit; + -moz-flex: inherit; + -ms-flex: inherit; + flex: inherit; } } } +.first-block { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; } + +.last-block { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + +.fixed-blocks { + -webkit-flex-flow: row wrap; + -moz-flex-flow: row wrap; + flex-flow: row wrap; } + .fixed-blocks .block { + -webkit-box-flex: inherit; + -moz-box-flex: inherit; + box-flex: inherit; + -webkit-flex: inherit; + -moz-flex: inherit; + -ms-flex: inherit; + flex: inherit; + width: 25%; } + @media only all and (min-width: 60em) and (max-width: 74.938em) { + .fixed-blocks .block { + width: 33.33333%; } } + @media only all and (min-width: 48em) and (max-width: 59.938em) { + .fixed-blocks .block { + width: 50%; } } + @media only all and (max-width: 47.938em) { + .fixed-blocks .block { + width: 100%; } } + +@supports not (flex-wrap: wrap) { + .fixed-blocks { + display: block; + -webkit-flex-flow: inherit; + -moz-flex-flow: inherit; + flex-flow: inherit; } } +body { + font-size: 1rem; + line-height: 1.7; } + +h1, h2, h3, h4, h5, h6 { + margin: 1.7rem 0 0.85rem 0; + text-rendering: optimizeLegibility; } + +h1 { + font-size: 3.2rem; } + +h2 { + font-size: 2.5rem; } + +h3 { + font-size: 2.1rem; } + +h4 { + font-size: 1.75rem; } + +h5 { + font-size: 1.35rem; } + +h6 { + font-size: 0.85rem; } + +p { + margin: 0.85rem 0 1.7rem; } + +ul, ol { + margin-top: 1.7rem; + margin-bottom: 1.7rem; } + ul ul, ul ol, ol ul, ol ol { + margin-top: 0; + margin-bottom: 0; } + +blockquote { + margin: 1.7rem 0; + padding-left: 0.85rem; } + +cite { + display: block; + font-size: 0.875rem; } + cite:before { + content: "\2014 \0020"; } + +pre { + margin: 1.7rem 0; + padding: 0.938rem; } + +code { + vertical-align: bottom; } + +small { + font-size: 0.875rem; } + +hr { + border-left: none; + border-right: none; + border-top: none; + margin: 1.7rem 0; } + +fieldset { + border: 0; + padding: 0.938rem; + margin: 0 0 1.7rem 0; } + +input, +label, +select { + display: block; } + +label { + margin-bottom: 0.425rem; } + label.required:after { + content: "*"; } + label abbr { + display: none; } + +textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { + -webkit-transition: border-color; + -moz-transition: border-color; + transition: border-color; + border-radius: 0.1875rem; + padding: 0.425rem 0.425rem; + width: 100%; } + textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + outline: none; } + +textarea { + resize: vertical; } + +input[type="checkbox"], input[type="radio"] { + display: inline; + margin-right: 0.425rem; } + +input[type="file"] { + width: 100%; } + +select { + width: auto; + max-width: 100%; + margin-bottom: 1.7rem; } + +button, +input[type="submit"] { + cursor: pointer; + user-select: none; + vertical-align: middle; + white-space: nowrap; + border: inherit; } + +/*# sourceMappingURL=nucleus.css.map */ diff --git a/user/plugins/admin/themes/grav/css-compiled/nucleus.css.map b/user/plugins/admin/themes/grav/css-compiled/nucleus.css.map new file mode 100644 index 0000000..53f5ad1 --- /dev/null +++ b/user/plugins/admin/themes/grav/css-compiled/nucleus.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/nucleus/_core.scss","../scss/vendor/bourbon/addons/_prefixer.scss","../scss/configuration/nucleus/_typography.scss","../scss/nucleus/_flex.scss","../scss/configuration/nucleus/_breakpoints.scss","../scss/nucleus/mixins/_breakpoints.scss","../scss/vendor/bourbon/css3/_flex-box.scss","../scss/configuration/nucleus/_layout.scss","../scss/nucleus/_typography.scss","../scss/nucleus/_forms.scss","../scss/configuration/nucleus/_core.scss"], +"names": [], +"file": "nucleus.css" +} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css-compiled/template.css b/user/plugins/admin/themes/grav/css-compiled/template.css new file mode 100644 index 0000000..7e3210a --- /dev/null +++ b/user/plugins/admin/themes/grav/css-compiled/template.css @@ -0,0 +1,2 @@ +@import url(//fonts.googleapis.com/css?family=Montserrat:400|Lato:300,400,700|Ubuntu+Mono:400,700);#admin-login,#admin-logo h3,#admin-main .titlebar h1,#admin-main .titlebar .button-bar,#admin-main .flush-bottom.button-bar .button,#admin-main .danger.button-bar .button,#admin-main .success.button-bar .button,#admin-dashboard #updates .numeric,#admin-dashboard #popularity .stat,#admin-topbar #admin-mode-toggle,#admin-topbar #admin-lang-toggle{position:relative;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-o-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.button{display:inline-block;padding:0.3rem 1.5rem;font-weight:300;-webkit-font-smoothing:auto;cursor:pointer;vertical-align:middle;font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif}.button:active{margin:1px 0 -1px 0}.button i{margin-right:5px}.button-small.button{padding:2px 10px;font-size:1rem}.button-x-small.button{padding:2px 8px 2px 5px;font-size:0.9rem}html,body{height:100%}body{background:#314D5B;color:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:#0082BA}a:hover{color:#003b54}b,strong{font-weight:600}.bigger{font-size:1.2rem}.button-bar{text-align:right;float:right;z-index:2}.secondary-accent{background:#349886;color:#fff}.secondary-accent .button-bar{background:#349886}.secondary-accent .button{background:#41bea8}.tertiary-accent{background:#2693B7;color:#fff}.tertiary-accent .button-bar{background:#2693B7}.tertiary-accent .button{background:#2aa4cc;background:#3aafd6;color:rgba(255,255,255,0.85);border-radius:4px}.tertiary-accent .button:hover{background:#4fb8da;color:#fff}.tertiary-accent .button.dropdown-toggle{background:#4fb8da;border-left:1px solid #2aa4cc}.alert{font-size:1.1rem;padding:1rem 3rem}.info{background:#9055AF;color:#fff}.info a{color:#e6e6e6}.info a:hover{color:#fff}.info-reverse{color:#9055AF}.notice{background:#2693B7;color:#fff}.notice a{color:#e6e6e6}.notice a:hover{color:#fff}.error{background:#DA4B46;color:#fff}.error a{color:#e6e6e6}.error a:hover{color:#fff}.badge{display:inline-block;font-size:0.9rem;font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:700;border-radius:10px;padding:0px 6px;min-width:20px;line-height:20px;text-align:center}.default-animation,.tab-bar span,.tab-bar a,.form-tabs>label{-webkit-transition:all 0.5s ease;-moz-transition:all 0.5s ease;transition:all 0.5s ease}.default-border-radius{border-radius:4px}.default-glow-shadow{box-shadow:0 0 20px rgba(0,0,0,0.2)}.default-box-shadow{box-shadow:0 10px 20px rgba(0,0,0,0.2)}.padding-horiz{padding-left:7rem;padding-right:7rem}@media only all and (max-width: 59.938em){.padding-horiz{padding-left:4rem;padding-right:4rem}}@media only all and (max-width: 47.938em){.padding-horiz{padding-left:1rem;padding-right:1rem}}.padding-vert{padding-top:3rem;padding-bottom:3rem}body{font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:400}h1,h2,h3,h4,h5,h6{font-family:"Montserrat","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-weight:400;text-rendering:optimizeLegibility;letter-spacing:-0px}body.simple-fonts{font-family:'Helvetica Neue', Helvetica, Arial, sans-serif !important}body.simple-fonts h1,body.simple-fonts h2,body.simple-fonts h3,body.simple-fonts h4,body.simple-fonts h5,body.simple-fonts h6,body.simple-fonts #admin-menu li,body.simple-fonts .button,body.simple-fonts .tab-bar,body.simple-fonts .badge,body.simple-fonts #admin-main .grav-mdeditor-preview,body.simple-fonts .form .note,body.simple-fonts .form-tabs,body.simple-fonts input,body.simple-fonts select,body.simple-fonts textarea,body.simple-fonts button,body.simple-fonts .selectize-input,body.simple-fonts .form-order-wrapper ul#ordering li{font-family:'Helvetica Neue', Helvetica, Arial, sans-serif !important}h1{font-size:3.2rem}@media only all and (max-width: 47.938em){h1{font-size:2.5rem;line-height:1.2;margin-bottom:2.5rem}}@media only all and (min-width: 48em) and (max-width: 59.938em){h2{font-size:2.1rem}}@media only all and (max-width: 47.938em){h2{font-size:2rem}}@media only all and (min-width: 48em) and (max-width: 59.938em){h3{font-size:1.7rem}}@media only all and (max-width: 47.938em){h3{font-size:1.6rem}}@media only all and (min-width: 48em) and (max-width: 59.938em){h4{font-size:1.35rem}}@media only all and (max-width: 47.938em){h4{font-size:1.25rem}}h1{letter-spacing:-3px}h2{letter-spacing:-2px}h3{letter-spacing:-1px}blockquote{border-left:10px solid #F0F2F4}blockquote p{font-size:1.1rem;color:#999}blockquote cite{display:block;text-align:right;color:#666;font-size:1.2rem}blockquote>blockquote>blockquote{margin:0}blockquote>blockquote>blockquote p{padding:15px;display:block;font-size:1rem;margin-top:0rem;margin-bottom:0rem}blockquote>blockquote>blockquote>p{margin-left:-71px;border-left:10px solid #F0AD4E;background:#FCF8F2;color:#df8a13}blockquote>blockquote>blockquote>blockquote>p{margin-left:-94px;border-left:10px solid #D9534F;background:#FDF7F7;color:#b52b27}blockquote>blockquote>blockquote>blockquote>blockquote>p{margin-left:-118px;border-left:10px solid #5BC0DE;background:#F4F8FA;color:#28a1c5}blockquote>blockquote>blockquote>blockquote>blockquote>blockquote>p{margin-left:-142px;border-left:10px solid #5CB85C;background:#F1F9F1;color:#3d8b3d}code,kbd,pre,samp{font-family:"Ubuntu Mono",monospace}code{background:#f9f2f4;color:#9c1d3d}pre{padding:2rem;background:#f6f6f6;border:1px solid #ddd;border-radius:3px}pre code{color:#237794;background:inherit}hr{border-bottom:4px solid #F0F2F4}.label{vertical-align:middle;background:#0082BA;border-radius:100%;color:#fff;height:1rem;min-width:1rem;line-height:1rem;display:inline-block;text-align:center;font-size:0.7rem;font-family:"Montserrat","Helvetica","Tahoma","Geneva","Arial",sans-serif;margin-right:0.75rem}.switch-toggle a,.switch-light span span{display:none}@media only screen{.switch-light{display:inline-block;position:relative;overflow:visible;padding:0;margin-left:100px}.switch-light *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.switch-light a{display:block;-webkit-transition:all 0.1s ease-out;-moz-transition:all 0.1s ease-out;transition:all 0.1s ease-out}.switch-light label,.switch-light>span{vertical-align:middle}.switch-light input:focus ~ a,.switch-light input:focus+label{outline:1px dotted #888}.switch-light label{position:relative;z-index:3;display:block;width:100%}.switch-light input{position:absolute;opacity:0;z-index:5}.switch-light input:checked ~ a{right:0%}.switch-light>span{position:absolute;left:-100px;width:100%;margin:0;padding-right:100px;text-align:left}.switch-light>span span{position:absolute;top:0;left:0;z-index:5;display:block;width:50%;margin-left:100px;text-align:center}.switch-light>span span:last-child{left:50%}.switch-light a{position:absolute;right:50%;top:0;z-index:4;display:block;width:50%;height:100%;padding:0}.switch-toggle{display:inline-block;position:relative;padding:0 !important}.switch-toggle *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.switch-toggle a{display:block;-webkit-transition:all 0.1s ease-out;-moz-transition:all 0.1s ease-out;transition:all 0.1s ease-out}.switch-toggle label,.switch-toggle>span{vertical-align:middle}.switch-toggle input:focus ~ a,.switch-toggle input:focus+label{outline:1px dotted #888}.switch-toggle input{position:absolute;opacity:0}.switch-toggle input+label{position:relative;z-index:2;float:left;height:100%;margin:0;text-align:center}.switch-toggle a{position:absolute;top:0;left:0;padding:0;z-index:1;width:50%;height:100%}.switch-toggle input:last-of-type:checked ~ a{left:50%}.switch-toggle.switch-3 label,.switch-toggle.switch-3 a{width:33.33333%}.switch-toggle.switch-3 input:checked:nth-of-type(2) ~ a{left:33.33333%}.switch-toggle.switch-3 input:checked:last-of-type ~ a{left:66.66667%}.switch-toggle.switch-4 label,.switch-toggle.switch-4 a{width:25%}.switch-toggle.switch-4 input:checked:nth-of-type(2) ~ a{left:25%}.switch-toggle.switch-4 input:checked:nth-of-type(3) ~ a{left:50%}.switch-toggle.switch-4 input:checked:last-of-type ~ a{left:75%}.switch-toggle.switch-5 label,.switch-toggle.switch-5 a{width:20%}.switch-toggle.switch-5 input:checked:nth-of-type(2) ~ a{left:20%}.switch-toggle.switch-5 input:checked:nth-of-type(3) ~ a{left:40%}.switch-toggle.switch-5 input:checked:nth-of-type(4) ~ a{left:60%}.switch-toggle.switch-5 input:checked:last-of-type ~ a{left:80%}.switch-grav{background-color:#fff;border:1px solid #d5d5d5;border-radius:4px}.switch-grav label{color:#737C81;-webkit-transition:color 0.2s ease-out;-moz-transition:color 0.2s ease-out;transition:color 0.2s ease-out;padding:5px 20px}.switch-grav>span span{opacity:0;-webkit-transition:all 0.1s;-moz-transition:all 0.1s;transition:all 0.1s}.switch-grav>span span:first-of-type{opacity:1}.switch-grav a{background:#777;border-radius:3px}.switch-grav.switch-toggle input.highlight:checked ~ a{background:#41bea8}.switch-grav.switch-light input:checked ~ a{background-color:#777}.switch-grav.switch-light input:checked ~ span span:first-of-type{opacity:0}.switch-grav.switch-light input:checked ~ span span:last-of-type{opacity:1}.switch-grav input:checked+label{color:#fff}}@media only screen and (-webkit-max-device-pixel-ratio: 2) and (max-device-width: 1280px){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix infinite 1s}}@-webkit-keyframes webkitSiblingBugfix{from{-webkit-transform:translate3d(0, 0, 0)}to{-webkit-transform:translate3d(0, 0, 0)}}form h1{color:#314D5B;padding:0 3rem 0.5rem;margin:0 0 1rem;border-bottom:3px solid #e1e1e1;font-size:1.5rem;text-align:left;letter-spacing:-1px}form p{padding:0 3rem}form pre{padding:1.5rem 3rem}form .note{font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif;color:#DA4B46}form .form-field{margin-bottom:1rem;padding-left:3rem}form .form-data{padding-right:3rem}form .required{color:#DA4B46;font-family:helvetica, arial;vertical-align:middle;line-height:1;font-size:30px;margin-left:5px}form label{padding:5px 0;font-weight:400;margin:0}form label.toggleable{display:inline}form input,form select,form textarea,form button,form .selectize-input{font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif;font-size:1rem;line-height:1.7;border-radius:4px;-webkit-font-smoothing:antialiased}form .selectize-dropdown{z-index:100000}form .form-column>.form-field.grid{display:block}form .form-column>.form-field.grid>.block{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0;-moz-flex:0;-ms-flex:0;flex:0}form .grid.vertical{-webkit-flex-flow:column;-moz-flex-flow:column;flex-flow:column}form .form-select-wrapper,form .selectize-control.single .selectize-input{position:relative}form .form-select-wrapper:after,form .selectize-control.single .selectize-input:after{margin-top:0;border:0;position:absolute;content:'\f078';font-family:'FontAwesome';right:12px;top:50%;line-height:0;color:#9ba2a6;pointer-events:none}form .selectize-control{height:39px}form .selectize-input{box-shadow:none;color:#737C81;padding:5px 30px 5px 10px;margin:0}form .selectize-input>input{font-size:1rem;line-height:1.7}form .selectize-control.multi .selectize-input{padding:0.425rem 0.425rem}form .selectize-control.multi .selectize-input.has-items{padding-top:6px;padding-bottom:4px}form .selectize-control.multi .selectize-input>div{color:#737C81;border-radius:2px;line-height:1.5}form .selectize-control.multi .selectize-input>div.active{background:#d5d5d5}form .selectize-control.single .selectize-input:after{right:27px}form .selectize-control.single .selectize-input.dropdown-active:after{content:'\f077'}form .x-small{max-width:5rem !important}form .small{max-width:10rem !important}form .medium{max-width:20rem}form .medium textarea{height:7rem}form .large{max-width:30rem !important}form .large textarea{height:10rem}form select{width:100%;border:1px solid #d5d5d5;background:#fff;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:5px 30px 5px 10px;cursor:pointer;margin:0}form input[type=text],form input[type=password],form input[type=email]{width:100%;border:1px solid #d5d5d5;background:#fff}form input[readonly=readonly]{background:#f2f2f2;font-weight:bold}form textarea{width:100%;border:1px solid #d5d5d5;background:#fff}form .form-frontmatter-wrapper{border:1px solid #d5d5d5;border-radius:4px}form .switch-toggle label{cursor:pointer}form .switch-toggle a,form .switch-toggle label{outline:none !important}form .dynfields input[type=text],form [data-grav-field="array"] input[type=text]{width:40%;float:left;margin:0 5px 5px 0}form .dynfields .form-row,form [data-grav-field="array"] .form-row{display:inline-block}form .dynfields .form-row span,form [data-grav-field="array"] .form-row span{padding:0.5rem;display:inline-block;line-height:1.7;cursor:pointer}form .dynfields .form-row.array-field-value_only,form [data-grav-field="array"] .form-row.array-field-value_only{width:100%}form .button-bar{margin-top:1rem;background:#e6e6e6;padding:1.2rem 3rem;width:100%;border-bottom-left-radius:5px;border-bottom-right-radius:5px}form .checkboxes{display:inline-block;padding:5px 0}form .checkboxes label{display:inline;cursor:pointer;position:relative;padding:0 0 0 2rem;margin-right:15px}form .checkboxes label:before{content:"";display:inline-block;width:1.5rem;height:1.5rem;top:50%;left:0;margin-top:-0.75rem;margin-right:10px;position:absolute;background:#fff;border:1px solid #d5d5d5;border-radius:4px}form .checkboxes input[type=checkbox]{display:none}form .checkboxes input[type=checkbox]:checked+label:before{content:"\f00c";font-family:"FontAwesome";font-size:1.2rem;line-height:1;text-align:center}form .checkboxes.toggleable label{margin-right:0}.form-display-wrapper p{padding-left:0;padding-right:0}.form-display-wrapper p:first-child{margin-top:0}.form-frontmatter-wrapper{margin-bottom:3rem}.form-frontmatter-wrapper .dragbar{height:4px;background:#d5d5d5;cursor:row-resize}#frontmatter+.CodeMirror{border-radius:4px;padding:10px;height:130px}.form-order-wrapper ul#ordering{list-style:none;margin:0;padding:0}.form-order-wrapper ul#ordering li{padding:0.2rem 1rem;border-radius:4px;border:1px solid #d5d5d5;background:#f8f8f8;color:#8d959a;margin:3px 0;position:relative;font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif}.form-order-wrapper ul#ordering li.drag-handle{cursor:move;background:#fff;color:#5b6266}.form-order-wrapper ul#ordering li.drag-handle::after{content:'\f0c9';font-family:FontAwesome;position:absolute;right:10px}.form-list-wrapper ul[data-collection-holder]{list-style:none;margin:0;padding:0}.form-list-wrapper ul[data-collection-holder] li{cursor:move;padding:1rem;border-radius:4px;border:1px solid #d5d5d5;background:#f8f8f8;color:#8d959a;margin:3px 0;position:relative;font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif}.form-list-wrapper ul[data-collection-holder] li .item-actions{position:absolute;right:10px;top:4px;color:#5b6266}.form-list-wrapper ul[data-collection-holder] li .item-actions .fa-trash-o{cursor:pointer}.form-list-wrapper .collection-actions{text-align:right}.form-label.block{z-index:10000}.form-label.block:hover{z-index:10005}#admin-main .admin-block h2{font-size:1.25rem;margin:0 0 .5rem;letter-spacing:normal}.form-fieldset{background-color:#f7f7f7;border:2px solid #e1e1e1;margin:1rem 2rem}.form-fieldset--label{background-color:#f3f3f3}.form-fieldset--label:hover,.form-fieldset input:checked+.form-fieldset--label{background-color:#eee}.form-fieldset--label label{display:table;font-size:1.25rem;padding:.5rem 1rem;width:100%}.form-fieldset--label h2{margin:0 !important}.form-fieldset--label .actions{font-size:initial;display:table-cell;text-align:right;vertical-align:middle}.form-fieldset--label+.form-data{margin-top:1rem;padding:0}.form-fieldset--cursor{cursor:pointer}.form-fieldset--info{font-size:small}.form-fieldset>input:checked ~ .form-data,.form-fieldset--collapsible .open,.form-fieldset input:checked ~ .form-label .form-fieldset--collapsible .close{display:block}.form-fieldset>.form-data,.form-fieldset--collapsible .close,.form-fieldset input:checked ~ .form-label .form-fieldset--collapsible .open{display:none}table,tbody,thead{display:inline-block;width:100%}.gpm-details{width:100%;-webkit-box-flex:auto;-moz-box-flex:auto;box-flex:auto;-webkit-flex:auto;-moz-flex:auto;-ms-flex:auto;flex:auto}td{border:0;border-bottom:1px solid #e1e1e1}tr{-webkit-transition:all 0.2s ease;-moz-transition:all 0.2s ease;transition:all 0.2s ease;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-lines:multiple;-moz-box-lines:multiple;box-lines:multiple;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}tr th{display:block;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1;font-weight:bold}tr th:first-child{padding-left:3rem}tr th:last-child{padding-right:3rem}tr td{display:block;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1}tr td.double{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;-webkit-flex:2;-moz-flex:2;-ms-flex:2;flex:2}tr td:first-child{padding-left:3rem}@media only all and (max-width: 47.938em){tr td:first-child{padding-left:.5rem}tr td:first-child .plugin-update-button{float:left}}tr td:last-child,tr td.gpm-actions{padding-right:3rem}tr td.gpm-actions{line-height:1;text-align:right;position:relative}tr td.gpm-actions .gpm-details-expand{position:absolute;top:12px;right:12px}tr td.gpm-details{margin:0;padding:0;background-color:#f7f7f7}@media only all and (max-width: 47.938em){tr td.gpm-details{word-wrap:break-word}}tr td.gpm-details>.table-wrapper{display:none}tr td.gpm-details>.table-wrapper td{border-bottom:0}tr td.gpm-details tbody{width:100%}tr:last-child td{border-bottom:0}tr:hover{background:#f3f3f3}.k-calendar-container table,.k-calendar-container tbody,.k-calendar-container thead{width:100%}.k-calendar-container thead th:first-child{padding-left:0}.k-calendar-container thead th:last-child{padding-right:0.5rem}.button{background:#41bea8;color:rgba(255,255,255,0.85);border-radius:4px}.button:hover{background:#54c5b0;color:#fff}.button.dropdown-toggle{background:#54c5b0;border-left:1px solid #3bab97}.button.dropdown-toggle{border-left:1px solid #3bab97}.button.secondary{background:#2a7a6b;color:rgba(255,255,255,0.85);border-radius:4px}.button.secondary:hover{background:#318d7c;color:#fff}.button.secondary.dropdown-toggle{background:#318d7c;border-left:1px solid #23675a}.button.secondary.dropdown-toggle{border-left:1px solid #318d7c}.button-group{position:relative;display:inline-block;vertical-align:middle}.button-group>.button:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.button-group>.button:first-child{margin-left:0 !important}.button-group>.button{position:relative;float:left}.button-group>.button+.dropdown-toggle{text-align:center;padding-right:8px;padding-left:8px}.button-group>.button+.dropdown-toggle i{margin:0}.button-group>.button:last-child:not(:first-child),.button-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0 !important;border-bottom-left-radius:0 !important}.button-group .button+.button,.button-group .button+.button-group,.button-group .button-group+.button,.button-group .button-group+.button-group{margin-left:-1px}.button-group .dropdown-menu{position:absolute;top:100%;left:0;right: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:#41bea8;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #3bab97;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175)}.button-group .dropdown-menu.language-switcher{min-width:auto}.button-group .dropdown-menu.lang-switcher{min-width:150px;left:inherit}.button-group .dropdown-menu.lang-switcher button{width:100%}.button-group .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#349886}.button-group .dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#fff;white-space:nowrap}.button-group .dropdown-menu li>a:focus,.button-group .dropdown-menu li>a:hover{color:#fff;text-decoration:none;background-color:#349886}.button-group .dropdown-menu.language-switcher a.active{background-color:#349886}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}#error{text-align:center;display:flex;align-items:center;justify-content:center;height:100%;padding-bottom:6rem}#error h1{font-size:5rem}#error p{margin:1rem 0}#admin-login{background:#253A47;max-width:24rem;margin:0 auto}#admin-login .form-field{padding-left:0;margin-bottom:0}#admin-login .form-label{display:none}#admin-login .form-data{padding-right:0}#admin-login h1{background:#21333e url(../images/logo.png) 50% 50% no-repeat;font-size:0;color:transparent;height:216px;margin:0}#admin-login form{padding:2rem 3rem}#admin-login form input{margin-bottom:2rem;background:#314D5B;color:#fff;font-size:1.4rem;line-height:1.5;text-align:center;font-weight:300;-webkit-font-smoothing:auto;border:1px solid #1e2e39}#admin-login form input::-webkit-input-placeholder{color:#83949d}#admin-login form input::-moz-placeholder{color:#83949d}#admin-login form input:-moz-placeholder{color:#83949d}#admin-login form input:-ms-input-placeholder{color:#83949d}#admin-login form .form-actions{text-align:center;margin:0 -3rem -3rem -3rem;padding:1.5rem 3rem}#admin-login form .form-actions button:first-child{margin-right:1rem}#admin-login .alert{text-align:center;padding:1rem 3rem}#admin-sidebar{position:absolute;left:0;top:0;bottom:0;width:20%;background:#253A47}@media only all and (max-width: 47.938em){#admin-sidebar{display:none;width:75%;z-index:999999}}#admin-sidebar a{color:#ccc}#admin-sidebar a:hover{color:#fff}#admin-logo{background:#21333e;height:4.2rem}#admin-logo h3{text-transform:uppercase;margin:0;text-align:center;font-size:1.2rem}#admin-logo h3 i{font-size:1rem;vertical-align:middle;margin-top:-1px}#admin-user-details{padding:2rem;border-bottom:1px solid #21333e;overflow:hidden}#admin-user-details img{-webkit-transition:all 0.5s ease;-moz-transition:all 0.5s ease;transition:all 0.5s ease;border-radius:100%;float:left}@media only all and (min-width: 48em) and (max-width: 59.938em){#admin-user-details img{float:none}}#admin-user-details:hover img{box-shadow:0px 0px 0 50px #2a4251}#admin-user-details .admin-user-names{margin-left:45px}@media only all and (min-width: 48em) and (max-width: 59.938em){#admin-user-details .admin-user-names{margin-left:0}}#admin-user-details .admin-user-names h4,#admin-user-details .admin-user-names h5{color:#e6e6e6;margin:0;font-size:1rem;line-height:1.3}#admin-user-details .admin-user-names h5{font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif;color:#afc7d5;font-size:0.9rem}#admin-menu{display:block;margin:0;padding:0;list-style:none}#admin-menu li{font-family:"Montserrat","Helvetica","Tahoma","Geneva","Arial",sans-serif}#admin-menu li .badges{float:right;margin-right:1rem}#admin-menu li .badges .badge{display:inline-block;margin-right:-5px;color:#e6e6e6}#admin-menu li .badges .count{background-color:#365569}#admin-menu li .badges .updates{background-color:#2693B7;display:none}#admin-menu li .badges.with-updates .count{border-bottom-left-radius:0;border-top-left-radius:0}#admin-menu li .badges.with-updates .updates{border-bottom-right-radius:0;border-top-right-radius:0;display:inline-block}#admin-menu li a{-webkit-transition:all 0.2s ease;-moz-transition:all 0.2s ease;transition:all 0.2s ease;display:block;padding-left:25px;padding-top:0.7rem;padding-bottom:0.7rem;color:#d1dee7}@media only all and (min-width: 48em) and (max-width: 59.938em){#admin-menu li a{padding-left:20px}}#admin-menu li a i{-webkit-transition:all 0.2s ease;-moz-transition:all 0.2s ease;transition:all 0.2s ease;color:#afc7d5;margin-right:8px}@media only all and (min-width: 48em) and (max-width: 59.938em){#admin-menu li a i{display:none}}#admin-menu li a:hover{background:#21333e;color:#fff}#admin-menu li a:hover i{font-size:1.2rem}#admin-menu li.selected a{background:#314D5B;color:#fff;padding-left:16px;border-left:9px solid #349886}@media only all and (min-width: 48em) and (max-width: 59.938em){#admin-menu li.selected a{padding-left:11px}}#admin-menu li.selected a i{color:#e1eaf0}#admin-main{margin-left:20%}@media only all and (max-width: 47.938em){#admin-main{width:100%;margin-left:0}}#admin-main .hint:after,#admin-main [data-hint]:after{font-size:0.9rem;width:400px;line-height:inherit;white-space:normal}#admin-main h1{margin:0;font-size:1.5rem;text-align:left;letter-spacing:-1px}#admin-main .titlebar{position:relative;height:4.2rem;padding:0 3rem}@media only all and (max-width: 47.938em){#admin-main .titlebar h1{-webkit-transform:inherit;-moz-transform:inherit;-ms-transform:inherit;-o-transform:inherit;transform:inherit;top:5px;font-size:1.2rem}#admin-main .titlebar h1>i:first-child:before{content:"\f0c9"}}#admin-main .titlebar .button-bar{padding:0}@media only all and (max-width: 47.938em){#admin-main .titlebar .button-bar{-webkit-transform:inherit;-moz-transform:inherit;-ms-transform:inherit;-o-transform:inherit;transform:inherit;top:inherit;bottom:5px;position:absolute;right:1rem}}#admin-main .titlebar .preview{color:#fff;font-size:90%}#admin-main .titlebar .button{padding:0.3rem 0.6rem}@media only all and (max-width: 47.938em){#admin-main .titlebar .button{padding:0.2rem 0.5rem;font-size:0.9rem}}#admin-main .titlebar .button i{font-size:13px}#admin-main .admin-block .grav-update,#admin-main .admin-block .alert{margin-top:-2rem;margin-bottom:2rem}#admin-main .grav-update{padding:0 3rem;margin-top:-3rem;background:#9055AF;color:#fff}#admin-main .grav-update:after{content:"";display:table;clear:both}#admin-main .grav-update.plugins{padding-right:1rem}#admin-main .grav-update .button{float:right;margin-top:0.6rem;margin-left:1rem;line-height:1.5;background:#73448c;color:rgba(255,255,255,0.85);border-radius:4px}#admin-main .grav-update .button:hover{background:#814c9d;color:#fff}#admin-main .grav-update .button.dropdown-toggle{background:#814c9d;border-left:1px solid #653c7b}#admin-main .grav-update p{line-height:3rem;margin:0}#admin-main .grav-update i{padding-right:0.5rem}#admin-main .grav-update .less{color:rgba(255,255,255,0.75)}#admin-main .grav-update.grav{margin-top:0;-webkit-transition:margin-top 0.15s ease-out;-moz-transition:margin-top 0.15s ease-out;transition:margin-top 0.15s ease-out}@media only all and (max-width: 47.938em){#admin-main .grav-update.grav{position:absolute;z-index:9;bottom:0;width:100%}#admin-main .grav-update.grav p *{display:none}#admin-main .grav-update.grav p{font-size:0}#admin-main .grav-update.grav p button{width:95%;display:inherit;position:absolute;top:0;left:0;margin-left:2.5%;margin-right:2.5%;padding-left:0}}#admin-main .grav-update.grav+.content-padding{top:7.2rem;-webkit-transition:top 0.15s ease-out;-moz-transition:top 0.15s ease-out;transition:top 0.15s ease-out}@media only all and (max-width: 47.938em){#admin-main .grav-update.grav+.content-padding{top:5.2rem;padding-bottom:8rem;padding-top:0rem}}#admin-main .content-padding{position:absolute;top:4.2rem;bottom:0;left:20%;right:0;overflow-y:auto;padding:2.5rem}@media only all and (max-width: 47.938em){#admin-main .content-padding{left:0}}#admin-main .admin-block{background:#eee;color:#737C81;padding:2rem 0}#admin-main .admin-block h1{color:#314D5B;padding:0 3rem 0.5rem;margin:0 0 1rem;border-bottom:3px solid #e1e1e1}@media only all and (max-width: 47.938em){#admin-main .admin-block h1{padding:0 0 0.5rem;margin:0 0 1rem !important;text-indent:3rem}}#admin-main .admin-block h1.no_underline{border-bottom:0}#admin-main .admin-block .button-bar{margin-right:3rem}@media only all and (max-width: 47.938em){#admin-main .admin-block .button-bar{width:100%;margin:-.5rem 0 1rem 0;text-align:center}#admin-main .admin-block .button-bar .button{width:100%}}#admin-main .flush-bottom.button-bar{margin:1rem -2rem -1rem;height:70px;padding:0 1rem;float:none}@media only all and (max-width: 47.938em){#admin-main .flush-bottom.button-bar{height:auto;padding:2rem 1rem 0rem 1rem}}@media only all and (max-width: 47.938em){#admin-main .flush-bottom.button-bar .button{margin-left:0 !important;margin-bottom:.5rem;width:100%}}#admin-main .danger,#admin-main .success{position:relative}#admin-main .danger.button-bar,#admin-main .success.button-bar{margin:2rem 0 -2rem;height:70px;padding:1rem;float:none;background:#e9e9e9}#admin-main .danger.button-bar .button{background:#DA4B46;color:rgba(255,255,255,0.85);border-radius:4px}#admin-main .danger.button-bar .button:hover{background:#de605b;color:#fff}#admin-main .danger.button-bar .button.dropdown-toggle{background:#de605b;border-left:1px solid #d63631}#admin-dashboard:after{content:"";display:table;clear:both}#admin-dashboard .dashboard-item{float:left;width:50%;margin-bottom:2.5rem}@media only all and (max-width: 47.938em){#admin-dashboard .dashboard-item{width:100%}}#admin-dashboard .dashboard-item>div{padding:1rem 2rem}#admin-dashboard .dashboard-left{padding-right:1.25rem}@media only all and (max-width: 47.938em){#admin-dashboard .dashboard-left{padding-right:0rem}}#admin-dashboard .dashboard-right{padding-left:1.25rem}@media only all and (max-width: 47.938em){#admin-dashboard .dashboard-right{padding-left:0rem}}#admin-dashboard #updates p{text-align:center;color:rgba(255,255,255,0.96);margin:0}#admin-dashboard #updates .updates-chart{width:50%;float:left}#admin-dashboard #updates .chart-wrapper{position:relative}#admin-dashboard #updates .backups-chart{position:relative;width:50%;float:left}#admin-dashboard #updates .numeric{display:block;position:absolute;width:100%;text-align:center;font-size:1.7rem;line-height:1}#admin-dashboard #updates .numeric em{display:block;font-style:normal;font-size:1rem;color:rgba(255,255,255,0.85)}#admin-dashboard #updates .admin-update-charts{min-height:191px}#admin-dashboard #updates .admin-update-charts:after{content:"";display:table;clear:both}#admin-dashboard #updates .button{margin-left:0.5rem}@media only all and (min-width: 48em) and (max-width: 59.938em){#admin-dashboard #updates .button{width:49%;padding:.3rem 0rem;margin-left:0}}#admin-dashboard #popularity p{text-align:center;color:rgba(255,255,255,0.95);margin:0}#admin-dashboard #popularity .button-bar{height:100px;padding:0 1rem}#admin-dashboard #popularity .stat{display:block;float:left;width:33%;text-align:center}#admin-dashboard #popularity .stat b{display:block;font-size:2.5rem;line-height:1;font-weight:300}#admin-dashboard #popularity .stat i{display:block;font-style:normal;color:rgba(255,255,255,0.75)}#admin-dashboard .tertiary-accent{background-color:#2693B7;background-image:-webkit-linear-gradient(#2693B7,#64c0df);background-image:linear-gradient(#2693B7,#64c0df)}#admin-dashboard .secondary-accent{background-color:#349886;background-image:-webkit-linear-gradient(#349886,#67cbb9);background-image:linear-gradient(#349886,#67cbb9)}.no-flick,.card-item{-webkit-transform:translate3d(0, 0, 0)}.card-row{-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.card-item{overflow:hidden;padding:1rem;margin:0;position:relative;width:31%;border:1px solid #e1e1e1;background:#fff;margin-bottom:2rem}@media only all and (min-width: 48em) and (max-width: 59.938em){.card-item{width:48%}}@media only all and (max-width: 47.938em){.card-item{width:100%}}.card-item h4{font-size:1.2rem;line-height:1.2}.user-details{text-align:center}.user-details img{border-radius:100%}.user-details h2{margin:0;font-size:1.8rem}.user-details h5{color:#8d959a;font-size:1.1rem;margin:0}#footer{text-align:center;padding:3rem 0 1rem}.ct-chart .ct-series .ct-bar{stroke-width:20px}.ct-chart .ct-series.ct-series-a .ct-bar{stroke:rgba(255,255,255,0.85) !important}.ct-chart .ct-series.ct-series-a .ct-slice-donut{stroke:#fff !important}.ct-chart .ct-series.ct-series-b .ct-slice-donut{stroke:rgba(255,255,255,0.2) !important}#popularity .ct-chart{margin:0 -10px -10px}#popularity .ct-chart .ct-chart-bar{padding:10px}#latest .page-title,#latest .page-route{overflow:auto}#latest .last-modified{padding-left:10px}#overlay{position:fixed;width:25%;height:100%;z-index:999999;left:75%;top:0;display:none}.pages-list{list-style:none;margin:0;padding:0;border-top:1px solid #e1e1e1}.pages-list ul{list-style:none;margin:0;padding:0}.pages-list li{margin:0;padding:0}.pages-list .row{-webkit-transition:all 0.2s ease;-moz-transition:all 0.2s ease;transition:all 0.2s ease;border-bottom:1px solid #e1e1e1;line-height:2.5rem;padding-right:3rem}.pages-list .row:hover{background:#f3f3f3}.pages-list .row p.page-route{display:block;margin:-10px 0 5px 25px;line-height:1;font-size:0.9rem;color:#888;text-shadow:1px 1px 0 #fff}.pages-list .row p.page-route .spacer{color:#d5d5d5;display:inline-block;margin:0 0.3rem}.pages-list .row .hint--bottom:before,.pages-list .row .hint--bottom:after{left:4px}.pages-list .row .hint:after,.pages-list .row [data-hint]:after{border-radius:2px}.pages-list .row .badge.lang{background-color:#aaa;color:white;margin-left:8px}.pages-list .row .badge.lang.info{background-color:#9055AF}.pages-list .page-tools{display:inline-block;float:right;font-size:1.4rem}.pages-list .page-tools i{margin-left:10px}.pages-list .page-home{font-size:1.4rem;margin-left:10px;color:#bbb;vertical-align:middle}.pages-list .page-info{font-size:1.1rem;margin-left:10px;color:#bbb;vertical-align:middle}.pages-list .page-icon{color:#0082BA;font-weight:700}.pages-list .page-icon.children-open:before{content:'\f056'}.pages-list .page-icon.children-closed:before{content:'\f055'}.pages-list .page-icon.not-routable{color:#CE431D}.pages-list .page-icon.not-visible{color:#999}.pages-list .page-icon.modular{color:#9055AF}#page-filtering{margin:-2rem 3rem 1rem}#page-filtering:after{content:"";display:table;clear:both}#page-filtering .page-filters{width:60%;float:left}@media only all and (max-width: 47.938em){#page-filtering .page-filters{width:100%}}#page-filtering .page-search{position:relative;width:40%;float:left;padding-left:2rem;text-indent:2.5rem}#page-filtering .page-search:after{position:absolute;right:15px;top:10px;content:'\f002';font-family:'FontAwesome'}@media only all and (max-width: 47.938em){#page-filtering .page-search{width:100%;padding-top:1rem;padding-left:0rem}#page-filtering .page-search:after{top:1.5rem}}#page-filtering .page-shortcuts{clear:both;padding-top:5px}#page-filtering .page-shortcuts:after{content:"";display:table;clear:both}#page-filtering .page-shortcuts .button{background:#aaa;color:rgba(255,255,255,0.85);border-radius:4px}#page-filtering .page-shortcuts .button:hover{background:#b7b7b7;color:#fff}#page-filtering .page-shortcuts .button.dropdown-toggle{background:#b7b7b7;border-left:1px solid #9d9d9d}#page-filtering .selectize-control.multi .selectize-input{padding:0.425rem 0.425rem}#page-filtering .selectize-control.multi .selectize-input.has-items{padding-top:6px;padding-bottom:4px}#page-filtering .selectize-control.multi .selectize-input input{font-size:1rem;line-height:1.7}#page-filtering .selectize-control.multi .selectize-input>div,#page-filtering .selectize-control.multi .selectize-input>div.active{color:#777;padding:2px 10px}#page-filtering .selectize-control.multi .selectize-input>div[data-value='Routable'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='Routable']{background:#CE431D;color:#fff}#page-filtering .selectize-control.multi .selectize-input>div[data-value='NonRoutable'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='NonRoutable']{color:#CE431D}#page-filtering .selectize-control.multi .selectize-input>div[data-value='Visible'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='Visible']{background:#71B15E;color:#fff}#page-filtering .selectize-control.multi .selectize-input>div[data-value='NonVisible'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='NonVisible']{color:#71B15E}#page-filtering .selectize-control.multi .selectize-input>div[data-value='Modular'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='Modular']{background:#9055AF;color:#fff}#page-filtering .selectize-control.multi .selectize-input>div[data-value='NonModular'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='NonModular']{color:#9055AF}#page-filtering .selectize-control.multi .selectize-input>div[data-value='Published'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='Published']{background:#0093B8;color:#fff}#page-filtering .selectize-control.multi .selectize-input>div[data-value='NonPublished'],#page-filtering .selectize-control.multi .selectize-input>div.active[data-value='NonPublished']{color:#0093B8}.admin-form-wrapper{position:relative}#admin-topbar{position:absolute;right:0.5rem;height:3.5rem}@media only all and (max-width: 47.938em){#admin-topbar{width:100%;right:0;top:.25rem;padding:0 .5rem}}#admin-topbar #admin-mode-toggle,#admin-topbar #admin-lang-toggle{height:37px;display:inline-block;vertical-align:inherit}@media only all and (max-width: 47.938em){#admin-topbar #admin-mode-toggle,#admin-topbar #admin-lang-toggle{width:100%}}#admin-topbar #admin-lang-toggle{z-index:10}#admin-topbar #admin-lang-toggle button{background:#73448c;color:rgba(255,255,255,0.85);border-radius:4px}#admin-topbar #admin-lang-toggle button:hover{background:#814c9d;color:#fff}#admin-topbar #admin-lang-toggle button.dropdown-toggle{background:#814c9d;border-left:1px solid #653c7b}#admin-topbar #admin-lang-toggle .dropdown-menu{background:#9055AF}#admin-topbar #admin-lang-toggle .dropdown-menu button{background:transparent;color:#fff;width:100%}#admin-topbar .switch-grav{border:0;background-color:#365569}@media only all and (max-width: 47.938em){#admin-topbar .switch-toggle{width:100%}}#admin-topbar .switch-toggle input:checked+label{color:#fff}#admin-topbar .switch-toggle input+label{color:#d1dee7}#admin-topbar .switch-toggle input.highlight:checked ~ a{background:#3aafd6}body .selectize-dropdown .optgroup-header{color:#000;border-bottom:1px solid #eee;background-color:#fafafa}.depth-0 .row{padding-left:3rem}.depth-1 .row{padding-left:6rem}.depth-2 .row{padding-left:9rem}.depth-3 .row{padding-left:12rem}.depth-4 .row{padding-left:15rem}.depth-5 .row{padding-left:18rem}.depth-6 .row{padding-left:21rem}.depth-7 .row{padding-left:24rem}.depth-8 .row{padding-left:27rem}.depth-9 .row{padding-left:30rem}.hidden{display:none !important}.switch-toggle input[type="radio"]{display:none !important}html.remodal_lock,body.remodal_lock{overflow:hidden}.remodal,[data-remodal-id]{visibility:hidden}.remodal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;display:none;overflow:auto;-webkit-overflow-scrolling:touch;text-align:center}.remodal-overlay:after{display:inline-block;height:100%;margin-left:-0.05em;content:''}.remodal-overlay>*{-webkit-transform:translateZ(0px)}.remodal{position:relative;display:inline-block;text-align:left}.remodal-bg{-webkit-transition-property:filter;-moz-transition-property:filter;transition-property:filter;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;transition-duration:0.2s;-webkit-transition-timing-function:linear;-moz-transition-timing-function:linear;transition-timing-function:linear}.remodal-overlay{opacity:0;background:rgba(33,36,46,0.8);-webkit-transition:opacity 0.2s linear;-moz-transition:opacity 0.2s linear;transition:opacity 0.2s linear}body.remodal_active .remodal-overlay{opacity:1}.remodal{width:100%;min-height:100%;padding-top:2rem;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;background:#eee;background-clip:padding-box;color:#737C81;box-shadow:0 10px 20px rgba(0,0,0,0.5);-webkit-transform:scale(0.95);-moz-transform:scale(0.95);-ms-transform:scale(0.95);-o-transform:scale(0.95);transform:scale(0.95);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;transition-duration:0.2s;-webkit-transition-timing-function:linear;-moz-transition-timing-function:linear;transition-timing-function:linear}body.remodal_active .remodal{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.remodal,.remodal-overlay:after{vertical-align:middle}.remodal-close{position:absolute;top:10px;right:10px;color:#737C81;text-decoration:none;text-align:center;-webkit-transition:background 0.2s linear;-moz-transition:background 0.2s linear;transition:background 0.2s linear}.remodal-close:after{display:block;font-family:FontAwesome;content:"\f00d";font-size:28px;line-height:28px;cursor:pointer;text-decoration:none}.remodal-close:hover,.remodal-close:active{color:#43484b}@media only screen and (min-width: 40.063em){.remodal{max-width:700px;margin:20px auto;min-height:0;border-radius:6px}}.tab-bar{background:#253A47;margin:0;padding:0;list-style:none;font-family:"Montserrat","Helvetica","Tahoma","Geneva","Arial",sans-serif}.tab-bar:after{content:"";display:table;clear:both}.tab-bar li{display:block;float:left;height:3.5em}.tab-bar li.active span,.tab-bar li.active a{background:#eee;color:#737C81}@media only all and (max-width: 47.938em){.tab-bar li{width:100%}.tab-bar li span,.tab-bar li a{width:100%;text-align:center}}.tab-bar span,.tab-bar a{display:inline-block;padding:0 4rem;line-height:3.5em;color:#d1dee7}.tab-bar span:hover,.tab-bar a:hover{color:#fff;background:#141f25}@-webkit-keyframes show{from{opacity:0}to{opacity:1}}@-moz-keyframes show{from{opacity:0}to{opacity:1}}@keyframes show{from{opacity:0}to{opacity:1}}.form-tabs{background:#253A47;font-family:"Montserrat","Helvetica","Tahoma","Geneva","Arial",sans-serif;margin-top:-4rem}@media only all and (max-width: 47.938em){.form-tabs{padding-top:4rem}}.form-tabs>input[type=radio]{display:none}.form-tabs>input[type=radio]:checked+label{background:#eee;color:#737C81}.form-tabs>label{display:inline-block;cursor:pointer;color:#d1dee7;height:3.5em;text-align:center;line-height:3.5em;padding:0 2rem}@media only all and (max-width: 47.938em){.form-tabs>label{width:100%}}.form-tabs>label:last-of-type{border-bottom:none}.form-tabs>label:hover{color:#fff;background:#2a4251}.tab-body{position:absolute;top:-9999px;opacity:0;width:100%}.tab-body-wrapper{padding-top:3.5em;background:#eee}#tab1:checked ~ .tab-body-wrapper #tab-body-1,#tab2:checked ~ .tab-body-wrapper #tab-body-2,#tab3:checked ~ .tab-body-wrapper #tab-body-3,#tab4:checked ~ .tab-body-wrapper #tab-body-4,#tab5:checked ~ .tab-body-wrapper #tab-body-5,#tab6:checked ~ .tab-body-wrapper #tab-body-6,#tab7:checked ~ .tab-body-wrapper #tab-body-7,#tab8:checked ~ .tab-body-wrapper #tab-body-8,#tab9:checked ~ .tab-body-wrapper #tab-body-9,#tab10:checked ~ .tab-body-wrapper #tab-body-10{position:relative;top:0px;opacity:1}.grav-mdeditor .CodeMirror-scroll{margin-right:-36px;padding-bottom:36px}.grav-mdeditor-fullscreen{position:fixed;top:0;left:0;bottom:0;right:0;z-index:1500}.grav-mdeditor-fullscreen .grav-mdeditor-content,.grav-mdeditor-fullscreen .grav-mdeditor-code,.grav-mdeditor-fullscreen .CodeMirror-wrap,.grav-mdeditor-fullscreen .grav-mdeditor-preview{height:100% !important}.grav-mdeditor-fullscreen .grav-mdeditor-navbar,.grav-mdeditor-fullscreen .grav-mdeditor-navbar ul li:first-child a,.grav-mdeditor-fullscreen .grav-mdeditor-navbar-flip ul li:last-child a{border-radius:0}.grav-mdeditor-navbar{border:1px solid #d5d5d5;border-top-right-radius:4px;border-top-left-radius:4px;background:#fbfbfb}.grav-mdeditor-navbar:after{content:"";display:table;clear:both}.grav-mdeditor-navbar ul{list-style:none;margin:0;padding:0}.grav-mdeditor-navbar ul li{float:left}.grav-mdeditor-navbar ul li:first-child a{border-top-left-radius:4px}.grav-mdeditor-navbar ul .mdeditor-active a{background:white;cursor:auto;border-left:1px solid #d5d5d5;border-right:1px solid #d5d5d5}.grav-mdeditor-navbar ul .mdeditor-active a:hover{background:#fff}.grav-mdeditor-navbar ul a{display:block;cursor:pointer;line-height:3rem;height:3rem;padding:0 1rem;color:#737C81}.grav-mdeditor-navbar ul a:hover{background:#f3f3f3;color:#5b6266}.grav-mdeditor-navbar-nav{float:left}.grav-mdeditor-navbar-flip{float:right}.grav-mdeditor-navbar-flip ul li:last-child a{border-top-right-radius:4px}.grav-mdeditor-content{border:1px solid #d5d5d5;border-top:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.grav-mdeditor-content:after{content:"";display:table;clear:both}.grav-mdeditor-code .CodeMirror{padding:10px 20px 20px 20px;border-bottom-left-radius:4px}.grav-mdeditor-preview{padding:20px;overflow-y:scroll;position:relative;background:#fbfbfb;border-bottom-right-radius:4px}.grav-mdeditor-navbar p{margin-top:10px;margin-bottom:10px;padding-left:20px}#admin-main .grav-mdeditor-preview{font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif}#admin-main .grav-mdeditor-preview h1,#admin-main .grav-mdeditor-preview h2,#admin-main .grav-mdeditor-preview h3,#admin-main .grav-mdeditor-preview h4,#admin-main .grav-mdeditor-preview h5,#admin-main .grav-mdeditor-preview h6{color:#5b6266}#admin-main .grav-mdeditor-preview h1{font-size:2rem;border:0}#admin-main .grav-mdeditor-preview h2{font-size:1.6rem}#admin-main .grav-mdeditor-preview h3{font-size:1.4rem}#admin-main .grav-mdeditor-preview h4{font-size:1.2rem}#admin-main .grav-mdeditor-preview h5{font-size:1.1rem}#admin-main .grav-mdeditor-preview p,#admin-main .grav-mdeditor-preview h1{padding:0}[data-mode=tab][data-active-tab=code] .grav-mdeditor-preview,[data-mode=tab][data-active-tab=preview] .grav-mdeditor-code{display:none}[data-mode=split] .grav-mdeditor-button-code,[data-mode=split] .grav-mdeditor-button-preview{display:none}[data-mode=split] .grav-mdeditor-code{border-right:1px solid #d5d5d5}[data-mode=split] .grav-mdeditor-code,[data-mode=split] .grav-mdeditor-code .grav-mdeditor-preview{float:left;width:50%}.cm-s-paper.CodeMirror{color:#676f74;font-size:14px;line-height:1.4}.cm-s-paper.CodeMirror pre{font-family:"DejaVu Sans Mono", Menlo, Monaco, Consolas, Courier, monospace}.cm-s-paper .cm-link{color:#005e87}.cm-s-paper .cm-comment{color:#80898e}.cm-s-paper .cm-header{color:#4f5559}.cm-s-paper .cm-strong{color:#5b6266}.cm-s-paper .cm-em{color:#4f5559}.cm-s-paper .cm-string{color:#0082BA}.cm-s-paper .cm-tag{color:#349886}.cm-s-paper .cm-bracket{color:#41bea8}.cm-s-paper .cm-variable{color:#4f5559}.cm-s-paper .cm-variable-2{color:#80898e}.cm-s-paper .cm-variable-3{color:#8d959a}.cm-s-paper .cm-hr{color:#d1d4d6;font-weight:bold}.cm-s-paper .cm-keyword{color:#0082BA}.cm-s-paper .cm-atom{color:#9055AF}.cm-s-paper .cm-meta{color:#676f74}.cm-s-paper .cm-number{color:#7f8c8d}.cm-s-paper .cm-def{color:#00f}.cm-s-paper .cm-variable{color:black}.cm-s-paper .cm-variable-2{color:#555}.cm-s-paper .cm-variable-3{color:#085}.cm-s-paper .cm-property{color:black}.cm-s-paper .cm-operator{color:black}.cm-s-paper .cm-string-2{color:#f50}.cm-s-paper .cm-meta{color:#555}.cm-s-paper .cm-error{color:#f00}.cm-s-paper .cm-qualifier{color:#555}.cm-s-paper .cm-builtin{color:#555}.cm-s-paper .cm-attribute{color:#7f8c8d}.cm-s-paper .cm-quote{color:#888}.cm-s-paper .cm-header-1{font-size:140%}.cm-s-paper .cm-header-2{font-size:120%}.cm-s-paper .cm-header-3{font-size:110%}.cm-s-paper .cm-negative{color:#d44}.cm-s-paper .cm-positive{color:#292}.cm-s-paper .cm-header,.cm-s-paper .cm-strong{font-weight:bold}.cm-s-paper .cm-em{font-style:italic}.cm-s-paper .cm-link{text-decoration:underline}.cm-s-paper .cm-invalidchar{color:#f00}.form-uploads-wrapper h3{font-size:1rem;margin:2rem 0 0.5rem 0}.dropzone{position:relative;border:1px #d5d5d5 solid;border-radius:4px;min-height:4rem;background:#fff}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-drag-hover{border-color:rgba(0,0,0,0.15);background:rgba(0,0,0,0.04)}.dropzone.dz-started .dz-message{display:none}.dropzone .dz-message{opacity:1;-ms-filter:none;filter:none}.dropzone .dz-preview{position:relative;display:inline-block;margin:1rem;vertical-align:top}.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail]{display:none}.dropzone .dz-preview.dz-error .dz-error-mark{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{display:block}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{color:#fff;font-family:FontAwesome;display:none;position:absolute;width:22px;height:22px;font-size:18px;line-height:25px;border-radius:100%;text-align:center;right:2px;top:2px}.dropzone .dz-preview .dz-success-mark span,.dropzone .dz-preview .dz-error-mark span{display:none}.dropzone .dz-preview:hover .dz-success-mark,.dropzone .dz-preview:hover .dz-error-mark{display:none}.dropzone .dz-preview .dz-success-mark{background-color:#41bea8}.dropzone .dz-preview .dz-success-mark::after{content:'\f00c'}.dropzone .dz-preview .dz-error-mark{background-color:#D55A4E}.dropzone .dz-preview .dz-error-mark::after{content:'\f12a'}.dropzone .dz-preview .dz-progress{position:absolute;top:100px;left:0px;right:0px;height:4px;background:#d7d7d7;display:none}.dropzone .dz-preview .dz-progress .dz-upload{display:block;position:absolute;top:0;bottom:0;left:0;width:0%;background-color:#41bea8}.dropzone .dz-preview .dz-error-message{display:none;position:absolute;top:0;left:0;right:0;font-size:0.9rem;line-height:1.2;padding:8px 10px;background:#f6f6f6;color:#D55A4E;z-index:500}.dropzone .dz-preview.dz-processing .dz-progress{display:block}.dropzone .dz-preview:hover:not(.hide-backface) .dz-details img{display:none}.dropzone .dz-preview:hover.dz-error .dz-error-message{display:block}.dropzone .dz-preview .dz-remove,.dropzone .dz-preview .dz-insert{display:none}.dropzone .dz-preview:hover .dz-remove,.dropzone .dz-preview:hover .dz-insert{display:block;position:absolute;left:0;right:0;bottom:22px;border:1px solid #e1e1e1;width:50%;text-align:center;cursor:pointer;font-size:0.8rem}.dropzone .dz-preview:hover .dz-remove:hover,.dropzone .dz-preview:hover .dz-insert:hover{background:#eee}.dropzone .dz-preview:hover .dz-remove{left:inherit;border-left:0}.dropzone .dz-preview:hover .dz-insert{right:inherit}.dropzone .dz-preview.dz-processing .dz-details{overflow:hidden}.dropzone .dz-preview.dz-processing .dz-details img{position:absolute;left:50%;top:50%;height:auto;width:100%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.dropzone .dz-preview .dz-details{width:150px;height:100px;position:relative;background:#f6f6f6;border:1px solid #e1e1e1;font-size:0.8rem;padding:5px;margin-bottom:22px}.dropzone .dz-preview .dz-details .dz-filename{line-height:1.2;overflow:hidden;height:100%}.dropzone .dz-preview .dz-details img{position:absolute;top:0;left:0;width:150px;height:100px}.dropzone .dz-preview .dz-details .dz-size{position:absolute;bottom:-28px;left:0;right:0;text-align:center;font-size:0.8rem;height:28px;line-height:28px}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message span{cursor:pointer;color:#c3c7ca;text-align:center;font-size:1.4rem;line-height:4rem}.dropzone *{cursor:default}.toast-title{font-weight:bold}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#ffffff}.toast-message a:hover{color:#cccccc;text-decoration:none}.toast-close-button{position:relative;right:-0.3em;top:-0.3em;float:right;font-size:20px;font-weight:bold;color:#ffffff;-webkit-text-shadow:0 1px 0 #ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:hover,.toast-close-button:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.toast-top-right{top:5rem;right:1.5rem}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;color:#ffffff;opacity:0.9;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=90);filter:alpha(opacity=90)}#toast-container>:hover{opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important}#toast-container>.toast-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important}#toast-container>.toast-success{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important}#toast-container>.toast-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important}#toast-container.toast-top-center>div,#toast-container.toast-bottom-center>div{width:300px;margin:auto}#toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#9055AF}.toast-success .button{background:#9b66b7;background:#a778bf;color:rgba(255,255,255,0.85);border-radius:4px}.toast-success .button:hover{background:#b289c7;color:#fff}.toast-success .button.dropdown-toggle{background:#b289c7;border-left:1px solid #9b66b7}.toast-error{background-color:#DA4B46}.toast-info{background-color:#2693B7}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000000;opacity:0.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width: 240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 241px) and (max-width: 480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 481px) and (max-width: 768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.gpm>table>tbody>tr{border-bottom:1px solid #e1e1e1}.gpm td{border:0}.gpm .gpm-name{white-space:nowrap;color:#b6bbbe}.gpm .gpm-version{padding-left:0.5rem;color:#8d959a;font-size:0.9rem}.gpm .gpm-update .gpm-name{color:#349886}.gpm .gpm-actions .enabled,.gpm .gpm-actions .disabled{font-size:1.6rem}.gpm .gpm-actions .disabled{color:#8d959a}.gpm .gpm-item-info{position:relative;border-bottom:3px solid #e1e1e1;padding-bottom:1rem;margin-bottom:3rem;overflow:hidden}@media only all and (max-width: 47.938em){.gpm .gpm-item-info{word-wrap:break-word}}.gpm .gpm-item-info .gpm-item-icon{color:#e6e6e6;position:absolute;right:3rem;font-size:20rem}.gpm .gpm-item-info table{position:relative}.gpm .gpm-item-info td{border:0;text-align:left !important}.gpm .gpm-item-info td:first-child{color:#9ba2a6;white-space:nowrap;width:25%}.gpm .gpm-item-info tr:hover{background:inherit}.gpm .badge.update{display:inline-block;background:#9055AF;border-radius:4px;padding:2px 10px;color:#fff;margin-left:1rem}.gpm .gpm-ribbon{background-color:#9055AF;overflow:hidden;white-space:nowrap;position:absolute;top:1rem;right:-2rem;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.gpm .gpm-ribbon a{color:#fff;display:block;font-weight:bold;font-size:0.9rem;padding:5px 40px;text-align:center}.gpm .themes{padding:3rem}.gpm .themes .gpm-name{margin-bottom:0.5rem}.gpm .themes .gpm-actions{background:#e9e9e9;margin:1rem -1rem -1rem -1rem;height:4rem;text-align:center;padding:1rem;font-size:1rem;font-weight:bold}.gpm .themes .active-theme .gpm-actions,.gpm .themes.inactive-theme .gpm-actions{line-height:2rem}.gpm .themes .active-theme{border:1px solid #349886}.gpm .themes .active-theme .gpm-actions{background:#349886;color:#eee}.gpm .themes .inactive-theme .gpm-actions{display:block;color:#a2a2a2;font-weight:normal}#phpinfo img{display:none}#phpinfo table{margin:1rem 0 0}#phpinfo tr:hover{background:transparent}#phpinfo th{background:#d9d9d9}#phpinfo td{word-wrap:break-word}#phpinfo td h1{margin:0rem -3rem 0rem !important}#phpinfo td:first-child{color:#349886}#phpinfo hr{border-bottom:0}#phpinfo h1{font-size:2.3rem}#phpinfo h2{font-size:1.7rem;margin:3rem 3rem 0rem !important} +/*# sourceMappingURL=template.css.map */ diff --git a/user/plugins/admin/themes/grav/css-compiled/template.css.map b/user/plugins/admin/themes/grav/css-compiled/template.css.map new file mode 100644 index 0000000..22cf131 --- /dev/null +++ b/user/plugins/admin/themes/grav/css-compiled/template.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/template/_fonts.scss","../scss/nucleus/mixins/_utilities.scss","../scss/template/modules/_buttons.scss","../scss/configuration/template/_typography.scss","../scss/template/_core.scss","../scss/configuration/template/_colors.scss","../scss/configuration/template/_bullets.scss","../scss/configuration/template/_variables.scss","../scss/template/_extensions.scss","../scss/vendor/bourbon/addons/_prefixer.scss","../scss/nucleus/mixins/_breakpoints.scss","../scss/template/_typography.scss","../scss/configuration/nucleus/_typography.scss","../scss/template/modules/_toggle-switch.scss","../scss/template/_forms.scss","../scss/vendor/bourbon/css3/_flex-box.scss","../scss/template/_tables.scss","../scss/template/_buttons.scss","../scss/template/_errors.scss","../scss/template/_login.scss","../scss/vendor/bourbon/css3/_placeholder.scss","../scss/template/_admin.scss","../scss/vendor/bourbon/addons/_clearfix.scss","../scss/vendor/bourbon/css3/_linear-gradient.scss","../scss/template/_pages.scss","../scss/template/_remodal.scss","../scss/vendor/bourbon/css3/_transition.scss","../scss/vendor/bourbon/functions/_transition-property-name.scss","../scss/template/_tabs.scss","../scss/vendor/bourbon/css3/_keyframes.scss","../scss/template/_editor.scss","../scss/template/_dropzone.scss","../scss/template/_toastr.scss","../scss/template/_gpm.scss","../scss/template/_phpinfo.scss"], +"names": [], +"file": "template.css" +} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css/chartist.min.css b/user/plugins/admin/themes/grav/css/chartist.min.css new file mode 100644 index 0000000..f348f0a --- /dev/null +++ b/user/plugins/admin/themes/grav/css/chartist.min.css @@ -0,0 +1 @@ +.ct-double-octave:after,.ct-major-eleventh:after,.ct-major-second:after,.ct-major-seventh:after,.ct-major-sixth:after,.ct-major-tenth:after,.ct-major-third:after,.ct-major-twelfth:after,.ct-minor-second:after,.ct-minor-seventh:after,.ct-minor-sixth:after,.ct-minor-third:after,.ct-octave:after,.ct-perfect-fifth:after,.ct-perfect-fourth:after,.ct-square:after{content:"";clear:both}.ct-double-octave:after,.ct-double-octave:before,.ct-golden-section:after,.ct-major-eleventh:after,.ct-major-eleventh:before,.ct-major-second:after,.ct-major-second:before,.ct-major-seventh:after,.ct-major-seventh:before,.ct-major-sixth:after,.ct-major-sixth:before,.ct-major-tenth:after,.ct-major-tenth:before,.ct-major-third:after,.ct-major-third:before,.ct-major-twelfth:after,.ct-major-twelfth:before,.ct-minor-second:after,.ct-minor-second:before,.ct-minor-seventh:after,.ct-minor-seventh:before,.ct-minor-sixth:after,.ct-minor-sixth:before,.ct-minor-third:after,.ct-minor-third:before,.ct-octave:after,.ct-octave:before,.ct-perfect-fifth:after,.ct-perfect-fifth:before,.ct-perfect-fourth:after,.ct-perfect-fourth:before,.ct-square:after,.ct-square:before{content:""}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;width:0;height:0;padding-bottom:100%}.ct-square:after{display:table}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{display:table}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{display:table}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{display:table}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;width:0;height:0;padding-bottom:80%}.ct-major-third:after{display:table}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{display:table}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{display:table}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{display:table}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{display:table}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{display:table}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{display:table}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;width:0;height:0;padding-bottom:50%}.ct-octave:after{display:table}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{display:table}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{display:table}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{display:table}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;width:0;height:0;padding-bottom:25%}.ct-double-octave:after{display:table}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css/codemirror/base16-light.css b/user/plugins/admin/themes/grav/css/codemirror/base16-light.css new file mode 100644 index 0000000..12ff2eb --- /dev/null +++ b/user/plugins/admin/themes/grav/css/codemirror/base16-light.css @@ -0,0 +1,36 @@ +/* + + Name: Base16 Default Light + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-light.CodeMirror {background: #f5f5f5; color: #202020;} +.cm-s-base16-light div.CodeMirror-selected {background: #e0e0e0 !important;} +.cm-s-base16-light .CodeMirror-gutters {background: #f5f5f5; border-right: 0px;} +.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-linenumber {color: #b0b0b0;} +.cm-s-base16-light .CodeMirror-cursor {border-left: 1px solid #505050 !important;} + +.cm-s-base16-light span.cm-comment {color: #8f5536;} +.cm-s-base16-light span.cm-atom {color: #aa759f;} +.cm-s-base16-light span.cm-number {color: #aa759f;} + +.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute {color: #90a959;} +.cm-s-base16-light span.cm-keyword {color: #ac4142;} +.cm-s-base16-light span.cm-string {color: #f4bf75;} + +.cm-s-base16-light span.cm-variable {color: #90a959;} +.cm-s-base16-light span.cm-variable-2 {color: #6a9fb5;} +.cm-s-base16-light span.cm-def {color: #d28445;} +.cm-s-base16-light span.cm-bracket {color: #202020;} +.cm-s-base16-light span.cm-tag {color: #ac4142;} +.cm-s-base16-light span.cm-link {color: #aa759f;} +.cm-s-base16-light span.cm-error {background: #ac4142; color: #505050;} + +.cm-s-base16-light .CodeMirror-activeline-background {background: #DDDCDC !important;} +.cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} diff --git a/user/plugins/admin/themes/grav/css/codemirror/codemirror.css b/user/plugins/admin/themes/grav/css/codemirror/codemirror.css new file mode 100644 index 0000000..318d25f --- /dev/null +++ b/user/plugins/admin/themes/grav/css/codemirror/codemirror.css @@ -0,0 +1,332 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror div.CodeMirror-cursor { + border-left: 1px solid black; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.CodeMirror.cm-fat-cursor div.CodeMirror-cursor { + width: auto; + border: 0; + background: #7e7; +} +.CodeMirror.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +div.CodeMirror-overwrite div.CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-ruler { + border-left: 1px solid #ccc; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3 {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actuall scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + margin-bottom: -30px; + /* Hack to make IE7 behave */ + *zoom:1; + *display:inline; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-widget {} + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} +.CodeMirror-measure pre { position: static; } + +.CodeMirror div.CodeMirror-cursor { + position: absolute; + border-right: none; + width: 0; +} + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* IE7 hack to prevent it from returning funny offsetTops on the spans */ +.CodeMirror span { *vertical-align: text-bottom; } + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/user/plugins/admin/themes/grav/css/codemirror/paper.css b/user/plugins/admin/themes/grav/css/codemirror/paper.css new file mode 100644 index 0000000..8305176 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/codemirror/paper.css @@ -0,0 +1,39 @@ +.cm-s-paper .cm-keyword {color: #555;} +.cm-s-paper .cm-atom {color: #7f8c8d;} +.cm-s-paper .cm-number {color: #7f8c8d;} +.cm-s-paper .cm-def {color: #00f;} +.cm-s-paper .cm-variable {color: black;} +.cm-s-paper .cm-variable-2 {color: #555;} +.cm-s-paper .cm-variable-3 {color: #085;} +.cm-s-paper .cm-property {color: black;} +.cm-s-paper .cm-operator {color: black;} +.cm-s-paper .cm-comment {color: #959595;} +.cm-s-paper .cm-string {color: #7f8c8d;} +.cm-s-paper .cm-string-2 {color: #f50;} +.cm-s-paper .cm-meta {color: #555;} +.cm-s-paper .cm-error {color: #f00;} +.cm-s-paper .cm-qualifier {color: #555;} +.cm-s-paper .cm-builtin {color: #555;} +.cm-s-paper .cm-bracket {color: #997;} +.cm-s-paper .cm-tag {color: #7f8c8d;} +.cm-s-paper .cm-attribute {color: #7f8c8d;} +.cm-s-paper .cm-header {color: #000;} +.cm-s-paper .cm-quote {color: #888;} +.cm-s-paper .cm-hr {color: #999;} +.cm-s-paper .cm-link {color: #7f8c8d;} + +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} + +.cm-invalidchar {color: #f00;} + +.cm-s-paper .cm-header-1 {font-size: 140%;} +.cm-s-paper .cm-header-2 {font-size: 120%;} +.cm-s-paper .cm-header-3 {font-size: 110%;} + + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/editor.png b/user/plugins/admin/themes/grav/css/datepicker/Flat/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..456f9c51871269e844af4beb056bbf8a7376504f GIT binary patch literal 2873 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 literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/imagebrowser.png b/user/plugins/admin/themes/grav/css/datepicker/Flat/imagebrowser.png new file mode 100644 index 0000000000000000000000000000000000000000..210cf4950ba0cd23aa0220d275541edfd50b6ada GIT binary patch literal 6215 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 >}2!;D0+efeK0_hBJSzuz@v)f1EXyWECmK zq<0C5_|(!okKWW^!Z#iByne7l@6Ed6u94v$^9Lj49f2l=3sfx1OLiJ;DElu|ZgGqo zUI_{8_7Zv@De}+-{^kS@9m6jq>WLo1S40&Jd&kGF3@<+3{ z&xeMugFxI-`7_3CThT!^OGroO@r2u_mQ6j$J?>(ex$Us_33*ZQ*#oJjT@YZK%2@dz z-fbhBhF-!ZAS5Y)IekqBBxKG5||8*l%{O$GAy^o=~_ZR$ZdHuo7yCJn7*$32RB{!%T?rJ`EpbEd- z$kAruQGi3z>9?Wd(Nun^dN;$X%1Uz!3KD0drG8Y`gb09mi<5cMBZm^{t^ literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/indeterminate.gif b/user/plugins/admin/themes/grav/css/datepicker/Flat/indeterminate.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e63a2c60b53d684c587e3dcc6b7286364778992 GIT binary patch literal 799 zcmZ?wbhEHb6k`x$n8?KN<;#~BFJ3T!f#QE|Ki808XU70nBRvCVMxdbLPZm}d1||j_ zkOGhv1}6QUe#X z1K-GtwUxQIY7^9?7T&0gkJ|KN=b`9TabL9k%jYD&`?Hy~)H!}Vju7c-T$%88ur|4T6+JR&tukNXD>tSA)?pAyOJ9zZmyWd3-qO=Ph0$J z`P<*Pgh$cA{eoyGlL%a1*aS4M>Tu+W$7G_1O_T7K#aRq0zUv`6f?8l9CFKlrx_#Cw~%?-O7lrktJjI0 YnYGpC=6bu&mUSOl8=X&S0u8YS01-SW4*&oF literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/loading-image.gif b/user/plugins/admin/themes/grav/css/datepicker/Flat/loading-image.gif new file mode 100644 index 0000000000000000000000000000000000000000..271ee26b2898176ddada27920199cfec17f594c5 GIT binary patch literal 1611 zcma)+X)qfI6vxw*WJ}VHTcXvKl{&VzQd%^+&S(WIsWw||UDYb8Ev0pni;xJBpl)%6 zxWz44M9+3AiC`#!#T^Jad(`M-Atd)oA*Hwu6PG(rLL zB7tb*W$NM+C2^zcg!GW4Ra@F__p3-x+Trj}EZKZ@K+>|ky$$%M5Ze$Z+wkXkgYCS7CB3 z;pn_ki@AH$9X!<=;{%J0^}__vsSK(r`>b+odRk5RRI4>Z`eYC8jx~xTjW$W}Z|oX;LJbkXcgtq0q5qemQX7=^;Iv_r?8?~hClGwpp2yf0(|q?l4+h@L$R2# zUu#zx+h537QkLIq4Lqy|2-0uzMu|4LV{@cM*@E&7h6*+LT)-8*1$}!J#@ml0x}z>- zbfIsct%fm#ON?7cz7Nl14RdZcFcIj~8-`*Jk7y zC>y@3`R)G@bs6@rs1x3hbUqmz#Q*(<9sJ zaKM;(>8K9>5@F!yHE<+{xBQ;BVn4o;6dVcn#CR(P#hI)7V*F?UNlx&@)bI>4EFGGY z~*rPa071+9YS>`r!5k6N-hgw)7uSD~6G4AoaC zN4uhnQIalLs3Bh{Rn-B59cIVMkRp?TiOb*LvzY2bJ~WB#Ejj)Kb?5!0)%@a&s6Py8 z(*awT+h4rkh%nWES9x;$G<8k{0Svj%3^tTVm86Bo=1VY|RHun>Auj%Tt*Dl{#N z1dF$(@fmeR@R(EK*$tcn$G~7hOJ#ZM;e6}DV)WHAZo781jjiOmP7^w=E!PX!**!ev zC^8#xgfg+b)1&Cx#c{yIB2?HFw(;)w_aC-Ce){82ZH3)%2Y1Eo4${9Lshf z%i;=HDlQArf$fClV+#-UVMHpW7~VHhyt8_k?U`!h#^xZTNmI*-r*qHd7Z#V6SDwFE zU0X-|4F~$qUmV#D&H)4@%aeq%mbDOLRVaGa@X+Jfo|kS8uF{;*OG01 z!%xpZ5)YF5(-+T2$jRuA=ru75+Nv5{uZOfw>bP5Z!ebQUp%zZQ)Ho%Z{y9=;lMmB=cgch)$I3niQrY3Ji9MW@g&uhYE_YR|QE|_}Vlm$xLr3 p5!l+U+iBH(7TSw0aS&TECZ%=H4941`7I)xYzIy#;V^slQ_7^at)>Qxi literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/loading.gif b/user/plugins/admin/themes/grav/css/datepicker/Flat/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..13130c684885c56f816af328038500c6f0dce7c8 GIT binary patch literal 567 zcmZ?wbhEHb6krfw*v!fB|NsA&KYu*?`91jR3Gd5C&wPGA@yVU}&mYWveqZ3oCI$?k z_@CR)H6+;CF~HSG&w!Z`s6g>23nwcBCxZ@1G00d376*fqo~u=s3S=`gFoxI0H)YCj zs>scl)R~nQ&2u_8WBR5&>uqo3Yy99)Ie1AyKtdtW^}t1?Xfw-;D?O4*^Y+i-z-Fiu z$WY%UB1PE@4h5;vOieS6sm5o_)6v-Xg7bp;y4ynU4_iy=B^Z zFP2?BZG3BD!rHqVRG6?CYX>rRE0VF-#b+&dDN;YMs8j3M<~i>z?tf#NaKK%fg^795 zIw2OGYEk8)>oZN-Lpx1oZgs)xeG8D0do8lPycDB_fQ~JVcbarPV%6#r4ko6}+6t16 z33qngadi-4&~Lu?V22`8&+L>0$yHItg4o<=4l(TYS#?d;#M*@-3=Ro%SGFuVsmS5+ ziRs;J3CDyRyIL4jH}EhXJ+i=jgAViAz7nssVM-vgSkdCe5@J?x5ZA>Z1_s6%J;{eE t#ko|JZZ1-<q7R`p9^ephv=;YGU0rA><#3I3egbwDXS$IWT+>YcAoauZgu;nb9Tx&T)D`QS< zMCqcir8<2~tJbX3+34=6v902m`mQCX)c3Dmd+zd;tE!3!$1^c7F~|TR1M6I%<5d)N zj&I~hecg9P;LO2*JwGxom`r@mdC%vg_0lk9#oUyTjY&4MJuHPCGq=sXz`lUZB}z_F zL#1q`l9B(zxr@%nEsf^u|NP8p&)%s0-@jLR*OxWcR97~~cjk7s7WVb^OlohMJf&-z zQ<`*(evSG9LTWlLjViA`Bb1dCTeUm&YdhIv~@B-nLHGZ*Q1 zoAfqYObDH2In{4Qxy77$3p`VRPIca)zbb!^-n!`r^fu4e#p>EFc;d);y>BfjeH>6V zW~ng{*)eh9b!8S;P9^`1lP=~cr}{5d{^t@jFKdMf(nqy?FJ1u_#h=f8B8 z3%}MW^zwT)h@2Jz|+6#7+neL=1)AZ-eoi~4h23B{}D1g(T!>V;Tr+FM@cwDn@x9JF%uUFeO zNQz45lb!PM|jkAi{IP(;1<=!*}Rvy01Aq{3%I|RI1Jd$%ZXTd?reW7;)a;_$7Czg&JJ58#857V|OLP<&tN}94 BrS$*+ literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/slider-h.gif b/user/plugins/admin/themes/grav/css/datepicker/Flat/slider-h.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ed5ea9279f813a6944bac32c951bf5a3aef0169 GIT binary patch literal 73 zcmZ?wbhEHbWMtUFFp-I2)v8s84jp0u1I3>#j0_A+3_2hlNS=X7YD#10u{F2OMQ^;- X{q)Gf@2_iT3a~xylu8X{V6X-N5aJk5 literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/slider-v.gif b/user/plugins/admin/themes/grav/css/datepicker/Flat/slider-v.gif new file mode 100644 index 0000000000000000000000000000000000000000..1750543ee567c3abb6032ed903953e22c467ba93 GIT binary patch literal 73 zcmZ?wbhEHb+`_=fFp-I2)v8s84jp0u1I3>#j0_A+3_2hlNS=X7YD#10u{F2OMQ^;- X{q)Gf@2_iT3a~xylu8X{V6X-N6RsFf literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite.png b/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..d37fc9c9b594ac0bc0296c105b0c8cf89535949a GIT binary patch literal 12313 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 C4uEI? literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_2x.png b/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffffbe9fffd6ff6b6e9e16816bbca91ed292d19d GIT binary patch literal 29105 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%0D}1<0E&ygU$cbTi8gBr%5~AH# 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 Ms=6wrx2;3|9~7@iU;qFB literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_kpi.png b/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_kpi.png new file mode 100644 index 0000000000000000000000000000000000000000..8b15ccdaac15750a2238e9a77c0bc3cc812842e1 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^2|z5s!3-qtrF5MJQlA5SLR|m<|Nrxx>=$RV*49>^ z^#MQz5CItwE|391$Xp;B4uE!0gAvCL)5^Qs3?L|Cn-_%vwf1Wqc zWoBdklPPq#Lg;*E)Mx3pf2RFxKl9|R!THHHTdw|G8YSn-^Tg?-)`w}{HlMxOZr`rB zA^mxd%F<_fJAei=HhH=@hE&8Yy^>k}Nz@jTT3zedFD6yNm`V+hc2 zS9;3Cvf`gtL*uyx>l=Ce3telDIB3eheBv#0;%sRV$4ZctUUIrvKy$BxVC+p>IE(zg&nSi2iGxW6*j(E&nmGaz3>>D!23fhSq`1( zI^X!U_GbP16O0$*xfL$NJU#FthFSd2b9bg68yb`OQp{8~oa7FvS5+`ES89|L{<*%P zthv5ixj|TZhjXUm;INC&3wn+iS6GR z{p6qL5fKf>hVo^XkKT}-Jyc0SnWSj#oYZ6txe8K5Wxy6cTu0tiAcE{%)5A^}E(B4>Xy2{VV@R Wp*7u3w`c2tV%O8v&t;ucLK6UIA#U6N literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_kpi_2x.png b/user/plugins/admin/themes/grav/css/datepicker/Flat/sprite_kpi_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..89bfe3729c1428710c1a06d980d07043d4d5821d GIT binary patch literal 1472 zcmV;x1wZNK@=XnAy|SS1cD$W zzJ+ipF#;orgu*g<5_%2nNsJyuxsoVe3LzL$kq2l6KTAN0Y`KlY2aEwv*}*7+2EJ}#bVLg+Z750 zYVe;#67-=4-#=&Mz48eDR>C@gNUJzdtR>9=pF$l=ElXT)8v_4HB0*hf^bckNSoj^N zR+y3juo>~!VxZX;th+Nj6I5FRjEkIltLr0@^o{-cFhQJ>t z!2-4wNdTB4<_$DHUpf640)N&?&=k=h(|FCM%%M`P?Yb;Hb5|G_QC=XJ1$GD<-N8C- zfj`S6hyr>OUb7_+SlJ)njo)=g=3$G^J{-(6wZwpBgoM%se-=rQNAoAnG|F3ej=Bo6 zJqw!^3Np&d9vfTIfNjRc0aQ&E3X_To{8=Lbm>ap6>p4P`Bu*gMbRqP+75}CRMi=WB zXtSXH68yl zlwC>z_TV5 z#iG&dz(S!=Ltt_wNjsK#PW<>u3tqVPnw68%M5V(a0Xjr-fws8LDpWp;Wzz(HA7_Fn zlOvI9jNYd{CwNazlB}+zT{IaE!h|J>ic44~jo|l<1T%^r5>=BVZgdy%Fu^?o67@DZ z?Au0B0_-ulDDF6x5s{q34#=e({JK7NC`%Dsk|mQWX|0P)Ht2h_E0ab6aC^R!sCObX z6WElgP}{mTx+!u}xHMrwd`)-hB56(qW}C>M3Ay{{9rf|9%zglHWey44H^k&~i6)rc z)j;0yRwO%4&0L?)Jy!}SBj>=Wl~Sme6zpr4`5Mb$mQuPVS^!oN`oH3@tH zzmCZvVv@*2lc^Hxk`nm9a(L^YpWi^+wHoXhsW6MESxiL&pTOV8%VgD5fuGXk&^1YtuA6#4m<2X0y#Gdc4XaClHAb^%fSLrpf#3FSuDB6?nwg1^C(UqR zLc`G|+Xmlz8{0TG*N-E?8b_7b648jUZ{Rm!a)=OalvQ_IyF6nEf?{xLh>6YdB?SL} zfwvkD&jyW4Vp9UYi?cyPM{cA a0t^5aJt<4Ik;B*k0000 .k-link { + color: inherit; +} +/* widget */ +.k-textbox > input, +.k-input[type="text"], +.k-input[type="number"], +.k-textbox, +.k-picker-wrap .k-input, +.k-button { + font-size: 100%; + font-family: inherit; + border-style: solid; + border-width: 1px; + -webkit-appearance: none; +} +.k-widget, +.k-block, +.k-inline-block, +.k-draghandle { + border-style: solid; + border-width: 1px; + -webkit-appearance: none; +} +.k-block, +.k-widget { + line-height: normal; + outline: 0; +} +/* Block */ +.k-block { + padding: 2px; +} +/* button */ +.k-button { + display: inline-block; + margin: 0; + padding: 0.2em 0.7em; + font-family: inherit; + line-height: 1.72em; + text-align: center; + cursor: pointer; + text-decoration: none; +} +.k-button[disabled], +.k-button.k-state-disabled, +.k-state-disabled .k-button, +.k-state-disabled .k-button:hover, +.k-button.k-state-disabled:hover, +.k-state-disabled .k-button:active, +.k-button.k-state-disabled:active { + cursor: default; +} +.k-ie7 .k-button { + line-height: normal; +} +a.k-button { + -khtml-user-select: none; + -webkit-user-select: none; + -moz-user-select: -moz-none; + -ms-user-select: none; + user-select: none; + text-decoration: none; +} +/* Override the important default line-height in Firefox 4+ */ +.k-ff input.k-button { + padding-bottom: 0.37em; + padding-top: 0.37em; +} +.k-ie7 .k-button { + overflow: visible; + margin-right: 4px; +} +.k-ie7 a.k-button { + line-height: 1.6; + padding-left: 7px; + padding-right: 7px; + /*+1*/ +} +.k-ie7 .k-slider a.k-button { + height: 22px; + line-height: 22px; + padding: 0; +} +.k-ie7 .k-button-expand { + margin-left: 0; + margin-right: 0; +} +button.k-button::-moz-focus-inner, +input.k-button::-moz-focus-inner { + padding: 0; + border: 0; +} +a.k-button-expand { + display: block; +} +button.k-button-expand, +input[type="submit"].k-button-expand, +input[type="button"].k-button-expand, +input[type="reset"].k-button-expand { + width: 100%; +} +body .k-button-icon, +body .k-split-button-arrow { + padding-left: .4em; + padding-right: .4em; +} +.k-ie7 a.k-button-icon { + padding-left: 5px; + padding-right: 5px; + /*+1*/ +} +.k-button-icontext { + overflow: visible; + /*IE9*/ +} +.k-toolbar .k-button-icontext { + padding-right: .8em; +} +.k-button-icontext .k-icon, +.k-button-icontext .k-image { + margin-right: 3px; + margin-right: .3rem; + margin-left: -3px; + margin-left: -0.3rem; +} +.k-button.k-button-icontext .k-icon, +.k-button.k-button-icontext .k-image { + vertical-align: text-top; +} +html body .k-button-bare { + background: none !important; + /*spares long selectors*/ + color: inherit; + border-width: 0; +} +html body .k-button-bare.k-upload-button:hover { + color: inherit; +} +/* link */ +.k-link { + cursor: pointer; + outline: 0; + text-decoration: none; +} +.k-grid-header span.k-link { + cursor: default; +} +/* states */ +.k-state-disabled, +.k-state-disabled .k-link, +.k-state-disabled .k-icon, +.k-state-disabled .k-button, +.k-state-disabled .k-draghandle, +.k-state-disabled .k-upload-button input { + cursor: default !important; + outline: 0; +} +@media print { + .k-state-disabled, + .k-state-disabled .k-input { + opacity: 1 !important; + } +} +.k-state-error { + border-style: ridge; +} +.k-state-empty { + font-style: italic; +} +/* icons */ +.k-icon, +.k-sprite, +.k-button-group .k-tool-icon { + display: inline-block; + width: 16px; + height: 16px; + overflow: hidden; + background-repeat: no-repeat; + font-size: 0; + line-height: 0; + text-align: center; + -ms-high-contrast-adjust: none; +} +.k-icon.k-i-none { + background-image: none !important; + /* should never be a background on these */ +} +/* In IE7 vertical align: middle can't be overridden */ +.k-ie8 .k-icon, +.k-ie8 .k-sprite, +.k-ie8 .k-button-group .k-tool-icon { + vertical-align: middle; +} +:root * > .k-icon, +:root * > .k-sprite, +:root * > .k-button-group .k-tool-icon { + vertical-align: middle; +} +.k-icon, +.k-sprite { + background-color: transparent; +} +.k-ie7 .k-icon, +.k-ie7 .k-sprite { + text-indent: 0; +} +.k-numerictextbox .k-select .k-link span.k-i-arrow-n { + background-position: 0 -3px; +} +.k-numerictextbox .k-select .k-link span.k-i-arrow-s { + background-position: 0 -35px; +} +.k-state-selected .k-i-arrow-n { + background-position: -16px 0px; +} +.k-link:not(.k-state-disabled):hover > .k-state-selected .k-i-arrow-n, +.k-state-hover > .k-state-selected .k-i-arrow-n, +.k-state-hover > * > .k-state-selected .k-i-arrow-n, +.k-button:not(.k-state-disabled):hover .k-state-selected .k-i-arrow-n, +.k-textbox:hover .k-state-selected .k-i-arrow-n, +.k-button:active .k-state-selected .k-i-arrow-n { + background-position: -32px 0px; +} +.k-numerictextbox .k-link.k-state-selected span.k-i-arrow-n, +.k-numerictextbox .k-state-hover .k-link span.k-i-arrow-n { + background-position: -16px -3px; +} +.k-state-selected .k-i-arrow-s { + background-position: -16px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-state-selected .k-i-arrow-s, +.k-state-hover > .k-state-selected .k-i-arrow-s, +.k-state-hover > * > .k-state-selected .k-i-arrow-s, +.k-button:not(.k-state-disabled):hover .k-state-selected .k-i-arrow-s, +.k-textbox:hover .k-state-selected .k-i-arrow-s, +.k-button:active .k-state-selected .k-i-arrow-s { + background-position: -32px -32px; +} +.k-numerictextbox .k-link.k-state-selected span.k-i-arrow-s, +.k-numerictextbox .k-state-hover .k-link span.k-i-arrow-s { + background-position: -16px -35px; +} +.k-grid-header th > .k-link:hover span.k-i-arrow-n { + background-position: 0px 0px; +} +.k-grid-header th > .k-link:hover span.k-i-arrow-s { + background-position: 0px -32px; +} +.k-group-indicator .k-link:hover span.k-si-arrow-n { + background-position: 0 -129px; +} +.k-group-indicator .k-link:hover span.k-si-arrow-s { + background-position: 0 -159px; +} +.k-group-indicator .k-button:hover span.k-group-delete { + background-position: -32px -16px; +} +.k-scheduler .k-scheduler-toolbar .k-nav-current .k-link .k-i-calendar { + background-position: -32px -176px; +} +.k-i-arrow-n { + background-position: 0px 0px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrow-n, +.k-state-hover > .k-i-arrow-n, +.k-state-hover > * > .k-i-arrow-n, +.k-button:not(.k-state-disabled):hover .k-i-arrow-n, +.k-textbox:hover .k-i-arrow-n, +.k-button:active .k-i-arrow-n { + background-position: -16px 0px; +} +.k-i-arrow-e { + background-position: 0px -16px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrow-e, +.k-state-hover > .k-i-arrow-e, +.k-state-hover > * > .k-i-arrow-e, +.k-button:not(.k-state-disabled):hover .k-i-arrow-e, +.k-textbox:hover .k-i-arrow-e, +.k-button:active .k-i-arrow-e { + background-position: -16px -16px; +} +.k-rtl .k-i-arrow-w { + background-position: 0px -16px; +} +.k-rtl .k-link:not(.k-state-disabled):hover > .k-i-arrow-w, +.k-rtl .k-state-hover > .k-i-arrow-w, +.k-rtl .k-state-hover > * > .k-i-arrow-w, +.k-rtl .k-button:not(.k-state-disabled):hover .k-i-arrow-w, +.k-rtl .k-textbox:hover .k-i-arrow-w, +.k-rtl .k-button:active .k-i-arrow-w { + background-position: -16px -16px; +} +.k-i-arrow-s { + background-position: 0px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrow-s, +.k-state-hover > .k-i-arrow-s, +.k-state-hover > * > .k-i-arrow-s, +.k-button:not(.k-state-disabled):hover .k-i-arrow-s, +.k-textbox:hover .k-i-arrow-s, +.k-button:active .k-i-arrow-s { + background-position: -16px -32px; +} +.k-i-arrow-w { + background-position: 0px -48px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrow-w, +.k-state-hover > .k-i-arrow-w, +.k-state-hover > * > .k-i-arrow-w, +.k-button:not(.k-state-disabled):hover .k-i-arrow-w, +.k-textbox:hover .k-i-arrow-w, +.k-button:active .k-i-arrow-w { + background-position: -16px -48px; +} +.k-rtl .k-i-arrow-e { + background-position: 0px -48px; +} +.k-rtl .k-link:not(.k-state-disabled):hover > .k-i-arrow-e, +.k-rtl .k-state-hover > .k-i-arrow-e, +.k-rtl .k-state-hover > * > .k-i-arrow-e, +.k-rtl .k-button:not(.k-state-disabled):hover .k-i-arrow-e, +.k-rtl .k-textbox:hover .k-i-arrow-e, +.k-rtl .k-button:active .k-i-arrow-e { + background-position: -16px -48px; +} +.k-i-seek-n { + background-position: 0px -64px; +} +.k-link:not(.k-state-disabled):hover > .k-i-seek-n, +.k-state-hover > .k-i-seek-n, +.k-state-hover > * > .k-i-seek-n, +.k-button:not(.k-state-disabled):hover .k-i-seek-n, +.k-textbox:hover .k-i-seek-n, +.k-button:active .k-i-seek-n { + background-position: -16px -64px; +} +.k-i-seek-e { + background-position: 0px -80px; +} +.k-link:not(.k-state-disabled):hover > .k-i-seek-e, +.k-state-hover > .k-i-seek-e, +.k-state-hover > * > .k-i-seek-e, +.k-button:not(.k-state-disabled):hover .k-i-seek-e, +.k-textbox:hover .k-i-seek-e, +.k-button:active .k-i-seek-e { + background-position: -16px -80px; +} +.k-rtl .k-i-seek-w { + background-position: 0px -80px; +} +.k-rtl .k-link:not(.k-state-disabled):hover > .k-i-seek-w, +.k-rtl .k-state-hover > .k-i-seek-w, +.k-rtl .k-state-hover > * > .k-i-seek-w, +.k-rtl .k-button:not(.k-state-disabled):hover .k-i-seek-w, +.k-rtl .k-textbox:hover .k-i-seek-w, +.k-rtl .k-button:active .k-i-seek-w { + background-position: -16px -80px; +} +.k-i-seek-s { + background-position: 0px -96px; +} +.k-link:not(.k-state-disabled):hover > .k-i-seek-s, +.k-state-hover > .k-i-seek-s, +.k-state-hover > * > .k-i-seek-s, +.k-button:not(.k-state-disabled):hover .k-i-seek-s, +.k-textbox:hover .k-i-seek-s, +.k-button:active .k-i-seek-s { + background-position: -16px -96px; +} +.k-i-seek-w { + background-position: 0px -112px; +} +.k-link:not(.k-state-disabled):hover > .k-i-seek-w, +.k-state-hover > .k-i-seek-w, +.k-state-hover > * > .k-i-seek-w, +.k-button:not(.k-state-disabled):hover .k-i-seek-w, +.k-textbox:hover .k-i-seek-w, +.k-button:active .k-i-seek-w { + background-position: -16px -112px; +} +.k-rtl .k-i-seek-e { + background-position: 0px -112px; +} +.k-rtl .k-link:not(.k-state-disabled):hover > .k-i-seek-e, +.k-rtl .k-state-hover > .k-i-seek-e, +.k-rtl .k-state-hover > * > .k-i-seek-e, +.k-rtl .k-button:not(.k-state-disabled):hover .k-i-seek-e, +.k-rtl .k-textbox:hover .k-i-seek-e, +.k-rtl .k-button:active .k-i-seek-e { + background-position: -16px -112px; +} +.k-si-arrow-n { + background-position: 0 -129px; +} +.k-link:not(.k-state-disabled):hover > .k-si-arrow-n, +.k-state-hover > .k-si-arrow-n, +.k-state-hover > * > .k-si-arrow-n, +.k-button:not(.k-state-disabled):hover .k-si-arrow-n, +.k-textbox:hover .k-si-arrow-n, +.k-button:active .k-si-arrow-n { + background-position: -16px -129px; +} +.k-si-arrow-e { + background-position: 0px -144px; +} +.k-link:not(.k-state-disabled):hover > .k-si-arrow-e, +.k-state-hover > .k-si-arrow-e, +.k-state-hover > * > .k-si-arrow-e, +.k-button:not(.k-state-disabled):hover .k-si-arrow-e, +.k-textbox:hover .k-si-arrow-e, +.k-button:active .k-si-arrow-e { + background-position: -16px -144px; +} +.k-si-arrow-s { + background-position: 0 -159px; +} +.k-link:not(.k-state-disabled):hover > .k-si-arrow-s, +.k-state-hover > .k-si-arrow-s, +.k-state-hover > * > .k-si-arrow-s, +.k-button:not(.k-state-disabled):hover .k-si-arrow-s, +.k-textbox:hover .k-si-arrow-s, +.k-button:active .k-si-arrow-s { + background-position: -16px -159px; +} +.k-si-arrow-w { + background-position: 0px -176px; +} +.k-link:not(.k-state-disabled):hover > .k-si-arrow-w, +.k-state-hover > .k-si-arrow-w, +.k-state-hover > * > .k-si-arrow-w, +.k-button:not(.k-state-disabled):hover .k-si-arrow-w, +.k-textbox:hover .k-si-arrow-w, +.k-button:active .k-si-arrow-w { + background-position: -16px -176px; +} +.k-i-arrowhead-n { + background-position: 0px -256px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrowhead-n, +.k-state-hover > .k-i-arrowhead-n, +.k-state-hover > * > .k-i-arrowhead-n, +.k-button:not(.k-state-disabled):hover .k-i-arrowhead-n, +.k-textbox:hover .k-i-arrowhead-n, +.k-button:active .k-i-arrowhead-n { + background-position: -16px -256px; +} +.k-i-arrowhead-e { + background-position: 0px -272px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrowhead-e, +.k-state-hover > .k-i-arrowhead-e, +.k-state-hover > * > .k-i-arrowhead-e, +.k-button:not(.k-state-disabled):hover .k-i-arrowhead-e, +.k-textbox:hover .k-i-arrowhead-e, +.k-button:active .k-i-arrowhead-e { + background-position: -16px -272px; +} +.k-i-arrowhead-s { + background-position: 0px -288px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrowhead-s, +.k-state-hover > .k-i-arrowhead-s, +.k-state-hover > * > .k-i-arrowhead-s, +.k-button:not(.k-state-disabled):hover .k-i-arrowhead-s, +.k-textbox:hover .k-i-arrowhead-s, +.k-button:active .k-i-arrowhead-s { + background-position: -16px -288px; +} +.k-i-arrowhead-w { + background-position: 0px -304px; +} +.k-link:not(.k-state-disabled):hover > .k-i-arrowhead-w, +.k-state-hover > .k-i-arrowhead-w, +.k-state-hover > * > .k-i-arrowhead-w, +.k-button:not(.k-state-disabled):hover .k-i-arrowhead-w, +.k-textbox:hover .k-i-arrowhead-w, +.k-button:active .k-i-arrowhead-w { + background-position: -16px -304px; +} +.k-i-expand, +.k-plus, +.k-plus-disabled { + background-position: 0px -192px; +} +.k-link:not(.k-state-disabled):hover > .k-i-expand, +.k-link:not(.k-state-disabled):hover > .k-plus, +.k-link:not(.k-state-disabled):hover > .k-plus-disabled, +.k-state-hover > .k-i-expand, +.k-state-hover > .k-plus, +.k-state-hover > .k-plus-disabled, +.k-state-hover > * > .k-i-expand, +.k-state-hover > * > .k-plus, +.k-state-hover > * > .k-plus-disabled, +.k-button:not(.k-state-disabled):hover .k-i-expand, +.k-button:not(.k-state-disabled):hover .k-plus, +.k-button:not(.k-state-disabled):hover .k-plus-disabled, +.k-textbox:hover .k-i-expand, +.k-textbox:hover .k-plus, +.k-textbox:hover .k-plus-disabled, +.k-button:active .k-i-expand, +.k-button:active .k-plus, +.k-button:active .k-plus-disabled { + background-position: -16px -192px; +} +.k-i-expand-w, +.k-rtl .k-i-expand, +.k-rtl .k-plus, +.k-rtl .k-plus-disabled { + background-position: 0px -208px; +} +.k-link:not(.k-state-disabled):hover > .k-i-expand-w, +.k-link:not(.k-state-disabled):hover > .k-rtl .k-i-expand, +.k-link:not(.k-state-disabled):hover > .k-rtl .k-plus, +.k-link:not(.k-state-disabled):hover > .k-rtl .k-plus-disabled, +.k-state-hover > .k-i-expand-w, +.k-state-hover > .k-rtl .k-i-expand, +.k-state-hover > .k-rtl .k-plus, +.k-state-hover > .k-rtl .k-plus-disabled, +.k-state-hover > * > .k-i-expand-w, +.k-state-hover > * > .k-rtl .k-i-expand, +.k-state-hover > * > .k-rtl .k-plus, +.k-state-hover > * > .k-rtl .k-plus-disabled, +.k-button:not(.k-state-disabled):hover .k-i-expand-w, +.k-button:not(.k-state-disabled):hover .k-rtl .k-i-expand, +.k-button:not(.k-state-disabled):hover .k-rtl .k-plus, +.k-button:not(.k-state-disabled):hover .k-rtl .k-plus-disabled, +.k-textbox:hover .k-i-expand-w, +.k-textbox:hover .k-rtl .k-i-expand, +.k-textbox:hover .k-rtl .k-plus, +.k-textbox:hover .k-rtl .k-plus-disabled, +.k-button:active .k-i-expand-w, +.k-button:active .k-rtl .k-i-expand, +.k-button:active .k-rtl .k-plus, +.k-button:active .k-rtl .k-plus-disabled { + background-position: -16px -208px; +} +.k-i-collapse, +.k-minus, +.k-minus-disabled { + background-position: 0px -224px; +} +.k-link:not(.k-state-disabled):hover > .k-i-collapse, +.k-link:not(.k-state-disabled):hover > .k-minus, +.k-link:not(.k-state-disabled):hover > .k-minus-disabled, +.k-state-hover > .k-i-collapse, +.k-state-hover > .k-minus, +.k-state-hover > .k-minus-disabled, +.k-state-hover > * > .k-i-collapse, +.k-state-hover > * > .k-minus, +.k-state-hover > * > .k-minus-disabled, +.k-button:not(.k-state-disabled):hover .k-i-collapse, +.k-button:not(.k-state-disabled):hover .k-minus, +.k-button:not(.k-state-disabled):hover .k-minus-disabled, +.k-textbox:hover .k-i-collapse, +.k-textbox:hover .k-minus, +.k-textbox:hover .k-minus-disabled, +.k-button:active .k-i-collapse, +.k-button:active .k-minus, +.k-button:active .k-minus-disabled { + background-position: -16px -224px; +} +.k-i-collapse-w, +.k-rtl .k-i-collapse, +.k-rtl .k-minus, +.k-rtl .k-minus-disabled { + background-position: 0px -240px; +} +.k-link:not(.k-state-disabled):hover > .k-i-collapse-w, +.k-link:not(.k-state-disabled):hover > .k-rtl .k-i-collapse, +.k-link:not(.k-state-disabled):hover > .k-rtl .k-minus, +.k-link:not(.k-state-disabled):hover > .k-rtl .k-minus-disabled, +.k-state-hover > .k-i-collapse-w, +.k-state-hover > .k-rtl .k-i-collapse, +.k-state-hover > .k-rtl .k-minus, +.k-state-hover > .k-rtl .k-minus-disabled, +.k-state-hover > * > .k-i-collapse-w, +.k-state-hover > * > .k-rtl .k-i-collapse, +.k-state-hover > * > .k-rtl .k-minus, +.k-state-hover > * > .k-rtl .k-minus-disabled, +.k-button:not(.k-state-disabled):hover .k-i-collapse-w, +.k-button:not(.k-state-disabled):hover .k-rtl .k-i-collapse, +.k-button:not(.k-state-disabled):hover .k-rtl .k-minus, +.k-button:not(.k-state-disabled):hover .k-rtl .k-minus-disabled, +.k-textbox:hover .k-i-collapse-w, +.k-textbox:hover .k-rtl .k-i-collapse, +.k-textbox:hover .k-rtl .k-minus, +.k-textbox:hover .k-rtl .k-minus-disabled, +.k-button:active .k-i-collapse-w, +.k-button:active .k-rtl .k-i-collapse, +.k-button:active .k-rtl .k-minus, +.k-button:active .k-rtl .k-minus-disabled { + background-position: -16px -240px; +} +.k-i-pencil, +.k-edit { + background-position: -32px 0px; +} +.k-link:not(.k-state-disabled):hover > .k-i-pencil, +.k-link:not(.k-state-disabled):hover > .k-edit, +.k-state-hover > .k-i-pencil, +.k-state-hover > .k-edit, +.k-state-hover > * > .k-i-pencil, +.k-state-hover > * > .k-edit, +.k-button:not(.k-state-disabled):hover .k-i-pencil, +.k-button:not(.k-state-disabled):hover .k-edit, +.k-textbox:hover .k-i-pencil, +.k-textbox:hover .k-edit, +.k-button:active .k-i-pencil, +.k-button:active .k-edit { + background-position: -48px 0px; +} +.k-i-close, +.k-delete, +.k-group-delete { + background-position: -32px -16px; +} +.k-link:not(.k-state-disabled):hover > .k-i-close, +.k-link:not(.k-state-disabled):hover > .k-delete, +.k-link:not(.k-state-disabled):hover > .k-group-delete, +.k-state-hover > .k-i-close, +.k-state-hover > .k-delete, +.k-state-hover > .k-group-delete, +.k-state-hover > * > .k-i-close, +.k-state-hover > * > .k-delete, +.k-state-hover > * > .k-group-delete, +.k-button:not(.k-state-disabled):hover .k-i-close, +.k-button:not(.k-state-disabled):hover .k-delete, +.k-button:not(.k-state-disabled):hover .k-group-delete, +.k-textbox:hover .k-i-close, +.k-textbox:hover .k-delete, +.k-textbox:hover .k-group-delete, +.k-button:active .k-i-close, +.k-button:active .k-delete, +.k-button:active .k-group-delete { + background-position: -48px -16px; +} +.k-si-close { + background-position: -160px -80px; +} +.k-link:not(.k-state-disabled):hover > .k-si-close, +.k-state-hover > .k-si-close, +.k-state-hover > * > .k-si-close, +.k-button:not(.k-state-disabled):hover .k-si-close, +.k-textbox:hover .k-si-close, +.k-button:active .k-si-close { + background-position: -176px -80px; +} +.k-multiselect .k-delete { + background-position: -160px -80px; +} +.k-multiselect .k-state-hover .k-delete { + background-position: -176px -80px; +} +.k-i-tick, +.k-insert, +.k-update { + background-position: -32px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-i-tick, +.k-link:not(.k-state-disabled):hover > .k-insert, +.k-link:not(.k-state-disabled):hover > .k-update, +.k-state-hover > .k-i-tick, +.k-state-hover > .k-insert, +.k-state-hover > .k-update, +.k-state-hover > * > .k-i-tick, +.k-state-hover > * > .k-insert, +.k-state-hover > * > .k-update, +.k-button:not(.k-state-disabled):hover .k-i-tick, +.k-button:not(.k-state-disabled):hover .k-insert, +.k-button:not(.k-state-disabled):hover .k-update, +.k-textbox:hover .k-i-tick, +.k-textbox:hover .k-insert, +.k-textbox:hover .k-update, +.k-button:active .k-i-tick, +.k-button:active .k-insert, +.k-button:active .k-update { + background-position: -48px -32px; +} +.k-check:checked, +.k-mobile-list .k-edit-field [type=checkbox], +.k-mobile-list .k-edit-field [type=radio] { + background-position: -32px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-check:checked, +.k-link:not(.k-state-disabled):hover > .k-mobile-list .k-edit-field [type=checkbox], +.k-link:not(.k-state-disabled):hover > .k-mobile-list .k-edit-field [type=radio], +.k-state-hover > .k-check:checked, +.k-state-hover > .k-mobile-list .k-edit-field [type=checkbox], +.k-state-hover > .k-mobile-list .k-edit-field [type=radio], +.k-state-hover > * > .k-check:checked, +.k-state-hover > * > .k-mobile-list .k-edit-field [type=checkbox], +.k-state-hover > * > .k-mobile-list .k-edit-field [type=radio], +.k-button:not(.k-state-disabled):hover .k-check:checked, +.k-button:not(.k-state-disabled):hover .k-mobile-list .k-edit-field [type=checkbox], +.k-button:not(.k-state-disabled):hover .k-mobile-list .k-edit-field [type=radio], +.k-textbox:hover .k-check:checked, +.k-textbox:hover .k-mobile-list .k-edit-field [type=checkbox], +.k-textbox:hover .k-mobile-list .k-edit-field [type=radio], +.k-button:active .k-check:checked, +.k-button:active .k-mobile-list .k-edit-field [type=checkbox], +.k-button:active .k-mobile-list .k-edit-field [type=radio] { + background-position: -48px -32px; +} +.k-i-cancel, +.k-cancel, +.k-denied { + background-position: -32px -48px; +} +.k-link:not(.k-state-disabled):hover > .k-i-cancel, +.k-link:not(.k-state-disabled):hover > .k-cancel, +.k-link:not(.k-state-disabled):hover > .k-denied, +.k-state-hover > .k-i-cancel, +.k-state-hover > .k-cancel, +.k-state-hover > .k-denied, +.k-state-hover > * > .k-i-cancel, +.k-state-hover > * > .k-cancel, +.k-state-hover > * > .k-denied, +.k-button:not(.k-state-disabled):hover .k-i-cancel, +.k-button:not(.k-state-disabled):hover .k-cancel, +.k-button:not(.k-state-disabled):hover .k-denied, +.k-textbox:hover .k-i-cancel, +.k-textbox:hover .k-cancel, +.k-textbox:hover .k-denied, +.k-button:active .k-i-cancel, +.k-button:active .k-cancel, +.k-button:active .k-denied { + background-position: -48px -48px; +} +.k-i-plus, +.k-add { + background-position: -32px -64px; +} +.k-link:not(.k-state-disabled):hover > .k-i-plus, +.k-link:not(.k-state-disabled):hover > .k-add, +.k-state-hover > .k-i-plus, +.k-state-hover > .k-add, +.k-state-hover > * > .k-i-plus, +.k-state-hover > * > .k-add, +.k-button:not(.k-state-disabled):hover .k-i-plus, +.k-button:not(.k-state-disabled):hover .k-add, +.k-textbox:hover .k-i-plus, +.k-textbox:hover .k-add, +.k-button:active .k-i-plus, +.k-button:active .k-add { + background-position: -48px -64px; +} +.k-i-funnel, +.k-filter { + background-position: -32px -80px; +} +.k-link:not(.k-state-disabled):hover > .k-i-funnel, +.k-link:not(.k-state-disabled):hover > .k-filter, +.k-state-hover > .k-i-funnel, +.k-state-hover > .k-filter, +.k-state-hover > * > .k-i-funnel, +.k-state-hover > * > .k-filter, +.k-button:not(.k-state-disabled):hover .k-i-funnel, +.k-button:not(.k-state-disabled):hover .k-filter, +.k-textbox:hover .k-i-funnel, +.k-textbox:hover .k-filter, +.k-button:active .k-i-funnel, +.k-button:active .k-filter { + background-position: -48px -80px; +} +.k-i-funnel-clear, +.k-clear-filter { + background-position: -32px -96px; +} +.k-link:not(.k-state-disabled):hover > .k-i-funnel-clear, +.k-link:not(.k-state-disabled):hover > .k-clear-filter, +.k-state-hover > .k-i-funnel-clear, +.k-state-hover > .k-clear-filter, +.k-state-hover > * > .k-i-funnel-clear, +.k-state-hover > * > .k-clear-filter, +.k-button:not(.k-state-disabled):hover .k-i-funnel-clear, +.k-button:not(.k-state-disabled):hover .k-clear-filter, +.k-textbox:hover .k-i-funnel-clear, +.k-textbox:hover .k-clear-filter, +.k-button:active .k-i-funnel-clear, +.k-button:active .k-clear-filter { + background-position: -48px -96px; +} +.k-i-lock { + background-position: -64px 0px; +} +.k-link:not(.k-state-disabled):hover > .k-i-lock, +.k-state-hover > .k-i-lock, +.k-state-hover > * > .k-i-lock, +.k-button:not(.k-state-disabled):hover .k-i-lock, +.k-textbox:hover .k-i-lock, +.k-button:active .k-i-lock { + background-position: -80px 0px; +} +.k-i-unlock { + background-position: -64px -16px; +} +.k-link:not(.k-state-disabled):hover > .k-i-unlock, +.k-state-hover > .k-i-unlock, +.k-state-hover > * > .k-i-unlock, +.k-button:not(.k-state-disabled):hover .k-i-unlock, +.k-textbox:hover .k-i-unlock, +.k-button:active .k-i-unlock { + background-position: -80px -16px; +} +.k-i-refresh { + background-position: -32px -112px; +} +.k-link:not(.k-state-disabled):hover > .k-i-refresh, +.k-state-hover > .k-i-refresh, +.k-state-hover > * > .k-i-refresh, +.k-button:not(.k-state-disabled):hover .k-i-refresh, +.k-textbox:hover .k-i-refresh, +.k-button:active .k-i-refresh { + background-position: -48px -112px; +} +.k-i-exception { + background-position: -160px -304px; +} +.k-link:not(.k-state-disabled):hover > .k-i-exception, +.k-state-hover > .k-i-exception, +.k-state-hover > * > .k-i-exception, +.k-button:not(.k-state-disabled):hover .k-i-exception, +.k-textbox:hover .k-i-exception, +.k-button:active .k-i-exception { + background-position: -176px -304px; +} +.k-i-restore { + background-position: -32px -128px; +} +.k-link:not(.k-state-disabled):hover > .k-i-restore, +.k-state-hover > .k-i-restore, +.k-state-hover > * > .k-i-restore, +.k-button:not(.k-state-disabled):hover .k-i-restore, +.k-textbox:hover .k-i-restore, +.k-button:active .k-i-restore { + background-position: -48px -128px; +} +.k-i-maximize { + background-position: -32px -144px; +} +.k-link:not(.k-state-disabled):hover > .k-i-maximize, +.k-state-hover > .k-i-maximize, +.k-state-hover > * > .k-i-maximize, +.k-button:not(.k-state-disabled):hover .k-i-maximize, +.k-textbox:hover .k-i-maximize, +.k-button:active .k-i-maximize { + background-position: -48px -144px; +} +.k-i-minimize { + background-position: -64px -288px; +} +.k-link:not(.k-state-disabled):hover > .k-i-minimize, +.k-state-hover > .k-i-minimize, +.k-state-hover > * > .k-i-minimize, +.k-button:not(.k-state-disabled):hover .k-i-minimize, +.k-textbox:hover .k-i-minimize, +.k-button:active .k-i-minimize { + background-position: -80px -288px; +} +.k-i-pin { + background-position: -160px -256px; +} +.k-link:not(.k-state-disabled):hover > .k-i-pin, +.k-state-hover > .k-i-pin, +.k-state-hover > * > .k-i-pin, +.k-button:not(.k-state-disabled):hover .k-i-pin, +.k-textbox:hover .k-i-pin, +.k-button:active .k-i-pin { + background-position: -176px -256px; +} +.k-i-unpin { + background-position: -160px -272px; +} +.k-link:not(.k-state-disabled):hover > .k-i-unpin, +.k-state-hover > .k-i-unpin, +.k-state-hover > * > .k-i-unpin, +.k-button:not(.k-state-disabled):hover .k-i-unpin, +.k-textbox:hover .k-i-unpin, +.k-button:active .k-i-unpin { + background-position: -176px -272px; +} +.k-resize-se { + background-position: -32px -160px; +} +.k-link:not(.k-state-disabled):hover > .k-resize-se, +.k-state-hover > .k-resize-se, +.k-state-hover > * > .k-resize-se, +.k-button:not(.k-state-disabled):hover .k-resize-se, +.k-textbox:hover .k-resize-se, +.k-button:active .k-resize-se { + background-position: -48px -160px; +} +.k-i-calendar { + background-position: -32px -176px; +} +.k-link:not(.k-state-disabled):hover > .k-i-calendar, +.k-state-hover > .k-i-calendar, +.k-state-hover > * > .k-i-calendar, +.k-button:not(.k-state-disabled):hover .k-i-calendar, +.k-textbox:hover .k-i-calendar, +.k-button:active .k-i-calendar { + background-position: -48px -176px; +} +.k-i-clock { + background-position: -32px -192px; +} +.k-link:not(.k-state-disabled):hover > .k-i-clock, +.k-state-hover > .k-i-clock, +.k-state-hover > * > .k-i-clock, +.k-button:not(.k-state-disabled):hover .k-i-clock, +.k-textbox:hover .k-i-clock, +.k-button:active .k-i-clock { + background-position: -48px -192px; +} +.k-si-plus { + background-position: -32px -208px; +} +.k-link:not(.k-state-disabled):hover > .k-si-plus, +.k-state-hover > .k-si-plus, +.k-state-hover > * > .k-si-plus, +.k-button:not(.k-state-disabled):hover .k-si-plus, +.k-textbox:hover .k-si-plus, +.k-button:active .k-si-plus { + background-position: -48px -208px; +} +.k-si-minus { + background-position: -32px -224px; +} +.k-link:not(.k-state-disabled):hover > .k-si-minus, +.k-state-hover > .k-si-minus, +.k-state-hover > * > .k-si-minus, +.k-button:not(.k-state-disabled):hover .k-si-minus, +.k-textbox:hover .k-si-minus, +.k-button:active .k-si-minus { + background-position: -48px -224px; +} +.k-i-search { + background-position: -32px -240px; +} +.k-link:not(.k-state-disabled):hover > .k-i-search, +.k-state-hover > .k-i-search, +.k-state-hover > * > .k-i-search, +.k-button:not(.k-state-disabled):hover .k-i-search, +.k-textbox:hover .k-i-search, +.k-button:active .k-i-search { + background-position: -48px -240px; +} +.k-i-custom { + background-position: -115px -113px; +} +.k-link:not(.k-state-disabled):hover > .k-i-custom, +.k-state-hover > .k-i-custom, +.k-state-hover > * > .k-i-custom, +.k-button:not(.k-state-disabled):hover .k-i-custom, +.k-textbox:hover .k-i-custom, +.k-button:active .k-i-custom { + background-position: -141px -113px; +} +.k-editor .k-i-custom { + background-position: -111px -109px; +} +.k-viewHtml { + background-position: -288px -120px; +} +.k-i-insert-n, +.k-insert-top { + background-position: -160px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-i-insert-n, +.k-link:not(.k-state-disabled):hover > .k-insert-top, +.k-state-hover > .k-i-insert-n, +.k-state-hover > .k-insert-top, +.k-state-hover > * > .k-i-insert-n, +.k-state-hover > * > .k-insert-top, +.k-button:not(.k-state-disabled):hover .k-i-insert-n, +.k-button:not(.k-state-disabled):hover .k-insert-top, +.k-textbox:hover .k-i-insert-n, +.k-textbox:hover .k-insert-top, +.k-button:active .k-i-insert-n, +.k-button:active .k-insert-top { + background-position: -176px -32px; +} +.k-i-insert-m, +.k-insert-middle { + background-position: -160px -48px; +} +.k-link:not(.k-state-disabled):hover > .k-i-insert-m, +.k-link:not(.k-state-disabled):hover > .k-insert-middle, +.k-state-hover > .k-i-insert-m, +.k-state-hover > .k-insert-middle, +.k-state-hover > * > .k-i-insert-m, +.k-state-hover > * > .k-insert-middle, +.k-button:not(.k-state-disabled):hover .k-i-insert-m, +.k-button:not(.k-state-disabled):hover .k-insert-middle, +.k-textbox:hover .k-i-insert-m, +.k-textbox:hover .k-insert-middle, +.k-button:active .k-i-insert-m, +.k-button:active .k-insert-middle { + background-position: -176px -48px; +} +.k-i-insert-s, +.k-insert-bottom { + background-position: -160px -64px; +} +.k-link:not(.k-state-disabled):hover > .k-i-insert-s, +.k-link:not(.k-state-disabled):hover > .k-insert-bottom, +.k-state-hover > .k-i-insert-s, +.k-state-hover > .k-insert-bottom, +.k-state-hover > * > .k-i-insert-s, +.k-state-hover > * > .k-insert-bottom, +.k-button:not(.k-state-disabled):hover .k-i-insert-s, +.k-button:not(.k-state-disabled):hover .k-insert-bottom, +.k-textbox:hover .k-i-insert-s, +.k-textbox:hover .k-insert-bottom, +.k-button:active .k-i-insert-s, +.k-button:active .k-insert-bottom { + background-position: -176px -64px; +} +.k-drop-hint { + background-position: 0 -326px; +} +.k-i-note, +.k-warning { + background-position: -160px -240px; +} +.k-link:not(.k-state-disabled):hover > .k-i-note, +.k-link:not(.k-state-disabled):hover > .k-warning, +.k-state-hover > .k-i-note, +.k-state-hover > .k-warning, +.k-state-hover > * > .k-i-note, +.k-state-hover > * > .k-warning, +.k-button:not(.k-state-disabled):hover .k-i-note, +.k-button:not(.k-state-disabled):hover .k-warning, +.k-textbox:hover .k-i-note, +.k-textbox:hover .k-warning, +.k-button:active .k-i-note, +.k-button:active .k-warning { + background-position: -176px -240px; +} +.k-i-sort-asc { + background-position: -112px -240px; +} +.k-link:not(.k-state-disabled):hover > .k-i-sort-asc, +.k-state-hover > .k-i-sort-asc, +.k-state-hover > * > .k-i-sort-asc, +.k-button:not(.k-state-disabled):hover .k-i-sort-asc, +.k-textbox:hover .k-i-sort-asc, +.k-button:active .k-i-sort-asc { + background-position: -128px -240px; +} +.k-i-sort-desc { + background-position: -112px -256px; +} +.k-link:not(.k-state-disabled):hover > .k-i-sort-desc, +.k-state-hover > .k-i-sort-desc, +.k-state-hover > * > .k-i-sort-desc, +.k-button:not(.k-state-disabled):hover .k-i-sort-desc, +.k-textbox:hover .k-i-sort-desc, +.k-button:active .k-i-sort-desc { + background-position: -128px -256px; +} +.k-i-group { + background-position: -112px -272px; +} +.k-link:not(.k-state-disabled):hover > .k-i-group, +.k-state-hover > .k-i-group, +.k-state-hover > * > .k-i-group, +.k-button:not(.k-state-disabled):hover .k-i-group, +.k-textbox:hover .k-i-group, +.k-button:active .k-i-group { + background-position: -128px -272px; +} +.k-i-ungroup { + background-position: -112px -288px; +} +.k-link:not(.k-state-disabled):hover > .k-i-ungroup, +.k-state-hover > .k-i-ungroup, +.k-state-hover > * > .k-i-ungroup, +.k-button:not(.k-state-disabled):hover .k-i-ungroup, +.k-textbox:hover .k-i-ungroup, +.k-button:active .k-i-ungroup { + background-position: -128px -288px; +} +.k-i-columns { + background-position: -112px -304px; +} +.k-link:not(.k-state-disabled):hover > .k-i-columns, +.k-state-hover > .k-i-columns, +.k-state-hover > * > .k-i-columns, +.k-button:not(.k-state-disabled):hover .k-i-columns, +.k-textbox:hover .k-i-columns, +.k-button:active .k-i-columns { + background-position: -128px -304px; +} +.k-i-hbars { + background-position: -64px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-i-hbars, +.k-state-hover > .k-i-hbars, +.k-state-hover > * > .k-i-hbars, +.k-button:not(.k-state-disabled):hover .k-i-hbars, +.k-textbox:hover .k-i-hbars, +.k-button:active .k-i-hbars { + background-position: -80px -32px; +} +.k-i-vbars { + background-position: -64px -48px; +} +.k-link:not(.k-state-disabled):hover > .k-i-vbars, +.k-state-hover > .k-i-vbars, +.k-state-hover > * > .k-i-vbars, +.k-button:not(.k-state-disabled):hover .k-i-vbars, +.k-textbox:hover .k-i-vbars, +.k-button:active .k-i-vbars { + background-position: -80px -48px; +} +.k-i-sum { + background-position: -64px -64px; +} +.k-link:not(.k-state-disabled):hover > .k-i-sum, +.k-state-hover > .k-i-sum, +.k-state-hover > * > .k-i-sum, +.k-button:not(.k-state-disabled):hover .k-i-sum, +.k-textbox:hover .k-i-sum, +.k-button:active .k-i-sum { + background-position: -80px -64px; +} +.k-i-pdf { + background-position: -64px -80px; +} +.k-link:not(.k-state-disabled):hover > .k-i-pdf, +.k-state-hover > .k-i-pdf, +.k-state-hover > * > .k-i-pdf, +.k-button:not(.k-state-disabled):hover .k-i-pdf, +.k-textbox:hover .k-i-pdf, +.k-button:active .k-i-pdf { + background-position: -80px -80px; +} +.k-i-excel { + background-position: -64px -96px; +} +.k-link:not(.k-state-disabled):hover > .k-i-excel, +.k-state-hover > .k-i-excel, +.k-state-hover > * > .k-i-excel, +.k-button:not(.k-state-disabled):hover .k-i-excel, +.k-textbox:hover .k-i-excel, +.k-button:active .k-i-excel { + background-position: -80px -96px; +} +.k-i-rotatecw { + background-position: -64px -112px; +} +.k-link:not(.k-state-disabled):hover > .k-i-rotatecw, +.k-state-hover > .k-i-rotatecw, +.k-state-hover > * > .k-i-rotatecw, +.k-button:not(.k-state-disabled):hover .k-i-rotatecw, +.k-textbox:hover .k-i-rotatecw, +.k-button:active .k-i-rotatecw { + background-position: -80px -112px; +} +.k-i-rotateccw { + background-position: -64px -128px; +} +.k-link:not(.k-state-disabled):hover > .k-i-rotateccw, +.k-state-hover > .k-i-rotateccw, +.k-state-hover > * > .k-i-rotateccw, +.k-button:not(.k-state-disabled):hover .k-i-rotateccw, +.k-textbox:hover .k-i-rotateccw, +.k-button:active .k-i-rotateccw { + background-position: -80px -128px; +} +.k-i-undo { + background-position: -64px -160px; +} +.k-link:not(.k-state-disabled):hover > .k-i-undo, +.k-state-hover > .k-i-undo, +.k-state-hover > * > .k-i-undo, +.k-button:not(.k-state-disabled):hover .k-i-undo, +.k-textbox:hover .k-i-undo, +.k-button:active .k-i-undo { + background-position: -80px -160px; +} +.k-i-redo { + background-position: -64px -144px; +} +.k-link:not(.k-state-disabled):hover > .k-i-redo, +.k-state-hover > .k-i-redo, +.k-state-hover > * > .k-i-redo, +.k-button:not(.k-state-disabled):hover .k-i-redo, +.k-textbox:hover .k-i-redo, +.k-button:active .k-i-redo { + background-position: -80px -144px; +} +.k-i-shape { + background-position: -64px -176px; +} +.k-link:not(.k-state-disabled):hover > .k-i-shape, +.k-state-hover > .k-i-shape, +.k-state-hover > * > .k-i-shape, +.k-button:not(.k-state-disabled):hover .k-i-shape, +.k-textbox:hover .k-i-shape, +.k-button:active .k-i-shape { + background-position: -80px -176px; +} +.k-i-connector { + background-position: -64px -192px; +} +.k-link:not(.k-state-disabled):hover > .k-i-connector, +.k-state-hover > .k-i-connector, +.k-state-hover > * > .k-i-connector, +.k-button:not(.k-state-disabled):hover .k-i-connector, +.k-textbox:hover .k-i-connector, +.k-button:active .k-i-connector { + background-position: -80px -192px; +} +.k-i-kpi { + background-position: -64px -208px; +} +.k-link:not(.k-state-disabled):hover > .k-i-kpi, +.k-state-hover > .k-i-kpi, +.k-state-hover > * > .k-i-kpi, +.k-button:not(.k-state-disabled):hover .k-i-kpi, +.k-textbox:hover .k-i-kpi, +.k-button:active .k-i-kpi { + background-position: -80px -208px; +} +.k-i-dimension { + background-position: -64px -224px; +} +.k-link:not(.k-state-disabled):hover > .k-i-dimension, +.k-state-hover > .k-i-dimension, +.k-state-hover > * > .k-i-dimension, +.k-button:not(.k-state-disabled):hover .k-i-dimension, +.k-textbox:hover .k-i-dimension, +.k-button:active .k-i-dimension { + background-position: -80px -224px; +} +.k-file { + background-position: 0px 0px; +} +.k-link:not(.k-state-disabled):hover > .k-file, +.k-state-hover > .k-file, +.k-state-hover > * > .k-file, +.k-button:not(.k-state-disabled):hover .k-file, +.k-textbox:hover .k-file, +.k-button:active .k-file { + background-position: -16px 0px; +} +.k-i-folder-add, +.k-addfolder { + background-position: -32px -272px; +} +.k-link:not(.k-state-disabled):hover > .k-i-folder-add, +.k-link:not(.k-state-disabled):hover > .k-addfolder, +.k-state-hover > .k-i-folder-add, +.k-state-hover > .k-addfolder, +.k-state-hover > * > .k-i-folder-add, +.k-state-hover > * > .k-addfolder, +.k-button:not(.k-state-disabled):hover .k-i-folder-add, +.k-button:not(.k-state-disabled):hover .k-addfolder, +.k-textbox:hover .k-i-folder-add, +.k-textbox:hover .k-addfolder, +.k-button:active .k-i-folder-add, +.k-button:active .k-addfolder { + background-position: -48px -272px; +} +.k-i-folder-up, +.k-goup { + background-position: -32px -288px; +} +.k-link:not(.k-state-disabled):hover > .k-i-folder-up, +.k-link:not(.k-state-disabled):hover > .k-goup, +.k-state-hover > .k-i-folder-up, +.k-state-hover > .k-goup, +.k-state-hover > * > .k-i-folder-up, +.k-state-hover > * > .k-goup, +.k-button:not(.k-state-disabled):hover .k-i-folder-up, +.k-button:not(.k-state-disabled):hover .k-goup, +.k-textbox:hover .k-i-folder-up, +.k-textbox:hover .k-goup, +.k-button:active .k-i-folder-up, +.k-button:active .k-goup { + background-position: -48px -288px; +} +.k-i-more { + background-position: -64px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-i-more, +.k-state-hover > .k-i-more, +.k-state-hover > * > .k-i-more, +.k-button:not(.k-state-disabled):hover .k-i-more, +.k-textbox:hover .k-i-more, +.k-button:active .k-i-more { + background-position: -80px -32px; +} +.k-file > .k-icon { + background-position: -115px -91px; +} +.k-image { + border: 0; +} +.k-breadcrumbs:hover .k-i-arrow-n { + background-position: 0 0; +} +.k-breadcrumbs:hover .k-i-arrow-e { + background-position: 0 -16px; +} +/* Dropdown icon in k-scheduler-views */ +.k-pager-numbers .k-current-page .k-link:after, +.k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after { + background-position: 0px -32px; +} +.k-link:not(.k-state-disabled):hover > .k-pager-numbers .k-current-page .k-link:after, +.k-link:not(.k-state-disabled):hover > .k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after, +.k-state-hover > .k-pager-numbers .k-current-page .k-link:after, +.k-state-hover > .k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after, +.k-state-hover > * > .k-pager-numbers .k-current-page .k-link:after, +.k-state-hover > * > .k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after, +.k-button:not(.k-state-disabled):hover .k-pager-numbers .k-current-page .k-link:after, +.k-button:not(.k-state-disabled):hover .k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after, +.k-textbox:hover .k-pager-numbers .k-current-page .k-link:after, +.k-textbox:hover .k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after, +.k-button:active .k-pager-numbers .k-current-page .k-link:after, +.k-button:active .k-scheduler-toolbar > ul.k-scheduler-views > li.k-current-view .k-link:after { + background-position: -16px -32px; +} +/* Colors */ +html .k-success-colored { + color: #507f50; + border-color: #d0dfd0; + background-color: #f0fff0; +} +html .k-info-colored { + color: #50607f; + border-color: #d0d9df; + background-color: #f0f9ff; +} +html .k-error-colored { + color: #7f5050; + border-color: #dfd0d0; + background-color: #fff0f0; +} +.k-inline-block { + padding: 0 2px; +} +/* loading */ +.k-loading, +.k-loading-image { + background-color: transparent; + background-repeat: no-repeat; + background-position: center center; +} +.k-loading-mask, +.k-loading-image, +.k-loading-text { + position: absolute; +} +.k-loading-mask { + z-index: 100; +} +.k-loading-text { + text-indent: -4000px; + text-align: center; + /*rtl*/ +} +.k-loading-image, +.k-loading-color { + width: 100%; + height: 100%; +} +.k-loading-image { + top: 0; + left: 0; + z-index: 2; +} +.k-loading-color { + filter: alpha(opacity=30); + opacity: .3; +} +.k-content-frame { + border: 0; + width: 100%; + height: 100%; +} +.k-pane > .k-splitter-overlay { + filter: alpha(opacity=0); + opacity: 0; + position: absolute; +} +/* drag n drop */ +.k-drag-clue { + position: absolute; + z-index: 10003; + border-style: solid; + border-width: 1px; + font-size: .9em; + padding: .2em .4em; + white-space: nowrap; + cursor: default; +} +.k-drag-status { + margin-top: -3px; + margin-right: 4px; + vertical-align: middle; +} +.k-reorder-cue { + position: absolute; + width: 1px; + overflow: visible; +} +.k-reorder-cue .k-icon { + position: absolute; + left: -4px; + width: 8px; + height: 4px; +} +.k-reorder-cue .k-i-arrow-s { + top: -4px; + background-position: -4px -166px; +} +.k-reorder-cue .k-i-arrow-n { + bottom: -4px; + background-position: -4px -134px; +} +/* virtual scrollbar */ +.k-scrollbar { + position: absolute; + overflow: scroll; +} +.k-scrollbar-vertical { + top: 0; + right: 0; + width: 17px; + /* scrollbar width */ + height: 100%; + overflow-x: hidden; +} +.k-touch-scrollbar { + display: none; + position: absolute; + z-index: 200000; + height: 8px; + width: 8px; + border: 1px solid #8a8a8a; + background-color: #858585; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2) { + body .k-touch-scrollbar { + height: 12px; + width: 12px; + border-radius: 7px; + } +} +.k-virtual-scrollable-wrap { + overflow-x: auto; + /*needed by IE8*/ +} +/* current time indicator */ +.k-current-time { + background: #f00; + position: absolute; +} +/* override box sizing for grid layout framework integration (Bootstrap 3, Foundation 4) */ +.k-animation-container, +.k-widget, +.k-widget *, +.k-animation-container *, +.k-widget *:before, +.k-animation-container *:after, +.k-block .k-header, +.k-list-container { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +.k-button, +.k-textbox, +.k-autocomplete, +div.k-window-content, +.k-tabstrip > .k-content > .km-scroll-container, +.k-block, +.k-edit-cell .k-widget, +.k-grid-edit-row .k-widget, +.k-grid-edit-row .text-box, +.km-actionsheet > li, +.km-shim { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* Fix for Bootstrap 3 */ +.input-group .form-control { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.form-control.k-widget { + padding: 0; +} +a.k-button:hover { + text-decoration: none; +} +/* override iOS styles in mobile Kendo */ +.k-widget, +.k-widget * { + -moz-background-clip: border-box; + -webkit-background-clip: border-box; + background-clip: border-box; +} +input.k-checkbox, +.k-radio { + display: inline; + opacity: 0; + width: 0; + margin: 0; + position: absolute; +} +.k-checkbox-label { + position: relative; + padding-left: 1.5em; + vertical-align: middle; + line-height: 0.875em; + cursor: pointer; +} +.k-checkbox-label:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 1em; + height: 1em; + border-width: 1px; + border-style: solid; +} +.k-checkbox-label:after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 1em; + height: 1em; + border-width: 1px; + border-style: solid; +} +.k-checkbox:checked + .k-checkbox-label:after { + content: "\2713"; + width: 1em; + height: 1em; + position: absolute; + top: 0; + left: 0; + border-width: 1px; + border-style: solid; + text-align: center; +} +.k-checkbox:disabled + .k-checkbox-label { + cursor: auto; +} +.k-radio-label { + position: relative; + padding-left: 1.5em; + vertical-align: middle; + line-height: 0.875em; + cursor: pointer; +} +.k-radio-label:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 14px; + height: 14px; + border-style: solid; +} +.k-radio:checked + .k-radio-label:after { + content: ""; + width: 10px; + height: 10px; + position: absolute; + top: 3px; + left: 3px; +} +.k-radio:disabled + .k-radio-label { + cursor: auto; +} +.k-ie8 input.k-checkbox, +.k-ie8 .k-radio { + display: inline-block; + width: auto; +} +.k-ie8 .k-checkbox-label, +.k-ie8 .k-radio-label { + padding-left: 0; +} +.k-ie8 .k-checkbox-label:before, +.k-ie8 .k-checkbox-label:after, +.k-ie8 .k-radio-label:before, +.k-ie8 .k-radio-label:after { + display: none; +} +/* RTL for checkboxes and radio buttons */ +.k-rtl .k-checkbox-label, +.k-rtl .k-radio-label { + padding-right: 1.5em; +} +.k-rtl .k-checkbox-label:before, +.k-rtl .k-checkbox-label:after, +.k-rtl .k-radio-label:before { + right: 0; +} +.k-rtl .k-radio:checked + .k-radio-label:after { + right: 3px; +} +input.k-checkbox + label { + -webkit-user-select: none; + user-select: none; +} +/* Off-screen container used during export */ +.k-pdf-export-shadow { + position: absolute; + overflow: hidden; + left: -15000px; + width: 14400px; +} +/* Calendar */ +.k-calendar { + position: relative; + display: inline-block; + width: 16.917em; + overflow: hidden; +} +.k-calendar td, +.k-calendar .k-link { + text-decoration: none; +} +.k-calendar .k-action-link { + text-decoration: underline; +} +.k-calendar .k-header, +.k-calendar .k-footer { + position: relative; + text-align: center; + zoom: 1; +} +.k-widget.k-calendar .k-nav-prev, +.k-widget.k-calendar .k-nav-next { + position: absolute; + top: 0.16666em; + line-height: 1.8333em; + height: 1.8333em; +} +.k-widget.k-calendar .k-nav-prev { + left: 1%; +} +.k-widget.k-calendar .k-nav-next { + right: 1%; +} +.k-calendar .k-content { + float: left; + border-spacing: 0; + width: 100%; + height: 14.167em; + border-width: 0; + margin: 0; + table-layout: fixed; + outline: 0; +} +.k-calendar .k-content, +.k-calendar .k-content th { + text-align: right; +} +.k-calendar .k-animation-container .k-content { + height: 100%; +} +.k-widget.k-calendar .k-nav-fast { + display: inline-block; + width: 75%; + height: 1.8333em; + line-height: 1.8333em; + margin: 0.16666em -0.08333em 0.3333em 0; +} +.k-calendar .k-header .k-icon { + vertical-align: middle; +} +.k-calendar .k-header .k-link.k-nav-prev, +.k-calendar .k-header .k-link.k-nav-next { + height: 1.8333em; + width: 1.8333em; +} +.k-calendar th { + border-bottom-style: solid; + border-bottom-width: 1px; + padding: .4em .45em .4em .1em; + font-weight: normal; + cursor: default; +} +.k-calendar td { + padding: 0.08333em; + cursor: pointer; +} +.k-calendar .k-state-focus { + border-style: dotted; + border-width: 0.08333em; + padding: 0; +} +.k-calendar .k-content .k-link { + display: block; + overflow: hidden; + min-height: 1.8333em; + line-height: 1.8333em; + padding: 0 .45em 0 .1em; +} +.k-calendar .k-meta-view .k-link { + padding: .25em 0 .3em; + text-align: center; +} +.k-calendar .k-footer { + clear: both; +} +.k-calendar .k-footer .k-nav-today, +.k-calendar .k-footer > .k-state-disabled { + display: block; + height: 100%; + padding: .5em 0; +} +.k-calendar .k-nav-today:hover { + text-decoration: underline; +} +/* ComboBox & DropDownList */ +span.k-datepicker, +span.k-timepicker, +span.k-datetimepicker, +span.k-colorpicker, +span.k-numerictextbox, +span.k-combobox, +span.k-dropdown, +.k-toolbar .k-split-button { + background-image: none; +} +.k-autocomplete, +.k-combobox, +.k-datepicker, +.k-timepicker, +.k-datetimepicker, +.k-colorpicker, +.k-numerictextbox, +.k-dropdown, +.k-selectbox, +.k-textbox, +.k-toolbar .k-split-button { + position: relative; + display: inline-block; + width: 12.4em; + overflow: visible; + border-width: 0; + vertical-align: middle; +} +.k-filter-menu .k-combobox, +.k-filter-menu .k-datepicker, +.k-filter-menu .k-timepicker, +.k-filter-menu .k-datetimepicker, +.k-filter-menu .k-numerictextbox, +.k-filter-menu .k-dropdown, +.k-filter-menu .k-textbox { + width: 13.2em; +} +.k-autocomplete, +.k-combobox, +.k-datepicker, +.k-timepicker, +.k-datetimepicker, +.k-colorpicker, +.k-numerictextbox, +.k-dropdown, +.k-selectbox, +.k-toolbar .k-split-button { + white-space: nowrap; +} +.k-colorpicker, +.k-toolbar .k-split-button { + width: auto; +} +.k-datetimepicker { + width: 15em; +} +.k-autocomplete, +.k-picker-wrap, +.k-numeric-wrap { + position: relative; + cursor: default; +} +.k-dropdown-wrap { + position: relative; +} +.k-dropdown-wrap, +.k-picker-wrap, +.k-numeric-wrap { + display: block; +} +.k-block, +.k-widget, +.k-grid, +.k-slider, +.k-splitter, +.k-treeview, +.k-panelbar, +.k-content, +.k-header-column-menu { + outline: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.k-block, +.k-slider, +.k-splitbar, +.k-calendar, +.k-treeview, +.k-pager-wrap, +.k-grid-header .k-link, +.k-header-column-menu { + -webkit-touch-callout: none; +} +.k-popup.k-list-container, +.k-popup.k-calendar-container { + -webkit-touch-callout: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + padding: 2px; + border-width: 1px; + border-style: solid; +} +.k-list-container.k-state-border-down, +.k-autocomplete.k-state-border-down, +.k-dropdown-wrap.k-state-border-down, +.k-picker-wrap.k-state-border-down, +.k-numeric-wrap.k-state-border-down { + border-bottom-width: 0; + padding-bottom: 1px; +} +.k-list-container .km-scroll-container { + padding-bottom: 6px; +} +.k-textbox, +.k-autocomplete, +.k-dropdown-wrap, +.k-picker-wrap, +.k-numeric-wrap { + border-width: 1px; + border-style: solid; + padding: 0 1.9em 0 0; +} +.k-numeric-wrap.k-expand-padding { + padding-right: 0; +} +.k-textbox, +.k-autocomplete { + padding: 0; +} +.k-textbox.k-space-left { + padding-left: 1.9em; +} +.k-textbox.k-space-right { + padding-right: 1.9em; +} +.k-textbox .k-icon { + top: 50%; + margin: -8px 0 0; + position: absolute; +} +.k-space-left .k-icon { + left: 3px; +} +.k-space-right .k-icon { + right: 3px; +} +.k-autocomplete, +.k-dropdown-wrap.k-state-focused, +.k-dropdown-wrap.k-state-hover, +.k-picker-wrap.k-state-focused, +.k-picker-wrap.k-state-hover, +.k-numeric-wrap.k-state-focused, +.k-numeric-wrap.k-state-hover { + -webkit-transition: box-shadow .15s ease-out; + -moz-transition: box-shadow .15s ease-out; + -o-transition: box-shadow .15s ease-out; + transition: box-shadow .15s ease-out; + -webkit-transition: "box-shadow .15s ease-out"; + -moz-transition: "box-shadow .15s ease-out"; + -ms-transition: "box-shadow .15s ease-out"; + -o-transition: "box-shadow .15s ease-out"; + transition: "box-shadow .15s ease-out"; +} +.k-textbox > input, +.k-picker-wrap .k-input, +.k-numeric-wrap .k-input, +.k-combobox .k-input { + width: 100%; + vertical-align: top; +} +.k-picker-wrap .k-input, +.k-numeric-wrap .k-input, +.k-dropdown-wrap .k-input, +.k-selectbox .k-input { + font-family: inherit; + border-width: 0; + outline: 0; +} +.k-dropdown .k-input, +.k-selectbox .k-input { + background: transparent; +} +.k-ie7 .k-picker-wrap .k-input, +.k-ie7 .k-numeric-wrap .k-input, +.k-ie7 .k-combobox .k-input { + margin: -1px 0; +} +/* removes excessive spacing */ +.k-picker-wrap .k-select, +.k-numeric-wrap .k-select, +.k-dropdown-wrap .k-select { + position: absolute; + /* icon positioning */ + top: 0; + right: 0; + display: inline-block; + vertical-align: top; + text-decoration: none; +} +.k-combobox .k-select, +.k-picker-wrap .k-select, +.k-numeric-wrap .k-select { + border-style: solid; + border-width: 0 0 0 1px; + border-color: inherit; + /* skin-related, inherit does not work in ie7- */ +} +span.k-datetimepicker .k-select, +span.k-datetimepicker .k-select + .k-select { + right: 0; +} +.k-textbox > input, +.k-autocomplete .k-input { + display: block; +} +.k-combobox .k-icon { + /*margin-top: 1px;*/ +} +.k-dropdown .k-select, +.k-selectbox .k-select { + overflow: hidden; + border: 0; + text-decoration: none; + font: inherit; + color: inherit; +} +.k-dropdown .k-input, +.k-selectbox .k-input { + display: block; + overflow: hidden; + text-overflow: ellipsis; +} +.k-textbox > input, +.k-autocomplete .k-input, +.k-picker-wrap .k-input, +.k-numeric-wrap .k-input, +.k-dropdown-wrap .k-input, +.k-selectbox .k-input { + height: 1.65em; + line-height: 1.65em; + padding: 0.177em 0; + text-indent: 0.33em; + border: 0; + margin: 0; +} +/* fix missing bottom border on browser zoom in Chrome */ +.k-webkit .k-combobox .k-dropdown-wrap:before, +.k-webkit .k-picker-wrap:before, +.k-webkit .k-numeric-wrap:before { + content: "\a0"; + display: inline-block; + width: 0; + height: 1.65em; + padding-bottom: 0.4em; +} +/* above style breaks NumericTextBox layout due display:block style applied to the input */ +.km.root .k-combobox .k-dropdown-wrap:before, +.km.root .k-picker-wrap:before, +.km.root .k-numeric-wrap:before { + content: none; +} +.k-combobox .k-input, +.k-picker-wrap .k-input, +.k-numeric-wrap .k-input { + display: inline; +} +.k-ie7 .k-autocomplete .k-input, +.k-ie7 .k-picker-wrap .k-input, +.k-ie7 .k-numeric-wrap .k-input, +.k-ie7 .k-dropdown-wrap .k-input, +.k-ie7 .k-selectbox .k-input { + text-indent: 0; +} +.k-picker-wrap .k-select, +.k-numeric-wrap .k-select, +.k-dropdown-wrap .k-select { + min-height: 1.65em; + line-height: 2em; + vertical-align: middle; + -moz-box-sizing: border-box; + text-align: center; + width: 1.9em; + height: 100%; +} +.k-numeric-wrap .k-select { + padding: 0; +} +body .k-datetimepicker .k-select { + border-radius: 0; +} +.k-ie7 .k-picker-wrap .k-icon, +.k-ie7 .k-dropdown-wrap .k-icon { + line-height: 2em; + font-size: 1em; + padding-top: 16px; + height: 0; +} +.k-combobox .k-icon, +.k-dropdown, +.k-selectbox .k-icon { + cursor: pointer; +} +.k-popup { + border-style: solid; + border-width: 1px; +} +.k-popup .k-item, +.k-list-optionlabel { + cursor: default; +} +.k-popup .k-calendar { + border: 0; +} +.k-list { + height: 100%; +} +.k-popup .k-list .k-item, +.k-fieldselector .k-list .k-item, +.k-list-optionlabel, +.k-popup > .k-group-header, +.k-popup > .k-virtual-wrap > .k-group-header { + padding: 1px 5px 1px 5px; + line-height: 1.8em; + min-height: 1.8em; +} +.k-popup > .k-group-header, +.k-popup > .k-virtual-wrap > .k-group-header { + padding-right: 22px; +} +.k-overflow-container .k-item { + padding: 1px; +} +.k-overflow-container > .k-state-disabled .k-button, +.k-overflow-container .k-button.k-state-disabled, +.k-overflow-container .k-button.k-state-disabled:hover { + border: 0 ; + background: none; +} +.k-popup .k-list .k-state-hover, +.k-popup .k-list .k-state-focused, +.k-popup .k-list .k-state-selected, +.k-overflow-container .k-state-hover, +.k-overflow-container .k-state-focused, +.k-overflow-container .k-state-selected, +.k-fieldselector .k-list .k-item, +.k-list-optionlabel.k-state-focused, +.k-list-optionlabel.k-state-selected { + padding: 0 4px; + border-width: 1px; + border-style: solid; +} +.k-list-filter { + position: relative; +} +.k-list-filter > .k-textbox { + padding-right: 20px; + width: 100%; +} +.k-list-filter > .k-icon { + position: absolute; + right: 6px; + top: 1px; +} +/* MultiSelect */ +.k-multiselect-wrap { + position: relative; + border-width: 0px; + border-style: solid; + border-radius: 4px; + border-color: #C5C5C5; + background-color: #FFF; + min-height: 2.04em; +} +.k-multiselect-wrap .k-input { + background-color: transparent; + height: 1.31em; + line-height: 1.31em; + padding: 0.18em 0; + text-indent: 0.33em; + border: 0; + margin: 1px 0 0; + float: left; +} +.k-multiselect-wrap li { + margin: 1px 0 1px 1px; + padding: .1em 1.6em .1em .4em; + line-height: 1.5em; + float: left; + position: relative; +} +.k-autocomplete .k-loading, +.k-multiselect .k-loading { + position: absolute; + right: 3px; + bottom: 4px; +} +.k-multiselect .k-loading-hidden { + visibility: hidden; +} +.k-multiselect-wrap .k-select { + position: absolute; + top: 0; + bottom: 0; + right: 0; + padding: .1em .2em; +} +/* Date/Time Pickers */ +.k-datetimepicker .k-picker-wrap { + padding-right: 3.8em; +} +.k-datetimepicker .k-select { + width: 3.8em; +} +.k-datetimepicker .k-picker-wrap .k-icon { + margin: 0 2px; +} +.k-picker-wrap .k-icon { + cursor: pointer; +} +.k-button, +.k-textbox, +.k-timepicker, +.k-datepicker, +.k-datetimepicker { + display: inline-block; + vertical-align: middle; +} +.k-picker-wrap .k-input { + margin: 0; +} +.k-time-popup .k-item { + padding: 1px 3px; +} +/* inputs */ +.k-input { + padding: 0.25em 0; +} +.k-input, +.k-textbox > input { + outline: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.k-textbox { + outline: 0; +} +input.k-textbox, +textarea.k-textbox { + padding: 2px .3em; +} +input.k-textbox { + height: 2.13em; + text-indent: 0.33em; + line-height: 1.6em; +} +.k-ie input.k-textbox { + text-indent: 0.165em; +} +.k-ff input.k-textbox { + height: 2.17em; +} +.k-ie7 input.k-textbox { + line-height: 1.72em; + height: 1.72em; + text-indent: 0.33em; +} +textarea.k-textbox { + height: auto; +} +.k-ie7 .k-textbox { + padding: 1px 0; + text-indent: 0; +} +/* NumericTextBox */ +span.k-numerictextbox { + background-color: transparent; +} +.k-numerictextbox .k-input { + margin: 0; +} +.k-numerictextbox .k-link { + display: block; + height: 1em; + line-height: 1em; + vertical-align: middle; + border-width: 0; + padding: 0; +} +.k-numerictextbox .k-icon { + height: 11px; +} +.k-numeric-wrap .k-input::-webkit-inner-spin-button { + -webkit-appearance: none; +} +/* ColorPicker */ +.k-colorpicker .k-picker-wrap { + line-height: 2em; +} +.k-colorpicker .k-selected-color { + vertical-align: top; + line-height: 0; + display: inline-block; + height: 2em; + width: 2em; +} +.k-colorpicker .k-tool-icon { + position: relative; + top: -2px; + display: inline-block; + padding: 3px 3px 2px; + font-size: 0; + line-height: 0; + margin-right: 3px; + margin-left: 2px; + margin-bottom: 3px; + background-repeat: no-repeat; + vertical-align: middle; + width: 16px; + height: 16px; + -ms-high-contrast-adjust: none; +} +.k-colorpicker .k-tool-icon .k-selected-color { + display: block; + height: 3px; + width: 16px; + position: absolute; + left: 3px; + bottom: -3px; + border-radius: 0 !important; +} +.k-colorpicker .k-icon { + cursor: pointer; +} +.k-disabled-overlay { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #fff; + opacity: 0.5; + filter: alpha(opacity=50); +} +.k-colorpalette { + position: relative; + line-height: 0; + border-width: 0; + display: inline-block; +} +.k-colorpalette .k-palette { + border-collapse: collapse; + position: relative; + width: 100%; + height: 100%; +} +.k-colorpalette .k-item { + width: 14px; + height: 14px; + overflow: hidden; + -ms-high-contrast-adjust: none; +} +.k-colorpalette .k-item.k-state-selected { + z-index: 100; + background: transparent; + box-shadow: 0 1px 4px #000, inset 0 0 3px #fff; + position: relative; +} +.k-flatcolorpicker { + position: relative; + display: inline-block; + width: 250px; + padding-bottom: 5px; +} +div.k-flatcolorpicker { + background-color: transparent; + background-image: none; +} +.k-flatcolorpicker .k-selected-color { + background-image: url("textures/transtexture.png"); + background-position: 50% 50%; + text-align: right; +} +.k-flatcolorpicker .k-selected-color input.k-color-value { + font-family: Consolas, "Ubuntu Mono", "Lucida Console", "Courier New", monospace; + padding: .75em .3em .65em 1em; + border: 0; + margin: 0; + width: 70%; +} +.k-flatcolorpicker .k-hsv-rectangle { + position: relative; + -khtml-user-select: none; + -webkit-user-select: none; + -moz-user-select: -moz-none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: pinch-zoom double-tap-zoom; +} +.k-flatcolorpicker .k-hsv-rectangle .k-draghandle { + cursor: pointer; + position: absolute; + z-index: 10; + left: 50%; + top: 50%; + width: 8px; + height: 8px; + border: 1px solid #eee; + margin-left: -5px; + margin-top: -5px; + border-radius: 6px; + -webkit-box-shadow: 0 1px 2px #444444; + box-shadow: 0 1px 2px #444444; + background: transparent; +} +.k-flatcolorpicker .k-hsv-rectangle .k-draghandle:hover, +.k-flatcolorpicker .k-hsv-rectangle .k-draghandle:focus { + background: transparent; + border-color: #fff; + -webkit-box-shadow: 0 1px 5px #000000; + box-shadow: 0 1px 5px #000000; +} +.k-flatcolorpicker .k-hsv-rectangle.k-dragging, +.k-flatcolorpicker .k-hsv-rectangle.k-dragging * { + cursor: none; +} +.k-flatcolorpicker .k-slider-horizontal { + height: 20px; + width: 90%; + margin: 0 5%; +} +.k-flatcolorpicker .k-slider-horizontal .k-slider-track { + -webkit-box-shadow: 0 1px 0 #fff, 0 -1px 0 #999; + box-shadow: 0 1px 0 #fff, 0 -1px 0 #999; +} +.k-flatcolorpicker .k-hue-slider, +.k-flatcolorpicker .k-transparency-slider { + display: block; +} +.k-flatcolorpicker .k-hue-slider .k-slider-selection, +.k-flatcolorpicker .k-transparency-slider .k-slider-selection { + background: transparent; +} +.k-flatcolorpicker .k-hue-slider .k-draghandle, +.k-flatcolorpicker .k-transparency-slider .k-draghandle { + background: transparent; + border: 3px solid #eee; + margin-top: 1px; + height: 8px; + width: 8px; + -webkit-box-shadow: 0 1px 4px #444444; + box-shadow: 0 1px 4px #444444; +} +.k-flatcolorpicker .k-hue-slider .k-draghandle:hover, +.k-flatcolorpicker .k-transparency-slider .k-draghandle:hover, +.k-flatcolorpicker .k-hue-slider .k-draghandle:focus, +.k-flatcolorpicker .k-transparency-slider .k-draghandle:focus { + background: transparent; + border-color: #fff; + -webkit-box-shadow: 0 1px 5px #000000; + box-shadow: 0 1px 5px #000000; + border-width: 2px; + padding: 1px; +} +.k-flatcolorpicker .k-hue-slider .k-slider-track { + background: -moz-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, right top, color-stop(0%, #ff0000), color-stop(16%, #ffff00), color-stop(33%, #00ff00), color-stop(50%, #00ffff), color-stop(67%, #0000ff), color-stop(84%, #ff00ff), color-stop(100%, #ff0004)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(left, #ff0000 0%, #ffff00 16%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 84%, #ff0004 100%); + /* IE10+ */ + background: -left-linear-gradient(left,#ff0000 0%,#ffff00 16%,#00ff00 33%,#00ffff 50%,#0000ff 67%,#ff00ff 84%,#ff0004 100%); + /* W3C */ +} +.k-flatcolorpicker .k-transparency-slider .k-slider-track { + background-image: url("textures/transparency.png"); + background-size: 100% auto; + background-position: 100% 50%; + background-repeat: no-repeat; +} +.k-flatcolorpicker .k-controls { + margin-top: 10px; + margin-bottom: 5px; + text-align: center; + font-size: 90%; +} +.k-flatcolorpicker .k-controls .k-button { + width: 6em; +} +.k-flatcolorpicker .k-hsv-gradient { + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* FF3.6+ */ -moz-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, #000000)), /* Chrome,Safari4+ */ -webkit-gradient(linear, left top, right top, color-stop(0%, #ffffff), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* Chrome10+,Safari5.1+ */ -webkit-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* Opera 11.10+ */ -o-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(0, 0, 0, 0) 0%, #000000 100%), /* IE10+ */ -ms-linear-gradient(left, #ffffff 0%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -top-linear-gradient(top,rgba(0,0,0,0) 0%,#000000 100%), /* W3C */ -left-linear-gradient(left,#ffffff 0%,rgba(255,255,255,0) 100%); + /* W3C */ + height: 180px; + margin-bottom: 5px; +} +.k-ie9 .k-flatcolorpicker .k-hue-slider .k-slider-track { + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjE2JSIgc3RvcC1jb2xvcj0iI2ZmZmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjMzJSIgc3RvcC1jb2xvcj0iIzAwZmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjY3JSIgc3RvcC1jb2xvcj0iIzAwMDBmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ijg0JSIgc3RvcC1jb2xvcj0iI2ZmMDBmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZjAwMDQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); +} +.k-ie9 .k-flatcolorpicker .k-hsv-gradient { + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); +} +.k-ie7 .k-flatcolorpicker .k-hue-slider .k-slider-track, +.k-ie8 .k-flatcolorpicker .k-hue-slider .k-slider-track { + background: url("textures/hue.png") repeat 0 50%; +} +.k-ie7 .k-flatcolorpicker .k-transparency-slider .k-slider-track, +.k-ie8 .k-flatcolorpicker .k-transparency-slider .k-slider-track { + background: url("textures/transparency.png") repeat 0 50%; +} +.k-ie7 .k-flatcolorpicker .k-hsv-gradient, +.k-ie8 .k-flatcolorpicker .k-hsv-gradient { + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#00ffffff',GradientType=1) progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#ff000000',GradientType=0); +} diff --git a/user/plugins/admin/themes/grav/css/datepicker/kendo.flat.min.css b/user/plugins/admin/themes/grav/css/datepicker/kendo.flat.min.css new file mode 100644 index 0000000..bfccf16 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/datepicker/kendo.flat.min.css @@ -0,0 +1 @@ +.k-in,.k-item,.k-window-action{border-color:transparent}.k-block,.k-widget{background-color:#fff}.k-block,.k-widget,.k-input,.k-textbox,.k-group,.k-content,.k-header,.k-filter-row>th,.k-editable-area,.k-separator,.k-colorpicker .k-i-arrow-s,.k-textbox>input,.k-autocomplete,.k-dropdown-wrap,.k-toolbar,.k-group-footer td,.k-grid-footer,.k-footer-template td,.k-state-default,.k-state-default .k-select,.k-state-disabled,.k-grid-header,.k-grid-header-wrap,.k-grid-header-locked,.k-grid-footer-locked,.k-grid-content-locked,.k-grid td,.k-grid td.k-state-selected,.k-grid-footer-wrap,.k-pager-wrap,.k-pager-wrap .k-link,.k-pager-refresh,.k-grouping-header,.k-grouping-header .k-group-indicator,.k-panelbar>.k-item>.k-link,.k-panel>.k-item>.k-link,.k-panelbar .k-panel,.k-panelbar .k-content,.k-treemap-tile,.k-calendar th,.k-slider-track,.k-splitbar,.k-dropzone-active,.k-tiles,.k-toolbar,.k-tooltip,.k-button-group .k-tool,.k-upload-files{border-color:#ccc}.k-group,.k-toolbar,.k-grouping-header,.k-pager-wrap,.k-group-footer td,.k-grid-footer,.k-footer-template td,.k-widget .k-status,.k-calendar th,.k-dropzone-hovered,.k-widget.k-popup{background-color:#253a47}.k-grouping-row td,td.k-group-cell,.k-resize-handle-inner{background-color:#253a47}.k-list-container{border-color:#253a47;background-color:#253a47}.k-content,.k-editable-area,.k-panelbar>li.k-item,.k-panel>li.k-item,.k-tiles{background-color:#fff}.k-alt,.k-separator,.k-resource.k-alt,.k-pivot-layout>tbody>tr:first-child>td:first-child{background-color:#f5f5f5}.k-pivot-rowheaders .k-alt .k-alt,.k-header.k-alt{background-color:#e0e0e0}.k-textbox,.k-autocomplete.k-header,.k-dropdown-wrap.k-state-active,.k-picker-wrap.k-state-active,.k-numeric-wrap.k-state-active{border-color:#ccc;background-color:#253a47}.k-textbox>input,.k-autocomplete .k-input,.k-dropdown-wrap .k-input,.k-autocomplete.k-state-focused .k-input,.k-dropdown-wrap.k-state-focused .k-input,.k-picker-wrap.k-state-focused .k-input,.k-numeric-wrap.k-state-focused .k-input{border-color:#ccc}input.k-textbox,textarea.k-textbox,input.k-textbox:hover,textarea.k-textbox:hover,.k-textbox>input{background:0}.k-input,input.k-textbox,textarea.k-textbox,input.k-textbox:hover,textarea.k-textbox:hover,.k-textbox>input,.k-multiselect-wrap{background-color:#fff;color:#737c81}.k-input[readonly]{background-color:#fff;color:#737c81}.k-block,.k-widget,.k-popup,.k-content,.k-toolbar,.k-dropdown .k-input{color:#737c81}.k-inverse{color:#fff}.k-block{color:#fff}.k-link:link,.k-link:visited,.k-nav-current.k-state-hover .k-link{color:#fff}.k-tabstrip-items .k-link,.k-panelbar>li>.k-link{color:#737c81}.k-header,.k-treemap-title,.k-grid-header .k-header>.k-link{color:#fff}.k-header,.k-grid-header,.k-toolbar,.k-dropdown-wrap,.k-picker-wrap,.k-numeric-wrap,.k-grouping-header,.k-pager-wrap,.k-textbox,.k-button,.k-progressbar,.k-draghandle,.k-autocomplete,.k-state-highlight,.k-tabstrip-items .k-item,.k-panelbar .k-tabstrip-items .k-item,.km-pane-wrapper>.km-pane>.km-view>.km-content{background-image:none;background-position:50% 50%;background-color:#253a47}.k-widget.k-tooltip{background-image:none}.k-block,.k-header,.k-grid-header,.k-toolbar,.k-grouping-header,.k-pager-wrap,.k-button,.k-draghandle,.k-treemap-tile,html .km-pane-wrapper .k-header{background-color:#253a47}.k-icon:hover,.k-state-hover .k-icon,.k-state-selected .k-icon,.k-state-focused .k-icon,.k-column-menu .k-state-hover .k-sprite,.k-column-menu .k-state-active .k-sprite,.k-pager-numbers .k-current-page .k-link:hover:after,.k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view.k-state-hover>.k-link:after{opacity:1}.k-icon,.k-state-disabled .k-icon,.k-column-menu .k-sprite,.k-pager-numbers .k-current-page .k-link:after,.k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view>.k-link:after{opacity:1}.k-mobile-list .k-check:checked,.k-mobile-list .k-edit-field [type=checkbox]:checked,.k-mobile-list .k-edit-field [type=radio]:checked{opacity:1}.k-tool{border-color:transparent}.k-icon,.k-tool-icon,.k-grouping-dropclue,.k-drop-hint,.k-column-menu .k-sprite,.k-grid-mobile .k-resize-handle-inner:before,.k-grid-mobile .k-resize-handle-inner:after,.k-pager-numbers .k-current-page .k-link:after,.k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view>.k-link:after{background-image:url('Flat/sprite.png');border-color:transparent}.k-mobile-list .k-check:checked,.k-mobile-list .k-edit-field [type=checkbox]:checked,.k-mobile-list .k-edit-field [type=radio]:checked{background-image:url('Flat/sprite.png');border-color:transparent}.k-loading,.k-state-hover .k-loading{background-image:url('Flat/loading.gif');background-position:50% 50%}.k-loading-image{background-image:url('Flat/loading-image.gif')}.k-loading-color{background-color:#fff}.k-button{color:#fff;border-color:#253a47;background-color:#253a47}.k-draghandle{border-color:#41bea8;background-color:#41bea8;-webkit-box-shadow:0;box-shadow:0}.k-draghandle:hover{border-color:#54c5b0;background-color:#54c5b0;-webkit-box-shadow:0;box-shadow:0}.k-scheduler{color:#fff;background-color:#fff}.k-scheduler-layout{color:#737c81}.k-scheduler-datecolumn,.k-scheduler-groupcolumn{background-color:#fff;color:#737c81}.k-scheduler-times tr,.k-scheduler-times th,.k-scheduler-table td,.k-scheduler-header th,.k-scheduler-header-wrap,.k-scheduler-times{border-color:#ccc}.k-nonwork-hour{background-color:#f5f5f5}.k-gantt .k-nonwork-hour{background-color:rgba(0,0,0,0.02)}.k-gantt .k-header.k-nonwork-hour{background-color:rgba(0,0,0,0.2)}.k-scheduler-table .k-today,.k-today>.k-scheduler-datecolumn,.k-today>.k-scheduler-groupcolumn{background-color:#f7f7f7}.k-scheduler-now-arrow{border-left-color:#2c4554}.k-scheduler-now-line{background-color:#2c4554}.k-event,.k-task-complete{border-color:#54c5b0;background:#54c5b0 0 -257px none repeat-x;color:#fff}.k-event-inverse{color:#737c81}.k-event.k-state-selected{background-position:0 0}.k-ie7 .k-event .k-resize-handle,.k-event .k-resize-handle:after,.k-ie7 .k-task-single .k-resize-handle,.k-task-single .k-resize-handle:after{background-color:#fff}.k-scheduler-marquee:before,.k-scheduler-marquee:after{border-color:#41bea8}.k-panelbar .k-content,.k-panelbar .k-panel,.k-panelbar .k-item{background-color:#253a47;color:#fff;border-color:#446b83}.k-panelbar>li>.k-link{color:#fff}.k-panelbar>.k-item>.k-link{border-color:#446b83}.k-panel>li.k-item{background-color:#253a47}.k-state-active,.k-state-active:hover,.k-active-filter,.k-tabstrip .k-state-active{background-color:#41bea8;border-color:#41bea8;color:#fff}.k-fieldselector .k-list-container{background-color:#41bea8}.k-button:focus,.k-button.k-state-focused{border-color:#339483}.k-button:hover,.k-button.k-state-hover{color:#fff;border-color:#54c5b0;background-color:#54c5b0}.k-button:active,.k-button.k-state-active{color:#fff;background-color:#41bea8;border-color:#41bea8}.k-button:active:hover,.k-button.k-state-active:hover{color:#fff;border-color:#54c5b0;background-color:#54c5b0}.k-button[disabled],.k-button.k-state-disabled,.k-state-disabled .k-button,.k-state-disabled .k-button:hover,.k-button.k-state-disabled:hover,.k-state-disabled .k-button:active,.k-button.k-state-disabled:active{color:#c2c2c2;border-color:#ccc;background-color:#f5f5f5;background-image:none}.k-button:focus:not(.k-state-disabled):not([disabled]){-webkit-box-shadow:none;box-shadow:none}.k-button:focus:active:not(.k-state-disabled):not([disabled]){-webkit-box-shadow:none;box-shadow:none}.k-menu .k-state-hover>.k-state-active{background-color:transparent}.k-state-highlight{background:#41bea8;color:#fff}.k-state-focused,.k-grouping-row .k-state-focused{border-color:#339483}.k-calendar .k-link{color:#737c81}.k-calendar .k-footer{padding:0}.k-calendar .k-footer .k-nav-today{color:#fff;text-decoration:none;background-color:#253a47}.k-calendar .k-footer .k-nav-today:hover,.k-calendar .k-footer .k-nav-today.k-state-hover{background-color:#54c5b0;text-decoration:none}.k-calendar .k-footer .k-nav-today:active{background-color:#41bea8}.k-calendar .k-link.k-nav-fast{color:#fff}.k-calendar .k-nav-fast.k-state-hover{text-decoration:underline;background-color:#253a47;color:#fff}.k-calendar .k-link.k-state-hover,.k-window-titlebar .k-link{border-radius:13px}.k-calendar .k-footer .k-link{border-radius:0}.k-calendar th{background-color:#fff}.k-calendar-container.k-group{border-color:#253a47}.k-state-selected,.k-state-selected:link,.k-state-selected:visited,.k-list>.k-state-selected,.k-list>.k-state-highlight,.k-panel>.k-state-selected,.k-ghost-splitbar-vertical,.k-ghost-splitbar-horizontal,.k-draghandle.k-state-selected:hover,.k-scheduler .k-scheduler-toolbar .k-state-selected,.k-scheduler .k-today.k-state-selected,.k-marquee-color{color:#fff;background-color:#41bea8;border-color:#41bea8}.k-virtual-item.k-first,.k-group-header+.k-list>.k-item.k-first,.k-static-header+.k-list>.k-item.k-first{border-top-color:#54c5b0}.k-popup>.k-group-header,.k-popup>.k-virtual-wrap>.k-group-header{background:#54c5b0;color:#fff}.k-popup .k-list .k-item>.k-group{background:#54c5b0;color:#fff;border-bottom-left-radius:1.8px}.k-marquee-text{color:#fff}.k-state-focused,.k-list>.k-state-focused,.k-listview>.k-state-focused,.k-grid-header th.k-state-focused,td.k-state-focused,.k-button.k-state-focused{-webkit-box-shadow:inset 0 0 0 1px #339483;box-shadow:inset 0 0 0 1px #339483}.k-state-focused.k-state-selected,.k-list>.k-state-focused.k-state-selected,.k-listview>.k-state-focused.k-state-selected,td.k-state-focused.k-state-selected{-webkit-box-shadow:inset 0 0 0 1px #339483;box-shadow:inset 0 0 0 1px #339483}.k-ie8 .k-panelbar span.k-state-focused,.k-ie8 .k-menu li.k-state-focused,.k-ie8 .k-listview>.k-state-focused,.k-ie8 .k-grid-header th.k-state-focused,.k-ie8 td.k-state-focused,.k-ie8 .k-tool.k-state-hover,.k-ie8 .k-button:focus,.k-ie8 .k-button.k-state-focused,.k-ie7 .k-panelbar span.k-state-focused,.k-ie7 .k-menu li.k-state-focused,.k-ie7 .k-listview>.k-state-focused,.k-ie7 .k-grid-header th.k-state-focused,.k-ie7 td.k-state-focused,.k-ie7 .k-tool.k-state-hover,.k-ie7 .k-button:focus,.k-ie7 .k-button.k-state-focused{background-color:#54c5b0}.k-list>.k-state-selected.k-state-focused,.k-list-optionlabel.k-state-selected.k-state-focused{-webkit-box-shadow:none;box-shadow:none}.k-state-selected>.k-link,.k-panelbar>li>.k-state-selected,.k-panelbar>li.k-state-default>.k-link.k-state-selected{color:#fff}.k-state-hover,.k-state-hover:hover,.k-splitbar-horizontal-hover:hover,.k-splitbar-vertical-hover:hover,.k-list>.k-state-hover,.k-scheduler .k-scheduler-toolbar ul li.k-state-hover,.k-pager-wrap .k-link:hover,.k-dropdown .k-state-focused,.k-filebrowser-dropzone,.k-mobile-list .k-item>.k-link:active,.k-mobile-list .k-item>.k-label:active,.k-mobile-list .k-edit-label.k-check:active,.k-mobile-list .k-recur-view .k-check:active{color:#fff;background-color:#54c5b0;border-color:#54c5b0}.k-mobile-list .k-scheduler-timezones .k-edit-field:nth-child(2):active{color:#fff;background-color:#54c5b0;border-color:#54c5b0}.k-ie7 .k-window-titlebar .k-state-hover,.k-ie8 .k-window-titlebar .k-state-hover{border-color:#54c5b0}.k-state-hover>.k-select,.k-state-focused>.k-select{border-color:#54c5b0}.k-button:hover,.k-button.k-state-hover,.k-button:focus,.k-button.k-state-focused,.k-textbox:hover,.k-state-hover,.k-state-hover:hover,.k-pager-wrap .k-link:hover,.k-other-month.k-state-hover .k-link,div.k-filebrowser-dropzone em,.k-draghandle:hover{background-image:none}.k-pager-wrap{background-color:#253a47;color:#fff}.k-autocomplete.k-state-active,.k-picker-wrap.k-state-active,.k-numeric-wrap.k-state-active,.k-dropdown-wrap.k-state-active,.k-state-active,.k-state-active:hover,.k-state-active>.k-link,.k-button:active,.k-panelbar>.k-item>.k-state-focused{background-image:none}.k-state-selected,.k-button:active,.k-button.k-state-active,.k-draghandle.k-state-selected:hover{background-image:none}.k-button:active,.k-button.k-state-active,.k-draghandle.k-state-selected:hover{background-position:50% 50%}.k-tool-icon{background-image:url('Flat/sprite.png')}.k-state-hover>.k-link,.k-other-month.k-state-hover .k-link,div.k-filebrowser-dropzone em{color:#fff}.k-autocomplete.k-state-hover,.k-autocomplete.k-state-focused,.k-picker-wrap.k-state-hover,.k-picker-wrap.k-state-focused,.k-numeric-wrap.k-state-hover,.k-numeric-wrap.k-state-focused,.k-dropdown-wrap.k-state-hover,.k-dropdown-wrap.k-state-focused{background-color:#54c5b0;background-image:none;background-position:50% 50%;border-color:#54c5b0}.km-pane-wrapper .k-mobile-list input:not([type="checkbox"]):not([type="radio"]),.km-pane-wrapper .km-pane .k-mobile-list select:not([multiple]),.km-pane-wrapper .k-mobile-list textarea,.k-dropdown .k-state-focused .k-input{color:#737c81}.k-dropdown .k-state-hover .k-input{color:#fff}.k-state-error{border-color:#2c4554;background-color:#fff;color:#2c4554}.k-state-disabled{opacity:.7}.k-ie7 .k-state-disabled,.k-ie8 .k-state-disabled{filter:alpha(opacity=70)}.k-tile-empty.k-state-selected,.k-loading-mask.k-state-selected{border-width:0;background-image:none;background-color:transparent}.k-state-disabled,.k-state-disabled .k-link,.k-state-disabled .k-button,.k-other-month,.k-other-month .k-link,.k-dropzone em,.k-dropzone .k-upload-status,.k-tile-empty strong,.k-slider .k-draghandle{color:#c2c2c2}.k-progressbar-indeterminate{background:url('Flat/indeterminate.gif')}.k-progressbar-indeterminate .k-progress-status-wrap,.k-progressbar-indeterminate .k-state-selected{display:none}.k-slider-track{background-color:#ccc}.k-slider-selection{background-color:#41bea8}.k-slider-horizontal .k-tick{background-image:url('Flat/slider-h.gif')}.k-slider-vertical .k-tick{background-image:url('Flat/slider-v.gif')}.k-widget.k-tooltip{border-color:#253a47;background-color:#253a47;color:#fff}.k-widget.k-tooltip-validation{border-color:#ffd673;background-color:#ffd673;color:#737c81}.input-prepend .k-tooltip-validation,.input-append .k-tooltip-validation{font-size:12px;position:relative;top:3px}.k-callout-n{border-bottom-color:#253a47}.k-callout-w{border-right-color:#253a47}.k-callout-s{border-top-color:#253a47}.k-callout-e{border-left-color:#253a47}.k-tooltip-validation .k-callout-n{border-bottom-color:#ffd673}.k-tooltip-validation .k-callout-w{border-right-color:#ffd673}.k-tooltip-validation .k-callout-s{border-top-color:#ffd673}.k-tooltip-validation .k-callout-e{border-left-color:#ffd673}.k-splitbar{background-color:#ccc}.k-restricted-size-vertical,.k-restricted-size-horizontal{background-color:#2c4554}.k-file{background-color:#41bea8;border-color:#ccc}.k-file-progress{color:#2b7d6f}.k-file-progress .k-progress{background-color:#dcf2f8}.k-file-success{color:#308d7c}.k-file-success .k-progress{background-color:#e6f6e9}.k-file-error{color:#60676b}.k-file-error .k-progress{background-color:#ffe0d9}.k-tile{border-color:#fff}.k-textbox:hover,.k-tiles li.k-state-hover{border-color:#54c5b0}.k-tiles li.k-state-selected{border-color:#41bea8}.k-filebrowser .k-tile .k-folder,.k-filebrowser .k-tile .k-file{background-image:url('Flat/imagebrowser.png');background-size:auto auto}.k-leaf,.k-leaf.k-state-hover:hover{color:#fff}.k-leaf.k-inverse,.k-leaf.k-inverse.k-state-hover:hover{color:#000}.k-widget,.k-button{-webkit-box-shadow:none;box-shadow:none}.k-slider,.k-treeview,.k-upload{-webkit-box-shadow:none;box-shadow:none}.k-state-hover{-webkit-box-shadow:none;box-shadow:none}.k-autocomplete.k-state-focused,.k-dropdown-wrap.k-state-focused,.k-picker-wrap.k-state-focused,.k-numeric-wrap.k-state-focused{-webkit-box-shadow:none;box-shadow:none}.k-state-selected{-webkit-box-shadow:none;box-shadow:none}.k-state-active{-webkit-box-shadow:none;box-shadow:none}.k-grid td.k-state-selected.k-state-focused{background-color:#4cc2ad}.k-popup,.k-menu .k-menu-group,.k-grid .k-filter-options,.k-time-popup,.k-datepicker-calendar,.k-autocomplete.k-state-border-down,.k-autocomplete.k-state-border-up,.k-dropdown-wrap.k-state-active,.k-picker-wrap.k-state-active,.k-multiselect.k-state-focused,.k-filebrowser .k-image,.k-tooltip{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,0.25);box-shadow:0 2px 2px 0 rgba(0,0,0,0.25)}.k-treemap-tile.k-state-hover{-webkit-box-shadow:inset 0 0 0 3px #ccc;box-shadow:inset 0 0 0 3px #ccc}.k-window{border-color:rgba(0,0,0,0.25);-webkit-box-shadow:0 0 0 1px rgba(128,128,128,0.25);box-shadow:0 0 0 1px rgba(128,128,128,0.25);background-color:#fff}.k-window.k-state-focused{border-color:rgba(0,0,0,0.25);-webkit-box-shadow:0 0 0 1px rgba(0,0,0,0.25);box-shadow:0 0 0 1px rgba(0,0,0,0.25)}.k-window.k-window-maximized,.k-window-maximized .k-window-titlebar,.k-window-maximized .k-window-content{border-radius:0}.k-shadow{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.25);box-shadow:0 1px 2px 0 rgba(0,0,0,0.25)}.k-inset{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.25);box-shadow:inset 0 1px 1px rgba(0,0,0,0.25)}.k-editor-inline ::selection{background-color:#41bea8;text-shadow:none;color:#fff}.k-editor-inline ::-moz-selection{background-color:#41bea8;text-shadow:none;color:#fff}.k-widget.k-notification.k-notification-info{background-color:#e5f5fa;color:#339483;border-color:#b6e3f1}.k-widget.k-notification.k-notification-success{background-color:#eaf7ec;color:#3db39d;border-color:#c1e8c7}.k-widget.k-notification.k-notification-warning{background-color:#fff4d9;color:#ff704f;border-color:#fff0ca}.k-widget.k-notification.k-notification-error{background-color:#ffe0d9;color:#959da1;border-color:#ffb6a6}.k-gantt .k-treelist{background:#f5f5f5}.k-gantt .k-treelist .k-alt{background-color:#dbdbdb}.k-gantt .k-treelist .k-state-selected,.k-gantt .k-treelist .k-state-selected td,.k-gantt .k-treelist .k-alt.k-state-selected,.k-gantt .k-treelist .k-alt.k-state-selected>td{background-color:#41bea8}.k-task-dot:after{background-color:#737c81;border-color:#737c81}.k-task-dot:hover:after{background-color:#41bea8}.k-task-summary{border-color:#b6bbbe;background:#b6bbbe}.k-task-milestone,.k-task-summary-complete{border-color:#737c81;background:#737c81}.k-state-selected.k-task-summary{border-color:#a0dfd3;background:#a0dfd3}.k-state-selected.k-task-milestone,.k-state-selected .k-task-summary-complete{border-color:#41bea8;background:#41bea8}.k-task-single{background-color:#6fcebd;border-color:#54c5b0;color:#fff}.k-state-selected.k-task-single{border-color:#41bea8}.k-line{background-color:#737c81;color:#737c81}.k-state-selected.k-line{background-color:#41bea8;color:#41bea8}.k-resource{background-color:#fff}.k-i-kpi-decrease,.k-i-kpi-denied,.k-i-kpi-equal,.k-i-kpi-hold,.k-i-kpi-increase,.k-i-kpi-open{background-image:url('Flat/sprite_kpi.png')}.k-block,.k-button,.k-textbox,.k-drag-clue,.k-touch-scrollbar,.k-window,.k-window-titleless .k-window-content,.k-window-action,.k-inline-block,.k-grid .k-filter-options,.k-grouping-header .k-group-indicator,.k-autocomplete,.k-multiselect,.k-combobox,.k-dropdown,.k-dropdown-wrap,.k-datepicker,.k-timepicker,.k-colorpicker,.k-datetimepicker,.k-notification,.k-numerictextbox,.k-picker-wrap,.k-numeric-wrap,.k-colorpicker,.k-list-container,.k-calendar-container,.k-calendar td,.k-calendar .k-link,.k-treeview .k-in,.k-editor-inline,.k-tooltip,.k-tile,.k-slider-track,.k-slider-selection,.k-upload{border-radius:3px}.k-tool{text-align:center;vertical-align:middle}.k-tool.k-group-start,.k-toolbar .k-split-button .k-button,.k-toolbar .k-button-group .k-group-start{border-radius:3px 0 0 3px}.k-rtl .k-tool.k-group-start,.k-rtl .k-toolbar .k-split-button .k-button,.k-rtl .k-toolbar .k-button-group .k-group-start{border-radius:0 3px 3px 0}.k-tool.k-group-end,.k-toolbar .k-button-group .k-group-end,.k-toolbar .k-split-button .k-split-button-arrow{border-radius:0 3px 3px 0}.k-rtl .k-tool.k-group-end,.k-rtl .k-toolbar .k-button-group .k-group-end,.k-rtl .k-toolbar .k-split-button .k-split-button-arrow{border-radius:3px 0 0 3px}.k-group-start.k-group-end.k-tool{border-radius:3px}.k-calendar-container.k-state-border-up,.k-list-container.k-state-border-up,.k-autocomplete.k-state-border-up,.k-multiselect.k-state-border-up,.k-dropdown-wrap.k-state-border-up,.k-picker-wrap.k-state-border-up,.k-numeric-wrap.k-state-border-up,.k-window-content,.k-filter-menu{border-radius:0 0 3px 3px}.k-autocomplete.k-state-border-up .k-input,.k-dropdown-wrap.k-state-border-up .k-input,.k-picker-wrap.k-state-border-up .k-input,.k-picker-wrap.k-state-border-up .k-selected-color,.k-numeric-wrap.k-state-border-up .k-input{border-radius:0 0 0 3px}.k-multiselect.k-state-border-up .k-multiselect-wrap{border-radius:0 0 3px 3px}.k-window-titlebar,.k-block>.k-header,.k-tabstrip-items .k-item,.k-panelbar .k-tabstrip-items .k-item,.k-tabstrip-items .k-link,.k-calendar-container.k-state-border-down,.k-list-container.k-state-border-down,.k-autocomplete.k-state-border-down,.k-multiselect.k-state-border-down,.k-dropdown-wrap.k-state-border-down,.k-picker-wrap.k-state-border-down,.k-numeric-wrap.k-state-border-down{border-radius:3px 3px 0 0}.k-split-button.k-state-border-down>.k-button{border-radius:3px 0 0 0}.k-split-button.k-state-border-up>.k-button{border-radius:0 0 0 3px}.k-split-button.k-state-border-down>.k-split-button-arrow{border-radius:0 3px 0 0}.k-split-button.k-state-border-up>.k-split-button-arrow{border-radius:0 0 3px 0}.k-dropdown-wrap .k-input,.k-picker-wrap .k-input,.k-numeric-wrap .k-input{border-radius:1.8px 0 0 1.8px}.k-rtl .k-dropdown-wrap .k-input,.k-rtl .k-picker-wrap .k-input,.k-rtl .k-numeric-wrap .k-input{border-radius:0 1.8px 1.8px 0}.k-numeric-wrap .k-link{border-radius:0 1.8px 0 0}.k-numeric-wrap .k-link+.k-link{border-radius:0 0 1.8px 0}.k-colorpicker .k-selected-color{border-radius:1.8px 0 0 1.8px}.k-rtl .k-colorpicker .k-selected-color{border-radius:0 1.8px 1.8px 0}.k-autocomplete.k-state-border-down .k-input{border-radius:3px 3px 0 0}.k-dropdown-wrap.k-state-border-down .k-input,.k-picker-wrap.k-state-border-down .k-input,.k-picker-wrap.k-state-border-down .k-selected-color,.k-numeric-wrap.k-state-border-down .k-input{border-radius:3px 0 0 0}.k-numeric-wrap .k-link.k-state-selected{background-color:#253a47}.k-multiselect.k-state-border-down .k-multiselect-wrap{border-radius:1.8px 1.8px 0 0}.k-dropdown-wrap .k-select,.k-picker-wrap .k-select,.k-numeric-wrap .k-select,.k-datetimepicker .k-select+.k-select,.k-list-container.k-state-border-right{border-radius:0 3px 3px 0}.k-rtl .k-dropdown-wrap .k-select,.k-rtl .k-picker-wrap .k-select,.k-rtl .k-numeric-wrap .k-select,.k-rtl .k-datetimepicker .k-select+.k-select,.k-rtl .k-list-container.k-state-border-right{border-radius:3px 0 0 3px}.k-numeric-wrap.k-expand-padding .k-input{border-radius:3px}.k-textbox>input,.k-autocomplete .k-input,.k-multiselect-wrap{border-radius:1.8px}.k-list .k-state-hover,.k-list .k-state-focused,.k-list .k-state-highlight,.k-list .k-state-selected,.k-fieldselector .k-list .k-item,.k-list-optionlabel,.k-dropzone{border-radius:2px}.k-slider .k-button,.k-grid .k-slider .k-button{border-radius:13px}.k-draghandle{border-radius:13px}.k-scheduler-toolbar>ul li:first-child,.k-scheduler-toolbar>ul li:first-child .k-link,.k-scheduler-toolbar>ul.k-scheduler-views li:first-child+li,.k-scheduler-toolbar>ul.k-scheduler-views li:first-child+li .k-link{border-radius:3px 0 0 3px}.k-rtl .k-scheduler-toolbar>ul li:first-child,.k-rtl .k-scheduler-toolbar>ul li:first-child .k-link,.k-rtl .k-scheduler-toolbar>ul.k-scheduler-views li:first-child+li,.k-rtl .k-scheduler-toolbar>ul.k-scheduler-views li:first-child+li .k-link,.km-view.k-popup-edit-form .k-scheduler-toolbar>ul li:last-child,.km-view.k-popup-edit-form .k-scheduler-toolbar>ul li:last-child .k-link{border-radius:0 3px 3px 0}.k-scheduler-phone .k-scheduler-toolbar>ul li.k-nav-today,.k-scheduler-phone .k-scheduler-toolbar>ul li.k-nav-today .k-link,.k-edit-field>.k-scheduler-navigation{border-radius:3px}.k-scheduler-toolbar .k-nav-next,.k-scheduler-toolbar ul+ul li:last-child,.k-scheduler-toolbar .k-nav-next .k-link,.k-scheduler-toolbar ul+ul li:last-child .k-link{border-top-right-radius:3px;border-bottom-right-radius:3px}.k-rtl .k-scheduler-toolbar .k-nav-next,.k-rtl .k-scheduler-toolbar ul+ul li:last-child,.k-rtl .k-scheduler-toolbar .k-nav-next .k-link,.k-rtl .k-scheduler-toolbar ul+ul li:last-child .k-link{border-radius:3px 0 0 3px}.k-scheduler div.k-scheduler-footer ul li,.k-scheduler div.k-scheduler-footer .k-link{border-radius:3px}.k-more-events,.k-event,.k-task-single,.k-task-complete,.k-event .k-link{border-radius:1.8px}.k-scheduler-mobile .k-event{border-radius:.8px}.k-grid-mobile .k-column-active+th.k-header{border-left-color:#737c81}html .km-pane-wrapper .km-widget,.k-ie .km-pane-wrapper .k-widget,.k-ie .km-pane-wrapper .k-group,.k-ie .km-pane-wrapper .k-content,.k-ie .km-pane-wrapper .k-header,.k-ie .km-pane-wrapper .k-popup-edit-form .k-edit-field .k-button,.km-pane-wrapper .k-mobile-list .k-item,.km-pane-wrapper .k-mobile-list .k-edit-label,.km-pane-wrapper .k-mobile-list .k-edit-field{color:#737c81}@media screen and (-ms-high-contrast:active) and (-ms-high-contrast:none){div.km-pane-wrapper a{color:#737c81}.km-pane-wrapper .k-icon{background-image:url('Flat/sprite_2x.png');background-size:21.2em 21em}}.km-pane-wrapper .k-mobile-list .k-item,.km-pane-wrapper .k-mobile-list .k-edit-field,.km-pane-wrapper .k-mobile-list .k-recur-view>.k-edit-field .k-check{background-color:#fff;border-top:1px solid #ccc}.km-pane-wrapper .k-mobile-list .k-edit-field textarea{outline-width:0}.km-pane-wrapper .k-mobile-list .k-item.k-state-selected{background-color:#41bea8;border-top-color:#41bea8}.km-pane-wrapper .k-mobile-list .k-recur-view>.k-edit-field .k-check:first-child{border-top-color:transparent}.km-pane-wrapper .k-mobile-list .k-item:last-child{-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.km-pane-wrapper .k-mobile-list>ul>li>.k-link,.km-pane-wrapper .k-mobile-list .k-recur-view>.k-edit-label:nth-child(3),.km-pane-wrapper #recurrence .km-scroll-container>.k-edit-label:first-child{color:#808080}.km-pane-wrapper .k-mobile-list>ul>li>.k-link{border-bottom:1px solid #ccc}.km-pane-wrapper .k-mobile-list .k-edit-field{-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.km-actionsheet .k-grid-delete,.km-actionsheet .k-scheduler-delete,.km-pane-wrapper .k-scheduler-delete,.km-pane-wrapper .k-filter-menu .k-button[type=reset]{color:#fff;border-color:#2c4554;background-color:red;background-image:-webkit-gradient(linear,50% 0,50% 100%,from(rgba(255,255,255,.3)),to(rgba(255,255,255,.15)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.3),rgba(255,255,255,.15));background-image:-moz-linear-gradient(top,rgba(255,255,255,.3),rgba(255,255,255,.15));background-image:-ms-linear-gradient(top,rgba(255,255,255,.3),rgba(255,255,255,.15));background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,.15))}.km-actionsheet .k-grid-delete:active,.km-actionsheet .k-scheduler-delete:active,.km-pane-wrapper .k-scheduler-delete:active,.km-pane-wrapper .k-filter-menu .k-button[type=reset]:active{background-color:#900}.k-autocomplete.k-state-default,.k-picker-wrap.k-state-default,.k-numeric-wrap.k-state-default,.k-dropdown-wrap.k-state-default{background-image:none;background-position:50% 50%;background-color:#41bea8;border-color:#41bea8}.k-autocomplete.k-state-hover,.k-picker-wrap.k-state-hover,.k-numeric-wrap.k-state-hover,.k-dropdown-wrap.k-state-hover{background-color:#54c5b0;background-image:none;background-position:50% 50%;border-color:#54c5b0}.k-multiselect.k-header{border-color:#41bea8}.k-multiselect.k-header.k-state-hover{border-color:#54c5b0}.k-autocomplete.k-state-focused,.k-picker-wrap.k-state-focused,.k-numeric-wrap.k-state-focused,.k-dropdown-wrap.k-state-focused,.k-multiselect.k-header.k-state-focused{background-color:#54c5b0;background-image:none;background-position:50% 50%;border-color:#339483;-webkit-box-shadow:none;box-shadow:none}.k-list-container{color:#fff}.k-dropdown .k-input,.k-dropdown .k-state-focused .k-input,.k-menu .k-popup{color:#fff}.k-state-default>.k-select{border-color:#41bea8}.k-state-hover>.k-select{border-color:#54c5b0}.k-state-focused>.k-select{border-color:#339483}.k-tabstrip:focus{-webkit-box-shadow:none;box-shadow:none}.k-tabstrip-items .k-state-default .k-link,.k-panelbar>li.k-state-default>.k-link{color:#fff}.k-tabstrip-items .k-state-hover .k-link,.k-panelbar>li.k-state-hover>.k-link,.k-panelbar>li.k-state-default>.k-link.k-state-hover{color:#fff}.k-panelbar .k-state-focused.k-state-hover{background:#54c5b0;-webkit-box-shadow:none;box-shadow:none}.k-tabstrip-items .k-state-default,.k-ie7 .k-tabstrip-items .k-state-default .k-loading{border-color:#253a47}.k-tabstrip-items .k-state-hover,.k-ie7 .k-tabstrip-items .k-state-hover .k-loading{border-color:#54c5b0}.k-tabstrip-items .k-state-active,.k-panelbar .k-tabstrip-items .k-state-active,.k-ie7 .k-tabstrip-items .k-state-active .k-loading{background-color:#41bea8;background-image:none;border-color:#41bea8}.k-tabstrip .k-content.k-state-active{background-color:#fff;color:#737c81}.k-menu.k-header,.k-menu .k-item{border-color:#253a47}.k-column-menu,.k-column-menu .k-item,.k-overflow-container .k-overflow-group{border-color:#446b83}.k-overflow-container .k-overflow-group{box-shadow:inset 0 1px 0 #98b6c9,0 1px 0 #98b6c9}.k-toolbar-first-visible.k-overflow-group,.k-overflow-container .k-overflow-group+.k-overflow-group{box-shadow:0 1px 0 #98b6c9}.k-toolbar-last-visible.k-overflow-group{box-shadow:inset 0 1px 0 #98b6c9}.k-column-menu .k-separator{border-color:#446b83;background-color:transparent}.k-menu .k-group{border-color:#253a47}.k-grid-filter.k-state-active{background-color:#41bea8}.k-grouping-row td,.k-group-footer td,.k-grid-footer td{color:#fff;border-color:#446b83;font-weight:bold}.k-grouping-header{color:#fff}.k-grid td.k-state-focused{-webkit-box-shadow:inset 0 0 0 1px inset 0 0 0 1px #339483;box-shadow:inset 0 0 0 1px inset 0 0 0 1px #339483}.k-header,.k-grid-header-wrap,.k-grid .k-grouping-header,.k-grid-header,.k-pager-wrap,.k-pager-wrap .k-textbox,.k-pager-wrap .k-link,.k-grouping-header .k-group-indicator,.k-gantt-toolbar .k-state-default{border-color:#446b83}.k-primary,.k-overflow-container .k-primary{color:#fff;border-color:#41bea8;background-image:none;background-position:50% 50%;background-color:#41bea8;-webkit-box-shadow:none;box-shadow:none}.k-primary:focus,.k-primary.k-state-focused{color:#fff;border-color:#253a47;background-image:none;-webkit-box-shadow:none;box-shadow:none}.k-primary:hover{color:#fff;border-color:#54c5b0;background-image:none;background-color:#54c5b0;-webkit-box-shadow:none;box-shadow:none}.k-primary:focus:active:not(.k-state-disabled):not([disabled]),.k-primary:focus:not(.k-state-disabled):not([disabled]){-webkit-box-shadow:none;box-shadow:none}.k-primary:active{color:#fff;border-color:#253a47;background-image:none;background-color:#253a47;-webkit-box-shadow:none;box-shadow:none}.k-primary.k-state-disabled,.k-state-disabled .k-primary,.k-primary.k-state-disabled:hover,.k-state-disabled .k-primary:hover,.k-primary.k-state-disabled:hover,.k-state-disabled .k-primary:active,.k-primary.k-state-disabled:active{color:#c2c2c2;border-color:#ccc;background-color:#f5f5f5;background-image:none;-webkit-box-shadow:none;box-shadow:none}.k-pager-numbers .k-link,.k-treeview .k-in{border-color:transparent}.k-treeview .k-icon,.k-scheduler-table .k-icon,.k-grid .k-hierarchy-cell .k-icon{background-color:#ccc;border-radius:13px}.k-scheduler-table .k-state-hover .k-icon{background-color:transparent}.k-button:focus{outline:0}.k-editor .k-tool:focus{outline:0;border-color:#339483;-webkit-box-shadow:none;box-shadow:none}.k-checkbox-label:before{border-color:transparent;border-radius:1px}.k-checkbox-label:after{border-color:#41bea8;background:#fff;border-radius:1px}.k-checkbox-label:hover:after,.k-checkbox:checked+.k-checkbox-label:hover:after{border-color:#72cfbe;box-shadow:none}.k-checkbox:checked+.k-checkbox-label:after{background-color:#fff;border-color:#41bea8;border-radius:1px;color:#41bea8}.k-checkbox-label:active:before{box-shadow:none;border-color:transparent;border-radius:1px}.k-checkbox-label:active:after{border-color:#253a47;border-radius:1px}.k-checkbox:checked+.k-checkbox-label:active:after{border-color:#253a47}.k-checkbox:checked+.k-checkbox-label:active:before{box-shadow:none;border-radius:1px}.k-checkbox:disabled+.k-checkbox-label{color:#c2c2c2}.k-checkbox:disabled+.k-checkbox-label:hover:after,.k-checkbox:disabled+.k-checkbox-label:active:before{box-shadow:none}.k-checkbox:checked:disabled+.k-checkbox-label:after{background:#fff;color:#c2c2c2}.k-checkbox:disabled+.k-checkbox-label:after,.k-checkbox:checked:disabled+.k-checkbox-label:active:after,.k-checkbox:disabled+.k-checkbox-label:hover:before,.k-checkbox:checked:disabled+.k-checkbox-label:hover:after{background:#fff;border-color:#ccc;border-radius:1px}.k-radio-label:before{border-color:#41bea8;border-radius:50%;background-color:#fff;border-width:1px}.k-radio-label:hover:before,.k-radio:checked+.k-radio-label:hover:before{border-color:#72cfbe;box-shadow:none}.k-radio:checked+.k-radio-label:before{border-color:#41bea8}.k-radio:checked+.k-radio-label:after{background-color:#41bea8;border-radius:50%}.k-radio-label:active:before{box-shadow:none;border-radius:50%;border-color:#253a47}.k-radio:checked+.k-radio-label:active:before{box-shadow:none;border-radius:50%;border-color:#253a47}.k-radio:disabled+.k-radio-label{color:#c2c2c2}.k-radio:disabled+.k-radio-label:before{border-color:#bfbfbf}.k-radio:disabled+.k-radio-label:active:before{box-shadow:none;background:#fff}.k-radio:disabled+.k-radio-label:before{background:#fff}.k-radio:disabled+.k-radio-label:hover:after,.k-radio:disabled+.k-radio-label:hover:before{box-shadow:none}.k-checkbox:focus+.k-checkbox-label:after,.k-radio:focus+.k-radio-label:before{border-color:#253a47;box-shadow:none}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.k-icon:not(.k-loading),.k-grouping-dropclue,.k-drop-hint,.k-callout,.k-tool-icon,.k-state-hover .k-tool-icon,.k-state-active .k-tool-icon,.k-state-active.k-state-hover .k-tool-icon,.k-state-selected .k-tool-icon,.k-state-selected.k-state-hover .k-tool-icon,.k-column-menu .k-sprite,.k-mobile-list .k-check:checked,.k-mobile-list .k-edit-field [type=checkbox]:checked,.k-mobile-list .k-edit-field [type=radio]:checked{background-image:url('Flat/sprite_2x.png');background-size:340px 336px}.k-dropdown-wrap .k-input,.k-picker-wrap .k-input,.k-numeric-wrap .k-input{border-radius:1.8px 0 0 1.8px}.k-i-kpi-decrease,.k-i-kpi-denied,.k-i-kpi-equal,.k-i-kpi-hold,.k-i-kpi-increase,.k-i-kpi-open{background-image:url('Flat/sprite_kpi_2x.png');background-size:96px 16px}}@media screen and (-ms-high-contrast:active){.k-editor-toolbar-wrap .k-dropdown-wrap.k-state-focused,.k-editor-toolbar-wrap .k-button-group .k-tool:focus{border-color:#fff}}.ktb-checkbox-label-after{border-color:#41bea8;background:#fff}.ktb-checkbox-label-hover-after,.ktb-checkbox-checked+.ktb-checkbox-label-hover-after{border-color:#72cfbe}.ktb-checkbox-checked+.ktb-checkbox-label-after{background-color:#fff;border-color:#41bea8;color:#41bea8}.ktb-checkbox-label-hover-after,.ktb-checkbox-checked+.ktb-checkbox-label-hover-after{border-color:#72cfbe}.ktb-checkbox-label-active-after{border-color:#253a47}.ktb-checkbox-checked-disabled+.ktb-checkbox-label-after,.ktb-checkbox-disabled+.ktb-checkbox-label-after,.ktb-checkbox-checked-disabled+.ktb-checkbox-label-active-after,.ktb-checkbox-disabled+.ktb-checkbox-label-hover-before,.ktb-checkbox-checked-disabled+.ktb-checkbox-label-hover-after{background:#fff;color:#c2c2c2;border-color:#ccc}.ktb-radio-label-before{border-color:#41bea8;background-color:#fff}.ktb-radio-checked+.ktb-radio-label-after{background-color:#41bea8}.ktb-radio-checked+.ktb-radio-label-before{border-color:#41bea8}.ktb-radio-label-hover-before,.ktb-radio-checked+.ktb-radio-label-hover-before{border-color:#72cfbe}.ktb-radio-label-active-before{border-color:#253a47}.ktb-radio-checked+.ktb-radio-label-after{background-color:#41bea8}.ktb-radio-disabled+.ktb-radio-label-before,.ktb-radio-disabled+.ktb-radio-label-active-before{background:#fff;border-color:#ccc}@media only screen and (max-width:1024px){.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view,.k-webkit .k-pager-numbers .k-current-page .k-link,.k-ff .k-pager-numbers .k-current-page .k-link,.k-ie11 .k-pager-numbers .k-current-page .k-link{background-image:none;background-position:50% 50%;background-color:#41bea8;border-color:#ccc}.k-webkit .k-pager-numbers .k-current-page .k-link,.k-ff .k-pager-numbers .k-current-page .k-link,.k-ie11 .k-pager-numbers .k-current-page .k-link{border-color:#446b83}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view{border-radius:3px}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded>li,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded>li,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded>li{border-radius:0}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded>li.k-current-view,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded>li.k-current-view,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded>li.k-current-view{border-radius:1.8px 1.8px 0 0}.k-webkit .k-scheduler-toolbar>ul li:first-child,.k-ff .k-scheduler-toolbar>ul li:first-child,.k-ie11 .k-scheduler-toolbar>ul li:first-child,.k-webkit .k-scheduler-toolbar>ul li:first-child .k-link,.k-ff .k-scheduler-toolbar>ul li:first-child .k-link,.k-ie11 .k-scheduler-toolbar>ul li:first-child .k-link,.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views li,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views li,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views li,.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views li .k-link,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views li .k-link,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views li .k-link{border-radius:0}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views li:last-child,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views li:last-child,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views li:last-child,.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views li:last-child .k-link,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views li:last-child .k-link,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views li:last-child .k-link{border-radius:0 0 1.8px 1.8px}.k-webkit .k-pager-numbers .k-current-page .k-link:hover,.k-ff .k-pager-numbers .k-current-page .k-link:hover,.k-ie11 .k-pager-numbers .k-current-page .k-link:hover,.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view:hover,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view:hover,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view:hover{border-color:#54c5b0;background-image:none;background-color:#54c5b0}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view>.k-link,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view>.k-link,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view>.k-link{color:#737c81;min-width:75px}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view:hover>.k-link,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view:hover>.k-link,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views>li.k-current-view:hover>.k-link{color:#fff}.k-webkit .k-pager-numbers .k-current-page .k-link:after,.k-ff .k-pager-numbers .k-current-page .k-link:after,.k-ie11 .k-pager-numbers .k-current-page .k-link:after,.k-webkit .k-scheduler-views>li.k-state-selected>.k-link:after,.k-ff .k-scheduler-views>li.k-state-selected>.k-link:after,.k-ie11 .k-scheduler-views>li.k-state-selected>.k-link:after{display:block;content:"";position:absolute;top:50%;margin-top:-0.5em;right:.333em;width:1.333em;height:1.333em}.k-webkit .k-pager-numbers.k-state-expanded,.k-ff .k-pager-numbers.k-state-expanded,.k-ie11 .k-pager-numbers.k-state-expanded,.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded{border-width:1px 1px 0 1px;border-style:solid;border-color:#446b83;background-color:#253a47;border-radius:3px 3px 0 0;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,0.25);box-shadow:0 2px 2px 0 rgba(0,0,0,0.25)}.k-webkit .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded,.k-ff .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded,.k-ie11 .k-scheduler-toolbar>ul.k-scheduler-views.k-state-expanded{border-width:1px;background-image:none;border-radius:3px}.k-webkit .k-pager-numbers .k-state-selected,.k-ff .k-pager-numbers .k-state-selected,.k-ie11 .k-pager-numbers .k-state-selected,.k-webkit .k-pager-numbers .k-link,.k-ff .k-pager-numbers .k-link,.k-ie11 .k-pager-numbers .k-link{border-radius:2px}}.k-button-group .k-tool,.k-toolbar,.k-grid-toolbar .k-button{border-color:#446b83}.k-grid-toolbar .k-button:hover,.k-grid-toolbar .k-button.k-state-hovered{border-color:#54c5b0}.k-grid-toolbar .k-button:focus,.k-grid-toolbar .k-button.k-state-focused{border-color:#339483}.k-grid-toolbar .k-autocomplete,.k-grid .k-autocomplete,.k-editor-toolbar .k-autocomplete,.k-grid-toolbar .k-picker-wrap,.k-grid .k-picker-wrap,.k-editor-toolbar .k-picker-wrap,.k-grid-toolbar .k-numeric-wrap,.k-grid .k-numeric-wrap,.k-editor-toolbar .k-numeric-wrap,.k-grid-toolbar .k-dropdown-wrap,.k-grid .k-dropdown-wrap,.k-editor-toolbar .k-dropdown-wrap{background-color:#253a47;background-image:none;background-position:50% 50%;border-color:#446b83}.k-grid-toolbar .k-autocomplete.k-state-hover,.k-grid .k-autocomplete.k-state-hover,.k-editor-toolbar .k-autocomplete.k-state-hover,.k-grid-toolbar .k-picker-wrap.k-state-hover,.k-grid .k-picker-wrap.k-state-hover,.k-editor-toolbar .k-picker-wrap.k-state-hover,.k-grid-toolbar .k-numeric-wrap.k-state-hover,.k-grid .k-numeric-wrap.k-state-hover,.k-editor-toolbar .k-numeric-wrap.k-state-hover,.k-grid-toolbar .k-dropdown-wrap.k-state-hover,.k-grid .k-dropdown-wrap.k-state-hover,.k-editor-toolbar .k-dropdown-wrap.k-state-hover{background-color:#54c5b0;background-image:none;background-position:50% 50%;border-color:#54c5b0}.k-grid-toolbar .k-autocomplete.k-state-focused,.k-grid .k-autocomplete.k-state-focused,.k-editor-toolbar .k-autocomplete.k-state-focused,.k-grid-toolbar .k-picker-wrap.k-state-focused,.k-grid .k-picker-wrap.k-state-focused,.k-editor-toolbar .k-picker-wrap.k-state-focused,.k-grid-toolbar .k-numeric-wrap.k-state-focused,.k-grid .k-numeric-wrap.k-state-focused,.k-editor-toolbar .k-numeric-wrap.k-state-focused,.k-grid-toolbar .k-dropdown-wrap.k-state-focused,.k-grid .k-dropdown-wrap.k-state-focused,.k-editor-toolbar .k-dropdown-wrap.k-state-focused{background-color:#54c5b0;background-image:none;background-position:50% 50%;border-color:#54c5b0}.k-popup.k-group{color:#fff;border-color:#253a47}.k-popup.k-group .k-state-default>.k-select{border-color:#446b83}.k-popup.k-group .k-state-hover>.k-select{border-color:#54c5b0}.k-popup.k-group .k-state-focused>.k-select{border-color:#41bea8}.k-grid-toolbar,.k-dropdown .k-input,.k-dropdown .k-state-focused .k-input,.k-menu .k-popup{color:#fff}.k-checkbox:checked+.k-checkbox-label:active:after{border-color:#253a47} diff --git a/user/plugins/admin/themes/grav/css/featherlight.min.css b/user/plugins/admin/themes/grav/css/featherlight.min.css new file mode 100644 index 0000000..bf553f6 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/featherlight.min.css @@ -0,0 +1,8 @@ +/** + * Featherlight - ultra slim jQuery lightbox + * Version 0.4.9 - http://noelboss.github.io/featherlight/ + * + * Copyright 2014, Noël Raoul Bossart (http://www.noelboss.com) + * MIT Licensed. +**/ +@media all{.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:rgba(0,0,0,0)}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:'';display:inline-block;height:100%;vertical-align:middle;margin-right:-.25em}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;min-width:30%;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font:Arial,sans-serif;background:#fff;background:rgba(255,255,255,.3);color:#000}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0}.featherlight iframe{border:0}}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:10px;margin-right:10px;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css/font-awesome.min.css b/user/plugins/admin/themes/grav/css/font-awesome.min.css new file mode 100644 index 0000000..ee4e978 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} diff --git a/user/plugins/admin/themes/grav/css/hint.base.min.css b/user/plugins/admin/themes/grav/css/hint.base.min.css new file mode 100644 index 0000000..51d84a7 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/hint.base.min.css @@ -0,0 +1,5 @@ +/*! Hint.css (base version) - v1.3.5 - 2015-06-16 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2015 Kushagra Gour; Licensed MIT */ + +.hint--bottom:after,.hint--top:after{margin-left:-18px}.hint,[data-hint]{position:relative;display:inline-block}.hint:after,.hint:before,[data-hint]:after,[data-hint]:before{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.hint--always:after,.hint--always:before,.hint:focus:after,.hint:focus:before,.hint:hover:after,.hint:hover:before,[data-hint]:focus:after,[data-hint]:focus:before,[data-hint]:hover:after,[data-hint]:hover:before{opacity:1;visibility:visible}.hint:hover:after,.hint:hover:before,[data-hint]:hover:after,[data-hint]:hover:before{-webkit-transition-delay:100ms;-moz-transition-delay:100ms;transition-delay:100ms}.hint:before,[data-hint]:before{content:'';position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}.hint:after,[data-hint]:after{content:attr(data-hint);background:#383838;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap}.hint--top:before{border-top-color:#383838;margin-bottom:-12px}.hint--bottom:before{border-bottom-color:#383838;margin-top:-12px}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:focus:after,.hint--top:focus:before,.hint--top:hover:after,.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:focus:after,.hint--bottom:focus:before,.hint--bottom:hover:after,.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-12px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:focus:after,.hint--right:focus:before,.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-12px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:focus:after,.hint--left:focus:before,.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--top:after,.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:after,.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css/nucleus-ie10.css b/user/plugins/admin/themes/grav/css/nucleus-ie10.css new file mode 100644 index 0000000..c1d2f2a --- /dev/null +++ b/user/plugins/admin/themes/grav/css/nucleus-ie10.css @@ -0,0 +1,24 @@ +button { + overflow: visible; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +.fixed-blocks { + display: block; +} + +.feature-items { + overflow: hidden; +} + +.modular .features .feature { + margin: 1%; + display: inline-block; + vertical-align: top; + float: none; +} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css/nucleus-ie9.css b/user/plugins/admin/themes/grav/css/nucleus-ie9.css new file mode 100644 index 0000000..46df376 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/nucleus-ie9.css @@ -0,0 +1,62 @@ +/* IE9 Resets and Normalization */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; +} + +[hidden], +template { + display: none; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +button { + overflow: visible; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/css/prism.css b/user/plugins/admin/themes/grav/css/prism.css new file mode 100644 index 0000000..00005b3 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/prism.css @@ -0,0 +1,121 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.builtin { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #a67f59; + background: hsla(0,0%,100%,.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + + +.token.regex, +.token.important { + color: #e90; +} + +.token.important { + font-weight: bold; +} + +.token.entity { + cursor: help; +} + diff --git a/user/plugins/admin/themes/grav/css/pure-0.5.0/grids-min.css b/user/plugins/admin/themes/grav/css/pure-0.5.0/grids-min.css new file mode 100644 index 0000000..4b66e7e --- /dev/null +++ b/user/plugins/admin/themes/grav/css/pure-0.5.0/grids-min.css @@ -0,0 +1,15 @@ +/*! +Pure v0.5.0 +Copyright 2014 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. +https://github.com/yui/pure/blob/master/LICENSE.md +*/ +.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%} + +/* Custom */ +[class *="pure-u"] {display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto;} +.pure-u-1-7 {width: 14.285%;}.pure-u-2-7 {width: 28.571%;}.pure-u-3-7 {width: 42.857%;}.pure-u-4-7 {width: 57.142%;}.pure-u-5-7 {width: 71.428%;}.pure-u-6-7 {width: 85.714%;} +.pure-u-1-9 {width: 11.111%;}.pure-u-2-9 {width: 22.222%;}.pure-u-3-9 {width: 33.333%;}.pure-u-4-9 {width: 44.444%;}.pure-u-5-9 {width: 55.555%;}.pure-u-6-9 {width: 66.666%;}.pure-u-7-9 {width: 77.777%;}.pure-u-8-9 {width: 88.888%;} +.pure-u-1-10 {width: 10%;}.pure-u-2-10 {width: 20%;}.pure-u-3-10 {width: 30%;}.pure-u-4-10 {width: 40%;}.pure-u-5-10 {width: 50%;}.pure-u-6-10 {width: 60%;}.pure-u-7-10 {width: 70%;}.pure-u-8-10 {width: 80%;}.pure-u-9-10 {width: 90%;} + +.pure-u-1-11 {width: 9.090%;}.pure-u-2-11 {width: 18.181%;}.pure-u-3-11 {width: 27.272%;}.pure-u-4-11 {width: 36.363%;}.pure-u-5-11 {width: 45.454%;}.pure-u-6-11 {width: 54.545%;}.pure-u-7-11 {width: 63.636%;}.pure-u-8-11 {width: 72.727%;}.pure-u-9-11 {width: 81.818%;}.pure-u-10-11 {width: 90.909%;} diff --git a/user/plugins/admin/themes/grav/css/selectize.min.css b/user/plugins/admin/themes/grav/css/selectize.min.css new file mode 100644 index 0000000..5007e50 --- /dev/null +++ b/user/plugins/admin/themes/grav/css/selectize.min.css @@ -0,0 +1 @@ +.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder{visibility:visible!important;background:#f2f2f2!important;background:rgba(0,0,0,0.06)!important;border:0 none!important;-webkit-box-shadow:inset 0 0 12px 4px #fff;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:'!';visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2);box-shadow:0 2px 5px rgba(0,0,0,0.2)}.selectize-dropdown-header{position:relative;padding:5px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.selectize-dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:24px!important}.selectize-control.plugin-remove_button [data-value] .remove{z-index:1;position:absolute;top:0;right:0;bottom:0;width:17px;text-align:center;font-weight:700;font-size:12px;color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:2px 0 0;border-left:1px solid #d0d0d0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove:hover{background:rgba(0,0,0,0.05)}.selectize-control.plugin-remove_button [data-value].active .remove{border-left-color:#cacaca}.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover{background:none}.selectize-control.plugin-remove_button .disabled [data-value] .remove{border-left-color:#fff}.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;-webkit-font-smoothing:inherit}.selectize-input,.selectize-control.single .selectize-input.input-active{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.1);box-shadow:inset 0 1px 1px rgba(0,0,0,0.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.15)}.selectize-input.dropdown-active{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-input > *{vertical-align:baseline;display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline}.selectize-control.multi .selectize-input > div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.selectize-control.multi .selectize-input > div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled > div,.selectize-control.multi .selectize-input.disabled > div.active{color:#7d7d7d;background:#fff;border:0 solid #fff}.selectize-input > input{padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0 !important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;-webkit-user-select:auto!important;-webkit-box-shadow:none!important;box-shadow:none!important}.selectize-input > input::-ms-clear{display:none}.selectize-input > input:focus{outline:none!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0;border-top:0 none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1);-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,0.2);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.selectize-dropdown [data-selectable],.selectize-dropdown .optgroup-header{padding:5px 8px}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,0.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:gray transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent gray}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input > input{margin:0 4px 0 -2px !important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa} diff --git a/user/plugins/admin/themes/grav/css/uikit.css b/user/plugins/admin/themes/grav/css/uikit.css new file mode 100644 index 0000000..25ad80d --- /dev/null +++ b/user/plugins/admin/themes/grav/css/uikit.css @@ -0,0 +1,6986 @@ +/*! UIkit 2.10.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ + +/* ======================================================================== + Component: Base + ========================================================================== */ +/* + * 1. Normalizes default `font-family` and sets `font-size` here to support `rem` units + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * 3. Style + */ +html { + /* 1 */ + font: normal 14px / 20px "Helvetica Neue", Helvetica, Arial, sans-serif; + /* 2 */ + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + /* 3 */ + background: #ffffff; + color: #444444; +} +/* + * Removes default margin. + */ +body { + margin: 0; +} +/* Links + ========================================================================== */ +/* + * Remove the gray background color from active links in IE 10. + */ +a { + background: transparent; +} +/* + * Improves readability when focused and also mouse hovered in all browsers. + */ +a:active, +a:hover { + outline: 0; +} +/* + * Style + */ +a, +.uk-link { + color: #0077dd; + text-decoration: none; + cursor: pointer; +} +a:hover, +.uk-link:hover { + color: #005599; + text-decoration: underline; +} +/* Text-level semantics + ========================================================================== */ +/* + * Addresses styling not present in Chrome, Safari, Opera and IE 8/9/10. + */ +abbr[title] { + border-bottom: 1px dotted; +} +/* + * Addresses style set to `bolder` in Firefox + */ +b, +strong { + font-weight: bold; +} +/* + * 1. Address odd `em`-unit font size rendering in all browsers. + * 2. Consolas has a better baseline in running text compared to `Courier` + */ +:not(pre) > code, +:not(pre) > kbd, +:not(pre) > samp { + /* 1 */ + font-size: 12px; + /* 2 */ + font-family: Consolas, monospace, serif; + /* 3 */ + color: #dd0055; + white-space: nowrap; +} +/* + * Emphasize + */ +em { + color: #dd0055; +} +/* + * Insert + */ +ins { + background: #ffffaa; + color: #444444; + text-decoration: none; +} +/* + * Mark + * Note: Addresses styling not present in IE 8/9. + */ +mark { + background: #ffffaa; + color: #444444; +} +/* + * Quote + */ +q { + font-style: italic; +} +/* + * Addresses inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; +} +/* + * Prevents `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +/* Images + ========================================================================== */ +/* + * 1. Responsiveness: Sets a maximum width relative to the parent and auto scales the height + * 2. Corrects `max-width` behavior if padding and border are used + * 3. Remove border when inside `a` element in IE 8/9/10. + * 4. Remove the gap between images and the bottom of their containers + */ +img { + /* 1 */ + max-width: 100%; + height: auto; + /* 2 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 3 */ + border: 0; + /* 4 */ + vertical-align: middle; +} +/* + * Preserve original image dimensions + */ +.uk-img-preserve, +.uk-img-preserve img { + max-width: none; +} +/* + * Correct overflow not hidden in IE 9/10/11. + */ +svg:not(:root) { + overflow: hidden; +} +/* Block elements + ========================================================================== */ +/* + * Reset margin + */ +blockquote, +figure { + margin: 0; +} +/* + * Margins + */ +p, +ul, +ol, +dl, +blockquote, +pre, +address, +fieldset, +figure { + margin: 0 0 15px 0; +} +* + p, +* + ul, +* + ol, +* + dl, +* + blockquote, +* + pre, +* + address, +* + fieldset, +* + figure { + margin-top: 15px; +} +/* Headings + ========================================================================== */ +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0 0 15px 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + color: #444444; + text-transform: none; +} +/* + * Margins + */ +* + h1, +* + h2, +* + h3, +* + h4, +* + h5, +* + h6 { + margin-top: 25px; +} +/* + * Sizes + */ +h1, +.uk-h1 { + font-size: 36px; + line-height: 42px; +} +h2, +.uk-h2 { + font-size: 24px; + line-height: 30px; +} +h3, +.uk-h3 { + font-size: 18px; + line-height: 24px; +} +h4, +.uk-h4 { + font-size: 16px; + line-height: 22px; +} +h5, +.uk-h5 { + font-size: 14px; + line-height: 20px; +} +h6, +.uk-h6 { + font-size: 12px; + line-height: 18px; +} +/* Lists + ========================================================================== */ +ul, +ol { + padding-left: 30px; +} +/* + * Reset margin for nested lists + */ +ul > li > ul, +ul > li > ol, +ol > li > ol, +ol > li > ul { + margin: 0; +} +/* Description lists + ========================================================================== */ +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +/* Horizontal rules + ========================================================================== */ +/* + * 1. Address differences between Firefox and other browsers. + * 2. Style + */ +hr { + /* 1 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; + /* 2 */ + margin: 15px 0; + border: 0; + border-top: 1px solid #dddddd; +} +/* Address + ========================================================================== */ +address { + font-style: normal; +} +/* Blockquotes + ========================================================================== */ +blockquote { + padding-left: 15px; + border-left: 5px solid #dddddd; + font-size: 16px; + line-height: 22px; + font-style: italic; +} +/* Preformatted text + ========================================================================== */ +/* + * 1. Contain overflow in all browsers. + */ +pre { + padding: 10px; + background: #f5f5f5; + font: 12px / 18px Consolas, monospace, serif; + color: #444444; + -moz-tab-size: 4; + tab-size: 4; + /* 1 */ + overflow: auto; +} +/* Selection pseudo-element + ========================================================================== */ +::-moz-selection { + background: #3399ff; + color: #ffffff; + text-shadow: none; +} +::selection { + background: #3399ff; + color: #ffffff; + text-shadow: none; +} +/* HTML5 elements + ========================================================================== */ +/* + * Corrects `block` display not defined in IE 8/9. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +nav, +section, +summary { + display: block; +} +/* + * Addresses inconsistent vertical alignment of `progress` in Chrome, Firefox and Opera. + */ +progress { + vertical-align: baseline; +} +/* + * Prevent displaying `audio` without controls in Chrome, Safari and Opera + */ +audio:not([controls]) { + display: none; +} +/* + * Address `[hidden]` styling not present in IE 8/9. + * Hide the `template` element in IE and Safari + */ +[hidden], +template { + display: none; +} +/* Iframe + ========================================================================== */ +iframe { + border: 0; +} +/* Fix viewport for IE10 snap mode + ========================================================================== */ +@media screen and (max-width: 400px) { + @-ms-viewport { + width: device-width; + } +} +/* ======================================================================== + Component: Grid + ========================================================================== */ +/* + * Micro clearfix + */ +.uk-grid:before, +.uk-grid:after { + content: " "; + display: table; +} +.uk-grid:after { + clear: both; +} +/* + * 1. Needed for the gutter + * 2. Makes grid more robust so that it can be used with other block elements like lists + */ +.uk-grid { + /* 1 */ + margin: 0 0 0 -25px; + /* 2 */ + padding: 0; + list-style: none; +} +/* + * Grid cell + * 1. Makes grid more robust so that it can be used with other block elements + * 2. Create horizontal gutter + * 3. `float` is set by default so columns always behave the same and create a new block format context + */ +.uk-grid > * { + /* 1 */ + margin: 0; + /* 2 */ + padding-left: 25px; + /* 3 */ + float: left; +} +/* + * Remove margin from the last-child + */ +.uk-grid > * > :last-child { + margin-bottom: 0; +} +/* Grid gutter + ========================================================================== */ +/* + * Vertical gutter + */ +.uk-grid + .uk-grid { + margin-top: 25px; +} +/* + * This class is set by JavaScript and applies a vertical gutter if the columns stack or float into the next row + * Higher specificity to override margin + */ +.uk-grid > .uk-grid-margin { + margin-top: 25px; +} +/* + * Vertical gutter for panels + */ +.uk-grid > * > .uk-panel + .uk-panel { + margin-top: 25px; +} +/* + * Larger gutter for large screens + */ +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* Horizontal gutter */ + .uk-grid:not(.uk-grid-preserve) { + margin-left: -35px; + } + .uk-grid:not(.uk-grid-preserve) > * { + padding-left: 35px; + } + /* Vertical gutter */ + .uk-grid:not(.uk-grid-preserve) + .uk-grid { + margin-top: 35px; + } + .uk-grid:not(.uk-grid-preserve) > .uk-grid-margin { + margin-top: 35px; + } + /* Vertical gutter for panels */ + .uk-grid:not(.uk-grid-preserve) > * > .uk-panel + .uk-panel { + margin-top: 35px; + } +} +/* + * Small gutter + * Higher specificity to override large gutter + */ +.uk-grid.uk-grid-small { + margin-left: -10px; +} +.uk-grid.uk-grid-small > * { + padding-left: 10px; +} +.uk-grid.uk-grid-small + .uk-grid-small { + margin-top: 10px; +} +.uk-grid.uk-grid-small > .uk-grid-margin { + margin-top: 10px; +} +.uk-grid.uk-grid-small > * > .uk-panel + .uk-panel { + margin-top: 10px; +} +/* Modifier: `uk-grid-divider` + ========================================================================== */ +/* + * Horizontal divider + * Does not work with `uk-push-*`, `uk-pull-*` and not if the columns float into the next row + */ +.uk-grid-divider:not(:empty) { + margin-left: -25px; + margin-right: -25px; +} +.uk-grid-divider > * { + padding-left: 25px; + padding-right: 25px; +} +.uk-grid-divider > [class*='uk-width-1-']:not(.uk-width-1-1):nth-child(n+2), +.uk-grid-divider > [class*='uk-width-2-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-3-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-4-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-5-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-6-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-7-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-8-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-9-']:nth-child(n+2) { + border-left: 1px solid #dddddd; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-grid-divider > [class*='uk-width-medium-']:not(.uk-width-medium-1-1):nth-child(n+2) { + border-left: 1px solid #dddddd; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-grid-divider > [class*='uk-width-large-']:not(.uk-width-large-1-1):nth-child(n+2) { + border-left: 1px solid #dddddd; + } +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* + * Large gutter + */ + .uk-grid-divider:not(.uk-grid-preserve):not(:empty) { + margin-left: -35px; + margin-right: -35px; + } + .uk-grid-divider:not(.uk-grid-preserve) > * { + padding-left: 35px; + padding-right: 35px; + } + .uk-grid-divider:not(.uk-grid-preserve):empty { + margin-top: 35px; + margin-bottom: 35px; + } +} +/* + * Vertical divider + */ +.uk-grid-divider:empty { + margin-top: 25px; + margin-bottom: 25px; + border-top: 1px solid #dddddd; +} +/* Even grid cell widths + ========================================================================== */ +[class*='uk-grid-width'] > * { + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +.uk-grid-width-1-2 > * { + width: 50%; +} +.uk-grid-width-1-3 > * { + width: 33.333%; +} +.uk-grid-width-1-4 > * { + width: 25%; +} +.uk-grid-width-1-5 > * { + width: 20%; +} +.uk-grid-width-1-6 > * { + width: 16.666%; +} +.uk-grid-width-1-10 > * { + width: 10%; +} +/* Phone landscape and bigger */ +@media (min-width: 480px) { + .uk-grid-width-small-1-2 > * { + width: 50%; + } + .uk-grid-width-small-1-3 > * { + width: 33.333%; + } + .uk-grid-width-small-1-4 > * { + width: 25%; + } + .uk-grid-width-small-1-5 > * { + width: 20%; + } + .uk-grid-width-small-1-6 > * { + width: 16.666%; + } + .uk-grid-width-small-1-10 > * { + width: 10%; + } +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-grid-width-medium-1-2 > * { + width: 50%; + } + .uk-grid-width-medium-1-3 > * { + width: 33.333%; + } + .uk-grid-width-medium-1-4 > * { + width: 25%; + } + .uk-grid-width-medium-1-5 > * { + width: 20%; + } + .uk-grid-width-medium-1-6 > * { + width: 16.666%; + } + .uk-grid-width-medium-1-10 > * { + width: 10%; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-grid-width-large-1-2 > * { + width: 50%; + } + .uk-grid-width-large-1-3 > * { + width: 33.333%; + } + .uk-grid-width-large-1-4 > * { + width: 25%; + } + .uk-grid-width-large-1-5 > * { + width: 20%; + } + .uk-grid-width-large-1-6 > * { + width: 16.666%; + } + .uk-grid-width-large-1-10 > * { + width: 10%; + } +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-grid-width-xlarge-1-2 > * { + width: 50%; + } + .uk-grid-width-xlarge-1-3 > * { + width: 33.333%; + } + .uk-grid-width-xlarge-1-4 > * { + width: 25%; + } + .uk-grid-width-xlarge-1-5 > * { + width: 20%; + } + .uk-grid-width-xlarge-1-6 > * { + width: 16.666%; + } + .uk-grid-width-xlarge-1-10 > * { + width: 10%; + } +} +/* Sub-objects: `uk-width-*` + ========================================================================== */ +[class*='uk-width'] { + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +/* + * Widths + */ +/* Whole */ +.uk-width-1-1 { + width: 100%; +} +/* Halves */ +.uk-width-1-2, +.uk-width-2-4, +.uk-width-3-6, +.uk-width-5-10 { + width: 50%; +} +/* Thirds */ +.uk-width-1-3, +.uk-width-2-6 { + width: 33.333%; +} +.uk-width-2-3, +.uk-width-4-6 { + width: 66.666%; +} +/* Quarters */ +.uk-width-1-4 { + width: 25%; +} +.uk-width-3-4 { + width: 75%; +} +/* Fifths */ +.uk-width-1-5, +.uk-width-2-10 { + width: 20%; +} +.uk-width-2-5, +.uk-width-4-10 { + width: 40%; +} +.uk-width-3-5, +.uk-width-6-10 { + width: 60%; +} +.uk-width-4-5, +.uk-width-8-10 { + width: 80%; +} +/* Sixths */ +.uk-width-1-6 { + width: 16.666%; +} +.uk-width-5-6 { + width: 83.333%; +} +/* Tenths */ +.uk-width-1-10 { + width: 10%; +} +.uk-width-3-10 { + width: 30%; +} +.uk-width-7-10 { + width: 70%; +} +.uk-width-9-10 { + width: 90%; +} +/* Phone landscape and bigger */ +@media (min-width: 480px) { + /* Whole */ + .uk-width-small-1-1 { + width: 100%; + } + /* Halves */ + .uk-width-small-1-2, + .uk-width-small-2-4, + .uk-width-small-3-6, + .uk-width-small-5-10 { + width: 50%; + } + /* Thirds */ + .uk-width-small-1-3, + .uk-width-small-2-6 { + width: 33.333%; + } + .uk-width-small-2-3, + .uk-width-small-4-6 { + width: 66.666%; + } + /* Quarters */ + .uk-width-small-1-4 { + width: 25%; + } + .uk-width-small-3-4 { + width: 75%; + } + /* Fifths */ + .uk-width-small-1-5, + .uk-width-small-2-10 { + width: 20%; + } + .uk-width-small-2-5, + .uk-width-small-4-10 { + width: 40%; + } + .uk-width-small-3-5, + .uk-width-small-6-10 { + width: 60%; + } + .uk-width-small-4-5, + .uk-width-small-8-10 { + width: 80%; + } + /* Sixths */ + .uk-width-small-1-6 { + width: 16.666%; + } + .uk-width-small-5-6 { + width: 83.333%; + } + /* Tenths */ + .uk-width-small-1-10 { + width: 10%; + } + .uk-width-small-3-10 { + width: 30%; + } + .uk-width-small-7-10 { + width: 70%; + } + .uk-width-small-9-10 { + width: 90%; + } +} +/* Tablet and bigger */ +@media (min-width: 768px) { + /* Whole */ + .uk-width-medium-1-1 { + width: 100%; + } + /* Halves */ + .uk-width-medium-1-2, + .uk-width-medium-2-4, + .uk-width-medium-3-6, + .uk-width-medium-5-10 { + width: 50%; + } + /* Thirds */ + .uk-width-medium-1-3, + .uk-width-medium-2-6 { + width: 33.333%; + } + .uk-width-medium-2-3, + .uk-width-medium-4-6 { + width: 66.666%; + } + /* Quarters */ + .uk-width-medium-1-4 { + width: 25%; + } + .uk-width-medium-3-4 { + width: 75%; + } + /* Fifths */ + .uk-width-medium-1-5, + .uk-width-medium-2-10 { + width: 20%; + } + .uk-width-medium-2-5, + .uk-width-medium-4-10 { + width: 40%; + } + .uk-width-medium-3-5, + .uk-width-medium-6-10 { + width: 60%; + } + .uk-width-medium-4-5, + .uk-width-medium-8-10 { + width: 80%; + } + /* Sixths */ + .uk-width-medium-1-6 { + width: 16.666%; + } + .uk-width-medium-5-6 { + width: 83.333%; + } + /* Tenths */ + .uk-width-medium-1-10 { + width: 10%; + } + .uk-width-medium-3-10 { + width: 30%; + } + .uk-width-medium-7-10 { + width: 70%; + } + .uk-width-medium-9-10 { + width: 90%; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + /* Whole */ + .uk-width-large-1-1 { + width: 100%; + } + /* Halves */ + .uk-width-large-1-2, + .uk-width-large-2-4, + .uk-width-large-3-6, + .uk-width-large-5-10 { + width: 50%; + } + /* Thirds */ + .uk-width-large-1-3, + .uk-width-large-2-6 { + width: 33.333%; + } + .uk-width-large-2-3, + .uk-width-large-4-6 { + width: 66.666%; + } + /* Quarters */ + .uk-width-large-1-4 { + width: 25%; + } + .uk-width-large-3-4 { + width: 75%; + } + /* Fifths */ + .uk-width-large-1-5, + .uk-width-large-2-10 { + width: 20%; + } + .uk-width-large-2-5, + .uk-width-large-4-10 { + width: 40%; + } + .uk-width-large-3-5, + .uk-width-large-6-10 { + width: 60%; + } + .uk-width-large-4-5, + .uk-width-large-8-10 { + width: 80%; + } + /* Sixths */ + .uk-width-large-1-6 { + width: 16.666%; + } + .uk-width-large-5-6 { + width: 83.333%; + } + /* Tenths */ + .uk-width-large-1-10 { + width: 10%; + } + .uk-width-large-3-10 { + width: 30%; + } + .uk-width-large-7-10 { + width: 70%; + } + .uk-width-large-9-10 { + width: 90%; + } +} +/* Sub-object: `uk-push-*` and `uk-pull-*` + ========================================================================== */ +/* + * Source ordering + * Works only with `uk-width-medium-*` + */ +/* Tablet and bigger */ +@media (min-width: 768px) { + [class*='uk-push-'], + [class*='uk-pull-'] { + position: relative; + } + /* + * Push + */ + /* Halves */ + .uk-push-1-2, + .uk-push-2-4, + .uk-push-3-6, + .uk-push-5-10 { + left: 50%; + } + /* Thirds */ + .uk-push-1-3, + .uk-push-2-6 { + left: 33.333%; + } + .uk-push-2-3, + .uk-push-4-6 { + left: 66.666%; + } + /* Quarters */ + .uk-push-1-4 { + left: 25%; + } + .uk-push-3-4 { + left: 75%; + } + /* Fifths */ + .uk-push-1-5, + .uk-push-2-10 { + left: 20%; + } + .uk-push-2-5, + .uk-push-4-10 { + left: 40%; + } + .uk-push-3-5, + .uk-push-6-10 { + left: 60%; + } + .uk-push-4-5, + .uk-push-8-10 { + left: 80%; + } + /* Sixths */ + .uk-push-1-6 { + left: 16.666%; + } + .uk-push-5-6 { + left: 83.333%; + } + /* Tenths */ + .uk-push-1-10 { + left: 10%; + } + .uk-push-3-10 { + left: 30%; + } + .uk-push-7-10 { + left: 70%; + } + .uk-push-9-10 { + left: 90%; + } + /* + * Pull + */ + /* Halves */ + .uk-pull-1-2, + .uk-pull-2-4, + .uk-pull-3-6, + .uk-pull-5-10 { + left: -50%; + } + /* Thirds */ + .uk-pull-1-3, + .uk-pull-2-6 { + left: -33.333%; + } + .uk-pull-2-3, + .uk-pull-4-6 { + left: -66.666%; + } + /* Quarters */ + .uk-pull-1-4 { + left: -25%; + } + .uk-pull-3-4 { + left: -75%; + } + /* Fifths */ + .uk-pull-1-5, + .uk-pull-2-10 { + left: -20%; + } + .uk-pull-2-5, + .uk-pull-4-10 { + left: -40%; + } + .uk-pull-3-5, + .uk-pull-6-10 { + left: -60%; + } + .uk-pull-4-5, + .uk-pull-8-10 { + left: -80%; + } + /* Sixths */ + .uk-pull-1-6 { + left: -16.666%; + } + .uk-pull-5-6 { + left: -83.333%; + } + /* Tenths */ + .uk-pull-1-10 { + left: -10%; + } + .uk-pull-3-10 { + left: -30%; + } + .uk-pull-7-10 { + left: -70%; + } + .uk-pull-9-10 { + left: -90%; + } +} +/* ======================================================================== + Component: Panel + ========================================================================== */ +/* + * 1. Needed for `a` elements + * 2. Create position context for badges + */ +.uk-panel { + /* 1 */ + display: block; + /* 2 */ + position: relative; +} +/* + * Micro clearfix to make panels more robust + */ +.uk-panel:before, +.uk-panel:after { + content: " "; + display: table; +} +.uk-panel:after { + clear: both; +} +/* + * Remove margin from the last-child if not `uk-widget-title` + */ +.uk-panel > :not(.uk-panel-title):last-child { + margin-bottom: 0; +} +/* Sub-object: `uk-panel-title` + ========================================================================== */ +.uk-panel-title { + margin-top: 0; + margin-bottom: 15px; + font-size: 18px; + line-height: 24px; + font-weight: normal; + text-transform: none; + color: #444444; +} +/* Sub-object: `uk-panel-badge` + ========================================================================== */ +.uk-panel-badge { + position: absolute; + top: 0; + right: 0; + z-index: 1; +} +/* Modifier: `uk-panel-box` + ========================================================================== */ +.uk-panel-box { + padding: 15px; + background: #f5f5f5; + color: #444444; +} +.uk-panel-box .uk-panel-title { + color: #444444; +} +.uk-panel-box .uk-panel-badge { + top: 10px; + right: 10px; +} +.uk-panel-box .uk-panel-teaser { + margin: -15px -15px 15px -15px; +} +/* + * Nav in panel + */ +.uk-panel-box > .uk-nav-side { + margin: 0 -15px; +} +/* + * Sub-modifier: `uk-panel-box-primary` + */ +.uk-panel-box-primary { + background-color: #ebf7fd; + color: #2d7091; +} +.uk-panel-box-primary .uk-panel-title { + color: #2d7091; +} +/* + * Sub-modifier: `uk-panel-box-secondary` + */ +.uk-panel-box-secondary { + background-color: #eeeeee; + color: #444444; +} +.uk-panel-box-secondary .uk-panel-title { + color: #444444; +} +/* Modifier: `uk-panel-header` + ========================================================================== */ +.uk-panel-header .uk-panel-title { + padding-bottom: 10px; + border-bottom: 1px solid #dddddd; + color: #444444; +} +/* Modifier: `uk-panel-space` + ========================================================================== */ +.uk-panel-space { + padding: 30px; +} +.uk-panel-space .uk-panel-badge { + top: 30px; + right: 30px; +} +/* Modifier: `uk-panel-divider` + ========================================================================== */ +.uk-panel + .uk-panel-divider { + margin-top: 50px !important; +} +.uk-panel + .uk-panel-divider:before { + content: ""; + display: block; + position: absolute; + top: -25px; + left: 0; + right: 0; + border-top: 1px solid #dddddd; +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-panel + .uk-panel-divider { + margin-top: 70px !important; + } + .uk-panel + .uk-panel-divider:before { + top: -35px; + } +} +/* ======================================================================== + Component: Article + ========================================================================== */ +/* + * Micro clearfix to make articles more robust + */ +.uk-article:before, +.uk-article:after { + content: " "; + display: table; +} +.uk-article:after { + clear: both; +} +/* + * Remove margin from the last-child + */ +.uk-article > :last-child { + margin-bottom: 0; +} +/* + * Vertical gutter for articles + */ +.uk-article + .uk-article { + margin-top: 25px; +} +/* Sub-object `uk-article-title` + ========================================================================== */ +.uk-article-title { + font-size: 36px; + line-height: 42px; + font-weight: normal; + text-transform: none; +} +.uk-article-title a { + color: inherit; + text-decoration: none; +} +/* Sub-object `uk-article-meta` + ========================================================================== */ +.uk-article-meta { + font-size: 12px; + line-height: 18px; + color: #999999; +} +/* Sub-object `uk-article-lead` + ========================================================================== */ +.uk-article-lead { + color: #444444; + font-size: 18px; + line-height: 24px; + font-weight: normal; +} +/* Sub-object `uk-article-divider` + ========================================================================== */ +.uk-article-divider { + margin-bottom: 25px; + border-color: #dddddd; +} +* + .uk-article-divider { + margin-top: 25px; +} +/* ======================================================================== + Component: Comment + ========================================================================== */ +/* Sub-object `uk-comment-header` + ========================================================================== */ +.uk-comment-header { + margin-bottom: 15px; +} +/* + * Micro clearfix + */ +.uk-comment-header:before, +.uk-comment-header:after { + content: " "; + display: table; +} +.uk-comment-header:after { + clear: both; +} +/* Sub-object `uk-comment-avatar` + ========================================================================== */ +.uk-comment-avatar { + margin-right: 15px; + float: left; +} +/* Sub-object `uk-comment-title` + ========================================================================== */ +.uk-comment-title { + margin: 5px 0 0 0; + font-size: 16px; + line-height: 22px; +} +/* Sub-object `uk-comment-meta` + ========================================================================== */ +.uk-comment-meta { + margin: 2px 0 0 0; + font-size: 11px; + line-height: 16px; + color: #999999; +} +/* Sub-object `uk-comment-body` + ========================================================================== */ +/* + * Remove margin from the last-child + */ +.uk-comment-body > :last-child { + margin-bottom: 0; +} +/* Sub-object `uk-comment-list` + ========================================================================== */ +.uk-comment-list { + padding: 0; + list-style: none; +} +.uk-comment-list .uk-comment + ul { + margin: 15px 0 0 0; + list-style: none; +} +.uk-comment-list > li:nth-child(n+2), +.uk-comment-list .uk-comment + ul > li:nth-child(n+2) { + margin-top: 15px; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-comment-list .uk-comment + ul { + padding-left: 100px; + } +} +/* Modifier `uk-comment-primary` + ========================================================================== */ +/* ======================================================================== + Component: Nav + ========================================================================== */ +.uk-nav, +.uk-nav ul { + margin: 0; + padding: 0; + list-style: none; +} +/* + * Items + */ +.uk-nav li > a { + display: block; + text-decoration: none; +} +.uk-nav > li > a { + padding: 5px 15px; +} +/* + * Nested items + */ +.uk-nav ul { + padding-left: 15px; +} +.uk-nav ul a { + padding: 2px 0; +} +/* + * Item subtitle + */ +.uk-nav li > a > div { + font-size: 12px; + line-height: 18px; +} +/* Sub-object: `uk-nav-header` + ========================================================================== */ +.uk-nav-header { + padding: 5px 15px; + text-transform: uppercase; + font-weight: bold; + font-size: 12px; +} +.uk-nav-header:not(:first-child) { + margin-top: 15px; +} +/* Sub-object: `uk-nav-divider` + ========================================================================== */ +.uk-nav-divider { + margin: 9px 15px; +} +/* Sub-object: `uk-nav-sub` + ========================================================================== */ +/* + * `ul` needed for higher specificity to override padding + */ +ul.uk-nav-sub { + padding: 5px 0 5px 15px; +} +/* Modifier: `uk-nav-parent-icon` + ========================================================================== */ +.uk-nav-parent-icon > .uk-parent > a:after { + content: "\f104"; + width: 20px; + margin-right: -10px; + float: right; + font-family: FontAwesome; + text-align: center; +} +.uk-nav-parent-icon > .uk-parent.uk-open > a:after { + content: "\f107"; +} +/* Modifier `uk-nav-side` + ========================================================================== */ +/* + * Items + */ +.uk-nav-side > li > a { + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-side > li > a:hover, +.uk-nav-side > li > a:focus { + background: rgba(0, 0, 0, 0.05); + color: #444444; + /* 2 */ + outline: none; +} +/* Active */ +.uk-nav-side > li.uk-active > a { + background: #00a8e6; + color: #ffffff; +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-side .uk-nav-header { + color: #444444; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-side .uk-nav-divider { + border-top: 1px solid #dddddd; +} +/* + * Nested items + */ +.uk-nav-side ul a { + color: #0077dd; +} +.uk-nav-side ul a:hover { + color: #005599; +} +/* Modifier `uk-nav-dropdown` + ========================================================================== */ +/* + * Items + */ +.uk-nav-dropdown > li > a { + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-dropdown > li > a:hover, +.uk-nav-dropdown > li > a:focus { + background: #00a8e6; + color: #ffffff; + /* 2 */ + outline: none; +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-dropdown .uk-nav-header { + color: #999999; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-dropdown .uk-nav-divider { + border-top: 1px solid #dddddd; +} +/* + * Nested items + */ +.uk-nav-dropdown ul a { + color: #0077dd; +} +.uk-nav-dropdown ul a:hover { + color: #005599; +} +/* Modifier `uk-nav-navbar` + ========================================================================== */ +/* + * Items + */ +.uk-nav-navbar > li > a { + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-navbar > li > a:hover, +.uk-nav-navbar > li > a:focus { + background: #00a8e6; + color: #ffffff; + /* 2 */ + outline: none; +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-navbar .uk-nav-header { + color: #999999; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-navbar .uk-nav-divider { + border-top: 1px solid #dddddd; +} +/* + * Nested items + */ +.uk-nav-navbar ul a { + color: #0077dd; +} +.uk-nav-navbar ul a:hover { + color: #005599; +} +/* Modifier `uk-nav-offcanvas` + ========================================================================== */ +/* + * Items + */ +.uk-nav-offcanvas > li > a { + color: #cccccc; + padding: 10px 15px; +} +/* + * Hover + * No hover on touch devices because it behaves buggy in fixed offcanvas + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-offcanvas > .uk-open > a, +html:not(.uk-touch) .uk-nav-offcanvas > li > a:hover, +html:not(.uk-touch) .uk-nav-offcanvas > li > a:focus { + background: #404040; + color: #ffffff; + /* 2 */ + outline: none; +} +/* + * Active + * `html .uk-nav` needed for higher specificity to override hover + */ +html .uk-nav.uk-nav-offcanvas > li.uk-active > a { + background: #1a1a1a; + color: #ffffff; +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-offcanvas .uk-nav-header { + color: #777777; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-offcanvas .uk-nav-divider { + border-top: 1px solid #1a1a1a; +} +/* + * Nested items + * No hover on touch devices because it behaves buggy in fixed offcanvas + */ +.uk-nav-offcanvas ul a { + color: #cccccc; +} +html:not(.uk-touch) .uk-nav-offcanvas ul a:hover { + color: #ffffff; +} +/* ======================================================================== + Component: Navbar + ========================================================================== */ +.uk-navbar { + background: #eeeeee; + color: #444444; +} +/* + * Micro clearfix + */ +.uk-navbar:before, +.uk-navbar:after { + content: " "; + display: table; +} +.uk-navbar:after { + clear: both; +} +/* Sub-object: `uk-navbar-nav` + ========================================================================== */ +.uk-navbar-nav { + margin: 0; + padding: 0; + list-style: none; + float: left; +} +/* + * 1. Create position context for dropdowns + */ +.uk-navbar-nav > li { + float: left; + /* 1 */ + position: relative; +} +/* + * 1. Dimensions + * 2. Style + */ +.uk-navbar-nav > li > a { + display: block; + -moz-box-sizing: border-box; + box-sizing: border-box; + text-decoration: none; + /* 1 */ + height: 40px; + padding: 0 15px; + line-height: 40px; + /* 2 */ + color: #444444; + font-size: 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; +} +/* Appear not as link */ +.uk-navbar-nav > li > a[href='#'] { + cursor: text; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Also apply if dropdown is opened + * 3. Remove default focus style + */ +.uk-navbar-nav > li:hover > a, +.uk-navbar-nav > li > a:focus, +.uk-navbar-nav > li.uk-open > a { + background-color: #f5f5f5; + color: #444444; + /* 3 */ + outline: none; +} +/* OnClick */ +.uk-navbar-nav > li > a:active { + background-color: #dddddd; + color: #444444; +} +/* Active */ +.uk-navbar-nav > li.uk-active > a { + background-color: #f5f5f5; + color: #444444; +} +/* Sub-objects: `uk-navbar-nav-subtitle` + ========================================================================== */ +.uk-navbar-nav .uk-navbar-nav-subtitle { + line-height: 28px; +} +.uk-navbar-nav-subtitle > div { + margin-top: -6px; + font-size: 10px; + line-height: 12px; +} +/* Sub-objects: `uk-navbar-content`, `uk-navbar-brand`, `uk-navbar-toggle` + ========================================================================== */ +/* + * Imitate navbar items + */ +.uk-navbar-content, +.uk-navbar-brand, +.uk-navbar-toggle { + -moz-box-sizing: border-box; + box-sizing: border-box; + display: block; + height: 40px; + padding: 0 15px; + float: left; +} +/* + * Helper to center all child elements vertically + */ +.uk-navbar-content:before, +.uk-navbar-brand:before, +.uk-navbar-toggle:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +/* Sub-objects: `uk-navbar-content` + ========================================================================== */ +/* + * Better sibling spacing + */ +.uk-navbar-content + .uk-navbar-content:not(.uk-navbar-center) { + padding-left: 0; +} +/* + * Link colors + */ +.uk-navbar-content > a:not([class]) { + color: #0077dd; +} +.uk-navbar-content > a:not([class]):hover { + color: #005599; +} +/* Sub-objects: `uk-navbar-brand` + ========================================================================== */ +.uk-navbar-brand { + font-size: 18px; + color: #444444; + text-decoration: none; +} +/* + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-navbar-brand:hover, +.uk-navbar-brand:focus { + color: #444444; + text-decoration: none; + /* 2 */ + outline: none; +} +/* Sub-object: `uk-navbar-toggle` + ========================================================================== */ +.uk-navbar-toggle { + font-size: 18px; + color: #444444; + text-decoration: none; +} +/* + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-navbar-toggle:hover, +.uk-navbar-toggle:focus { + color: #444444; + text-decoration: none; + /* 2 */ + outline: none; +} +/* + * 1. Center icon vertically + */ +.uk-navbar-toggle:after { + content: "\f0c9"; + font-family: FontAwesome; + /* 1 */ + vertical-align: middle; +} +.uk-navbar-toggle-alt:after { + content: "\f002"; +} +/* Sub-object: `uk-navbar-center` + ========================================================================== */ +/* + * The element with this class needs to be last child in the navbar + * 1. This hack is needed because other float elements shift centered text + */ +.uk-navbar-center { + float: none; + text-align: center; + /* 1 */ + max-width: 50%; + margin-left: auto; + margin-right: auto; +} +/* Sub-object: `uk-navbar-flip` + ========================================================================== */ +.uk-navbar-flip { + float: right; +} +/* ======================================================================== + Component: Subnav + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Remove whitespace between child elements when using `inline-block` + */ +.uk-subnav { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + font-size: 0.001px; +} +/* Items + ========================================================================== */ +/* + * 1. Create position context for dropdowns + * 2. Reset whitespace hack + */ +.uk-subnav > li { + /* 1 */ + position: relative; + /* 2 */ + font-size: 1rem; + vertical-align: top; +} +.uk-subnav > li, +.uk-subnav > li > a, +.uk-subnav > li > span { + display: inline-block; +} +.uk-subnav > li:nth-child(n+2) { + margin-left: 10px; +} +/* + * Items + */ +.uk-subnav > li > a { + color: #0077dd; +} +.uk-subnav > li > a:hover { + color: #005599; +} +/* + * Active + */ +/* + * Disabled + */ +.uk-subnav > li > span { + color: #999999; +} +/* Modifier: 'subnav-line' + ========================================================================== */ +.uk-subnav-line > li:nth-child(n+2):before { + content: ""; + display: inline-block; + height: 10px; + margin-right: 10px; + border-left: 1px solid #dddddd; +} +/* Modifier: 'subnav-pill' + ========================================================================== */ +.uk-subnav-pill > li > a, +.uk-subnav-pill > li > span { + padding: 3px 9px; + text-decoration: none; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-subnav-pill > li > a:hover, +.uk-subnav-pill > li > a:focus { + background: #eeeeee; + color: #444444; + /* 2 */ + outline: none; +} +/* + * Active + * `li` needed for higher specificity to override hover + */ +.uk-subnav-pill > li.uk-active > a { + background: #00a8e6; + color: #ffffff; +} +/* ======================================================================== + Component: Breadcrumb + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Remove whitespace between child elements when using `inline-block` + */ +.uk-breadcrumb { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + font-size: 0.001px; +} +/* Items + ========================================================================== */ +/* + * Reset whitespace hack + */ +.uk-breadcrumb > li { + font-size: 1rem; + vertical-align: top; +} +.uk-breadcrumb > li, +.uk-breadcrumb > li > a, +.uk-breadcrumb > li > span { + display: inline-block; +} +.uk-breadcrumb > li:nth-child(n+2):before { + content: "/"; + display: inline-block; + margin: 0 8px; +} +/* + * Disabled + */ +.uk-breadcrumb > li:not(.uk-active) > span { + color: #999999; +} +/* ======================================================================== + Component: Pagination + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Center pagination by default + * 3. Remove whitespace between child elements when using `inline-block` + */ +.uk-pagination { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + text-align: center; + /* 3 */ + font-size: 0.001px; +} +/* + * Micro clearfix + * Needed if `uk-pagination-previous` or `uk-pagination-next` sub-objects are used + */ +.uk-pagination:before, +.uk-pagination:after { + content: " "; + display: table; +} +.uk-pagination:after { + clear: both; +} +/* Items + ========================================================================== */ +/* + * 1. Reset whitespace hack + * 2. Remove the gap at the bottom of it container + */ +.uk-pagination > li { + display: inline-block; + /* 1 */ + font-size: 1rem; + /* 2 */ + vertical-align: top; +} +.uk-pagination > li:nth-child(n+2) { + margin-left: 5px; +} +/* + * 1. Makes pagination more robust against different box-sizing use + * 2. Reset text-align to center if alignment modifier is used + */ +.uk-pagination > li > a, +.uk-pagination > li > span { + display: inline-block; + min-width: 16px; + padding: 3px 5px; + line-height: 20px; + text-decoration: none; + /* 1 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + /* 2 */ + text-align: center; +} +/* + * Links + */ +.uk-pagination > li > a { + background: #eeeeee; + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-pagination > li > a:hover, +.uk-pagination > li > a:focus { + background-color: #f5f5f5; + color: #444444; + /* 2 */ + outline: none; +} +/* OnClick */ +.uk-pagination > li > a:active { + background-color: #dddddd; + color: #444444; +} +/* + * Active + */ +.uk-pagination > .uk-active > span { + background: #00a8e6; + color: #ffffff; +} +/* + * Disabled + */ +.uk-pagination > .uk-disabled > span { + background-color: #f5f5f5; + color: #999999; +} +/* Previous and next navigation + ========================================================================== */ +.uk-pagination-previous { + float: left; +} +.uk-pagination-next { + float: right; +} +/* Alignment modifiers + ========================================================================== */ +.uk-pagination-left { + text-align: left; +} +.uk-pagination-right { + text-align: right; +} +/* ======================================================================== + Component: Tab + ========================================================================== */ +.uk-tab { + margin: 0; + padding: 0; + list-style: none; + border-bottom: 1px solid #dddddd; +} +/* + * Micro clearfix on the deepest container + */ +.uk-tab:before, +.uk-tab:after { + content: " "; + display: table; +} +.uk-tab:after { + clear: both; +} +/* + * Items + * 1. Create position context for dropdowns + */ +.uk-tab > li { + margin-bottom: -1px; + float: left; + /* 1 */ + position: relative; +} +.uk-tab > li > a { + display: block; + padding: 8px 12px 8px 12px; + border: 1px solid transparent; + border-bottom-width: 0; + color: #0077dd; + text-decoration: none; +} +.uk-tab > li:nth-child(n+2) > a { + margin-left: 5px; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Also apply if dropdown is opened + * 3. Remove default focus style + */ +.uk-tab > li > a:hover, +.uk-tab > li > a:focus, +.uk-tab > li.uk-open > a { + border-color: #f5f5f5; + background: #f5f5f5; + color: #005599; + /* 2 */ + outline: none; +} +.uk-tab > li:not(.uk-active) > a:hover, +.uk-tab > li:not(.uk-active) > a:focus, +.uk-tab > li.uk-open:not(.uk-active) > a { + margin-bottom: 1px; + padding-bottom: 7px; +} +/* Active */ +.uk-tab > li.uk-active > a { + border-color: #dddddd; + border-bottom-color: transparent; + background: #ffffff; + color: #444444; +} +/* Disabled */ +.uk-tab > li.uk-disabled > a { + color: #999999; + cursor: auto; +} +.uk-tab > li.uk-disabled > a:hover, +.uk-tab > li.uk-disabled > a:focus, +.uk-tab > li.uk-disabled.uk-active > a { + background: none; + border-color: transparent; +} +/* Modifier: 'tab-flip' + ========================================================================== */ +.uk-tab-flip > li { + float: right; +} +.uk-tab-flip > li:nth-child(n+2) > a { + margin-left: 0; + margin-right: 5px; +} +/* Modifier: 'tab-responsive' + ========================================================================== */ +.uk-tab > li.uk-tab-responsive > a { + margin-left: 0; + margin-right: 0; +} +/* + * Icon + */ +.uk-tab-responsive > a:before { + content: "\f0c9\00a0"; + font-family: FontAwesome; +} +/* Modifier: 'tab-center' + ========================================================================== */ +.uk-tab-center { + border-bottom: 1px solid #dddddd; +} +.uk-tab-center-bottom { + border-bottom: none; + border-top: 1px solid #dddddd; +} +.uk-tab-center:before, +.uk-tab-center:after { + content: " "; + display: table; +} +.uk-tab-center:after { + clear: both; +} +/* + * 1. Using `right` to prevent vertical scrollbar caused by centering if to many tabs + */ +.uk-tab-center .uk-tab { + position: relative; + right: 50%; + border: none; + float: right; +} +.uk-tab-center .uk-tab > li { + position: relative; + right: -50%; +} +.uk-tab-center .uk-tab > li > a { + text-align: center; +} +/* Modifier: 'tab-bottom' + ========================================================================== */ +.uk-tab-bottom { + border-top: 1px solid #dddddd; + border-bottom: none; +} +.uk-tab-bottom > li { + margin-top: -1px; + margin-bottom: 0; +} +.uk-tab-bottom > li > a { + padding-top: 8px; + padding-bottom: 8px; + border-bottom-width: 1px; + border-top-width: 0; +} +.uk-tab-bottom > li:not(.uk-active) > a:hover, +.uk-tab-bottom > li:not(.uk-active) > a:focus, +.uk-tab-bottom > li.uk-open:not(.uk-active) > a { + margin-bottom: 0; + margin-top: 1px; + padding-bottom: 8px; + padding-top: 7px; +} +.uk-tab-bottom > li.uk-active > a { + border-top-color: transparent; + border-bottom-color: #dddddd; +} +/* Modifier: 'tab-grid' + ========================================================================== */ +/* + * 1. Create position context to prevent hidden border because of negative `z-index` + */ +.uk-tab-grid { + margin-left: -5px; + border-bottom: none; + /* 1 */ + position: relative; + z-index: 0; +} +.uk-tab-grid:before { + display: block; + position: absolute; + left: 5px; + right: 0; + bottom: -1px; + border-top: 1px solid #dddddd; + /* 1 */ + z-index: -1; +} +.uk-tab-grid > li:first-child > a { + margin-left: 5px; +} +.uk-tab-grid > li > a { + text-align: center; +} +/* + * If `uk-tab-bottom` + */ +.uk-tab-grid.uk-tab-bottom { + border-top: none; +} +.uk-tab-grid.uk-tab-bottom:before { + top: -1px; + bottom: auto; +} +/* Modifier: 'tab-left', 'tab-right' + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-tab-left, + .uk-tab-right { + border-bottom: none; + } + .uk-tab-left > li, + .uk-tab-right > li { + margin-bottom: 0; + float: none; + } + .uk-tab-left > li > a, + .uk-tab-right > li > a { + padding-top: 8px; + padding-bottom: 8px; + } + .uk-tab-left > li:nth-child(n+2) > a, + .uk-tab-right > li:nth-child(n+2) > a { + margin-left: 0; + margin-top: 5px; + } + .uk-tab-left > li.uk-active > a, + .uk-tab-right > li.uk-active > a { + border-color: #dddddd; + } + /* + * Modifier: 'tab-left' + */ + .uk-tab-left { + border-right: 1px solid #dddddd; + } + .uk-tab-left > li { + margin-right: -1px; + } + .uk-tab-left > li > a { + border-bottom-width: 1px; + border-right-width: 0; + } + .uk-tab-left > li:not(.uk-active) > a:hover, + .uk-tab-left > li:not(.uk-active) > a:focus { + margin-bottom: 0; + margin-right: 1px; + padding-bottom: 8px; + padding-right: 11px; + } + .uk-tab-left > li.uk-active > a { + border-right-color: transparent; + } + /* + * Modifier: 'tab-right' + */ + .uk-tab-right { + border-left: 1px solid #dddddd; + } + .uk-tab-right > li { + margin-left: -1px; + } + .uk-tab-right > li > a { + border-bottom-width: 1px; + border-left-width: 0; + } + .uk-tab-right > li:not(.uk-active) > a:hover, + .uk-tab-right > li:not(.uk-active) > a:focus { + margin-bottom: 0; + margin-left: 1px; + padding-bottom: 8px; + padding-left: 11px; + } + .uk-tab-right > li.uk-active > a { + border-left-color: transparent; + } +} +/* ======================================================================== + Component: List + ========================================================================== */ +.uk-list { + padding: 0; + list-style: none; +} +/* + * Micro clearfix to make list more robust + */ +.uk-list > li:before, +.uk-list > li:after { + content: " "; + display: table; +} +.uk-list > li:after { + clear: both; +} +/* + * Remove margin from the last-child + */ +.uk-list > li > :last-child { + margin-bottom: 0; +} +/* + * Nested lists + */ +.uk-list ul { + margin: 0; + padding-left: 20px; + list-style: none; +} +/* Modifier: `uk-list-line` + ========================================================================== */ +.uk-list-line > li:nth-child(n+2) { + margin-top: 5px; + padding-top: 5px; + border-top: 1px solid #dddddd; +} +/* Modifier: `uk-list-striped` + ========================================================================== */ +.uk-list-striped > li { + padding: 5px 5px; +} +.uk-list-striped > li:nth-of-type(odd) { + background: #f5f5f5; +} +/* Modifier: `uk-list-space` + ========================================================================== */ +.uk-list-space > li:nth-child(n+2) { + margin-top: 10px; +} +/* ======================================================================== + Component: Description list + ========================================================================== */ +/* Modifier: `uk-description-list-horizontal` + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-description-list-horizontal { + overflow: hidden; + } + .uk-description-list-horizontal > dt { + width: 160px; + float: left; + clear: both; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .uk-description-list-horizontal > dd { + margin-left: 180px; + } +} +/* Modifier: `uk-description-list-line` + ========================================================================== */ +.uk-description-list-line > dt { + font-weight: normal; +} +.uk-description-list-line > dt:nth-child(n+2) { + margin-top: 5px; + padding-top: 5px; + border-top: 1px solid #dddddd; +} +.uk-description-list-line > dd { + color: #999999; +} +/* ======================================================================== + Component: Table + ========================================================================== */ +/* + * 1. Remove most spacing between table cells. + * 2. Block element behavior + * 3. Style + */ +.uk-table { + /* 1 */ + border-collapse: collapse; + border-spacing: 0; + /* 2 */ + width: 100%; + /* 3 */ + margin-bottom: 15px; +} +/* + * Add margin if adjacent element + */ +* + .uk-table { + margin-top: 15px; +} +.uk-table th, +.uk-table td { + padding: 8px 8px; +} +/* + * Set alignment + */ +.uk-table th { + text-align: left; +} +.uk-table td { + vertical-align: top; +} +.uk-table thead th { + vertical-align: bottom; +} +/* + * Caption and footer + */ +.uk-table caption, +.uk-table tfoot { + font-size: 12px; + font-style: italic; +} +.uk-table caption { + text-align: left; + color: #999999; +} +/* Sub-modifier: `uk-table-middle` + ========================================================================== */ +.uk-table-middle, +.uk-table-middle td { + vertical-align: middle !important; +} +/* Modifier: `uk-table-striped` + ========================================================================== */ +.uk-table-striped tbody tr:nth-of-type(odd) { + background: #f5f5f5; +} +/* Modifier: `uk-table-condensed` + ========================================================================== */ +.uk-table-condensed td { + padding: 4px 8px; +} +/* Modifier: `uk-table-hover` + ========================================================================== */ +.uk-table-hover tbody tr:hover { + background: #eeeeee; +} +/* ======================================================================== + Component: Form + ========================================================================== */ +/* + * 1. Define consistent box sizing. + * Default is `content-box` with following exceptions set to `border-box` + * `button`, `select`, `input[type="checkbox"]` and `input[type="radio"]` + * `input[type="search"]` in Chrome, Safari and Opera + * `input[type="color"]` in Firefox + * 2. Address margins set differently in Firefox/IE and Chrome/Safari/Opera. + * 3. Remove `border-radius` in iOS. + * 4. Correct `font` properties and `color` not being inherited. + */ +.uk-form input, +.uk-form select, +.uk-form textarea { + /* 1 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 2 */ + margin: 0; + /* 3 */ + border-radius: 0; + /* 4 */ + font: inherit; + color: inherit; +} +/* + * Address inconsistent `text-transform` inheritance which is only inherit in Firefox + */ +.uk-form select { + text-transform: none; +} +/* + * 1. Correct `font` properties not being inherited. + * 2. Don't inherit the `font-weight` and use `bold` instead. + * NOTE: Both declarations don't work in Chrome, Safari and Opera. + */ +.uk-form optgroup { + /* 1 */ + font: inherit; + /* 2 */ + font-weight: bold; +} +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-form input::-moz-focus-inner { + border: 0; + padding: 0; +} +/* + * Removes excess padding in IE 8/9/10. + */ +.uk-form input[type="checkbox"], +.uk-form input[type="radio"] { + padding: 0; +} +/* + * Improves consistency of cursor style for clickable elements + */ +.uk-form input[type="checkbox"]:not(:disabled), +.uk-form input[type="radio"]:not(:disabled) { + cursor: pointer; +} +/* + * Remove default style in iOS. + */ +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="number"], +.uk-form input[type="datetime"] { + -webkit-appearance: none; +} +/* + * Remove inner padding and search cancel button in Chrome, Safari and Opera on OS X. + */ +.uk-form input[type="search"]::-webkit-search-cancel-button, +.uk-form input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +/* + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +.uk-form input[type="number"]::-webkit-inner-spin-button, +.uk-form input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +/* + * Define consistent border, margin, and padding. + */ +.uk-form fieldset { + border: none; + margin: 0; + padding: 0; +} +/* + * 1. Remove default vertical scrollbar in IE 8/9/10/11. + * 2. Improve readability and alignment in all browsers. + */ +.uk-form textarea { + /* 1 */ + overflow: auto; + /* 2 */ + vertical-align: top; +} +/* + * Removes placeholder transparency in Firefox. + */ +.uk-form ::-moz-placeholder { + opacity: 1; +} +/* + * Removes `box-shadow` for invalid controls in Firefox. + */ +.uk-form :invalid { + box-shadow: none; +} +/* + * Vertical alignment + */ +.uk-form input:not([type="radio"]):not([type="checkbox"]), +.uk-form select { + vertical-align: middle; +} +/* Style + ========================================================================== */ +/* + * Remove margin from the last-child + */ +.uk-form > :last-child { + margin-bottom: 0; +} +/* + * Controls + * Except for `range`, `radio`, `checkbox`, `file`, `submit`, `reset`, `button` and `image` + * 1. Must be `height` because `min-height` is not working in OSX + * 2. Responsiveness: Sets a maximum width relative to the parent to scale on narrower viewports + * 3. Vertical `padding` needed for `select` elements in Firefox + * 4. Style + */ +.uk-form select, +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="datetime"], +.uk-form input[type="datetime-local"], +.uk-form input[type="date"], +.uk-form input[type="month"], +.uk-form input[type="time"], +.uk-form input[type="week"], +.uk-form input[type="number"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="color"] { + /* 1 */ + height: 30px; + /* 2 */ + max-width: 100%; + /* 3 */ + padding: 4px 6px; + /* 4 */ + border: 1px solid #dddddd; + background: #ffffff; + color: #444444; + -webkit-transition: all linear 0.2s; + transition: all linear 0.2s; +} +.uk-form select:focus, +.uk-form textarea:focus, +.uk-form input:not([type]):focus, +.uk-form input[type="text"]:focus, +.uk-form input[type="password"]:focus, +.uk-form input[type="datetime"]:focus, +.uk-form input[type="datetime-local"]:focus, +.uk-form input[type="date"]:focus, +.uk-form input[type="month"]:focus, +.uk-form input[type="time"]:focus, +.uk-form input[type="week"]:focus, +.uk-form input[type="number"]:focus, +.uk-form input[type="email"]:focus, +.uk-form input[type="url"]:focus, +.uk-form input[type="search"]:focus, +.uk-form input[type="tel"]:focus, +.uk-form input[type="color"]:focus { + border-color: #99baca; + outline: 0; + background: #f5fbfe; + color: #444444; +} +.uk-form select:disabled, +.uk-form textarea:disabled, +.uk-form input:not([type]):disabled, +.uk-form input[type="text"]:disabled, +.uk-form input[type="password"]:disabled, +.uk-form input[type="datetime"]:disabled, +.uk-form input[type="datetime-local"]:disabled, +.uk-form input[type="date"]:disabled, +.uk-form input[type="month"]:disabled, +.uk-form input[type="time"]:disabled, +.uk-form input[type="week"]:disabled, +.uk-form input[type="number"]:disabled, +.uk-form input[type="email"]:disabled, +.uk-form input[type="url"]:disabled, +.uk-form input[type="search"]:disabled, +.uk-form input[type="tel"]:disabled, +.uk-form input[type="color"]:disabled { + border-color: #dddddd; + background-color: #f5f5f5; + color: #999999; +} +/* + * Placeholder + */ +.uk-form :-ms-input-placeholder { + color: #999999 !important; +} +.uk-form ::-moz-placeholder { + color: #999999; +} +.uk-form ::-webkit-input-placeholder { + color: #999999; +} +.uk-form :disabled:-ms-input-placeholder { + color: #999999 !important; +} +.uk-form :disabled::-moz-placeholder { + color: #999999; +} +.uk-form :disabled::-webkit-input-placeholder { + color: #999999; +} +/* + * Legend + * 1. Behave like block element + * 2. Correct `color` not being inherited in IE 8/9/10/11. + * 3. Remove padding + * 4. `margin-bottom` is not working in Safari and Opera. + * Using `padding` and :after instead to create the border + * 5. Style + */ +.uk-form legend { + /* 1 */ + width: 100%; + /* 2 */ + border: 0; + /* 3 */ + padding: 0; + /* 4 */ + padding-bottom: 15px; + /* 5 */ + font-size: 18px; + line-height: 30px; +} +/* 4 */ +.uk-form legend:after { + content: ""; + display: block; + border-bottom: 1px solid #dddddd; +} +/* Size modifiers + * Higher specificity needed to override defaults + ========================================================================== */ +select.uk-form-small, +textarea.uk-form-small, +input[type].uk-form-small, +input:not([type]).uk-form-small { + height: 25px; + padding: 3px 3px; + font-size: 12px; +} +select.uk-form-large, +textarea.uk-form-large, +input[type].uk-form-large, +input:not([type]).uk-form-large { + height: 40px; + padding: 8px 6px; + font-size: 16px; +} +/* Reset height + * Must be after size modifiers + ========================================================================== */ +.uk-form textarea, +.uk-form select[multiple], +.uk-form select[size] { + height: auto; +} +/* Validation states + * Using !important to keep the selector simple + ========================================================================== */ +/* + * Error state + */ +.uk-form-danger { + border-color: #dc8d99 !important; + background: #fff7f8 !important; + color: #c91032 !important; +} +/* + * Success state + */ +.uk-form-success { + border-color: #8ec73b !important; + background: #fafff2 !important; + color: #539022 !important; +} +/* Style modifiers + * Using !important to keep the selector simple + ========================================================================== */ +/* + * Blank form + */ +.uk-form-blank { + border-color: transparent !important; + border-style: dashed !important; + background: none !important; +} +.uk-form-blank:focus { + border-color: #dddddd !important; +} +/* Size sub-modifiers + ========================================================================== */ +/* + * Fixed widths + * Different widths for mini sized `input` and `select` elements + */ +input.uk-form-width-mini { + width: 40px; +} +select.uk-form-width-mini { + width: 65px; +} +.uk-form-width-small { + width: 130px; +} +.uk-form-width-medium { + width: 200px; +} +.uk-form-width-large { + width: 500px; +} +/* Sub-objects: `uk-form-row` + * Groups labels and controls in rows + ========================================================================== */ +/* + * Micro clearfix + * Needed for `uk-form-horizontal` modifier + */ +.uk-form-row:before, +.uk-form-row:after { + content: " "; + display: table; +} +.uk-form-row:after { + clear: both; +} +/* + * Vertical gutter + */ +.uk-form-row + .uk-form-row { + margin-top: 15px; +} +/* Help text + * Sub-object: `uk-form-help-inline`, `uk-form-help-block` + ========================================================================== */ +.uk-form-help-inline { + display: inline-block; + margin: 0 0 0 10px; +} +.uk-form-help-block { + margin: 5px 0 0 0; +} +/* Controls content + * Sub-object: `uk-form-controls`, `uk-form-controls-condensed` + ========================================================================== */ +/* + * Remove margins + */ +.uk-form-controls > :first-child { + margin-top: 0; +} +.uk-form-controls > :last-child { + margin-bottom: 0; +} +/* + * Group controls and text into blocks with a small spacing between blocks + */ +.uk-form-controls-condensed { + margin: 5px 0; +} +/* Modifier: `uk-form-stacked` + * Requires sub-object: `uk-form-label` + ========================================================================== */ +.uk-form-stacked .uk-form-label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} +/* Modifier: `uk-form-horizontal` + * Requires sub-objects: `uk-form-label`, `uk-form-controls` + ========================================================================== */ +/* Tablet portrait and smaller */ +@media (max-width: 959px) { + /* Behave like `uk-form-stacked` */ + .uk-form-horizontal .uk-form-label { + display: block; + margin-bottom: 5px; + font-weight: bold; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-form-horizontal .uk-form-label { + width: 200px; + margin-top: 5px; + float: left; + } + .uk-form-horizontal .uk-form-controls { + margin-left: 215px; + } + /* Better vertical alignment if controls are checkboxes and radio buttons with text */ + .uk-form-horizontal .uk-form-controls-text { + padding-top: 5px; + } +} +/* Sub-object: `uk-form-icon` + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Create position context + * 3. Prevent `inline-block` consequences + */ +.uk-form-icon { + /* 1 */ + display: inline-block; + /* 2 */ + position: relative; + /* 3 */ + max-width: 100%; +} +/* + * 1. Make form element clickable through icon + */ +.uk-form-icon > [class*='uk-icon-'] { + position: absolute; + top: 50%; + width: 30px; + margin-top: -7px; + font-size: 14px; + color: #999999; + text-align: center; + /* 1 */ + pointer-events: none; +} +.uk-form-icon:not(.uk-form-icon-flip) > input { + padding-left: 30px !important; +} +/* + * Sub-modifier: `uk-form-icon-flip` + */ +.uk-form-icon-flip > [class*='uk-icon-'] { + right: 0; +} +.uk-form-icon-flip > input { + padding-right: 30px !important; +} +/* ======================================================================== + Component: Button + ========================================================================== */ +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-button::-moz-focus-inner { + border: 0; + padding: 0; +} +/* + * 1. Correct inability to style clickable `input` types in iOS. + * 2. Remove margins in Chrome, Safari and Opera. + * 3. Remove borders for `button`. + * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. + * 5. Correct `font` properties and `color` not being inherited for `button`. + * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE + * 7. Style + * 8. `line-height` is used to create a height + * 9. `min-height` is necessary for `input` elements in Firefox and Opera because `line-height` is not working. + * 10. Reset button group whitespace hack + * 11. Required for `a`. + */ +.uk-button { + /* 1 */ + -webkit-appearance: none; + /* 2 */ + margin: 0; + /* 3 */ + border: none; + /* 4 */ + overflow: visible; + /* 5 */ + font: inherit; + color: #444444; + /* 6 */ + text-transform: none; + /* 7 */ + display: inline-block; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 12px; + background: #eeeeee; + vertical-align: middle; + /* 8 */ + line-height: 30px; + /* 9 */ + min-height: 30px; + /* 10 */ + font-size: 1rem; + /* 11 */ + text-decoration: none; + text-align: center; +} +.uk-button:not(:disabled) { + cursor: pointer; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + * 3. Required for `a` elements + */ +.uk-button:hover, +.uk-button:focus { + background-color: #f5f5f5; + color: #444444; + /* 2 */ + outline: none; + /* 3 */ + text-decoration: none; +} +/* Active */ +.uk-button:active, +.uk-button.uk-active { + background-color: #dddddd; + color: #444444; +} +/* Color modifiers + ========================================================================== */ +/* + * Modifier: `uk-button-primary` + */ +.uk-button-primary { + background-color: #00a8e6; + color: #ffffff; +} +/* Hover */ +.uk-button-primary:hover, +.uk-button-primary:focus { + background-color: #35b3ee; + color: #ffffff; +} +/* Active */ +.uk-button-primary:active, +.uk-button-primary.uk-active { + background-color: #0091ca; + color: #ffffff; +} +/* + * Modifier: `uk-button-success` + */ +.uk-button-success { + background-color: #8cc14c; + color: #ffffff; +} +/* Hover */ +.uk-button-success:hover, +.uk-button-success:focus { + background-color: #8ec73b; + color: #ffffff; +} +/* Active */ +.uk-button-success:active, +.uk-button-success.uk-active { + background-color: #72ae41; + color: #ffffff; +} +/* + * Modifier: `uk-button-danger` + */ +.uk-button-danger { + background-color: #da314b; + color: #ffffff; +} +/* Hover */ +.uk-button-danger:hover, +.uk-button-danger:focus { + background-color: #e4354f; + color: #ffffff; +} +/* Active */ +.uk-button-danger:active, +.uk-button-danger.uk-active { + background-color: #c91032; + color: #ffffff; +} +/* Disabled state + * Overrides also the color modifiers + ========================================================================== */ +/* Equal for all button types */ +.uk-button:disabled { + background-color: #f5f5f5; + color: #999999; +} +/* Modifier: `uk-button-link` + ========================================================================== */ +/* Reset */ +.uk-button-link, +.uk-button-link:hover, +.uk-button-link:focus, +.uk-button-link:active, +.uk-button-link.uk-active, +.uk-button-link:disabled { + border-color: transparent; + background: none; +} +/* Color */ +.uk-button-link { + color: #0077dd; +} +.uk-button-link:hover, +.uk-button-link:focus, +.uk-button-link:active, +.uk-button-link.uk-active { + color: #005599; + text-decoration: underline; +} +.uk-button-link:disabled { + color: #999999; +} +/* Focus */ +.uk-button-link:focus { + outline: 1px dotted; +} +/* Size modifiers + ========================================================================== */ +.uk-button-mini { + min-height: 20px; + padding: 0 6px; + line-height: 20px; + font-size: 11px; +} +.uk-button-small { + min-height: 25px; + padding: 0 10px; + line-height: 25px; + font-size: 12px; +} +.uk-button-large { + min-height: 40px; + padding: 0 15px; + line-height: 40px; + font-size: 16px; +} +/* Sub-object `uk-button-group` + ========================================================================== */ +/* + * 1. Behave like buttons + * 2. Create position context for dropdowns + * 3. Remove whitespace between child elements when using `inline-block` + * 4. Prevent buttons from wrapping + * 5. Remove whitespace between child elements when using `inline-block` + */ +.uk-button-group { + /* 1 */ + display: inline-block; + vertical-align: middle; + /* 2 */ + position: relative; + /* 3 */ + font-size: 0.001px; + /* 4 */ + white-space: nowrap; +} +.uk-button-group > * { + display: inline-block; +} +/* 5 */ +.uk-button-group .uk-button { + vertical-align: top; +} +/* Sub-object: `uk-button-dropdown` + ========================================================================== */ +/* + * 1. Behave like buttons + * 2. Create position context for dropdowns + */ +.uk-button-dropdown { + /* 1 */ + display: inline-block; + vertical-align: middle; + /* 2 */ + position: relative; +} +/* ======================================================================== + Component: Icon + ========================================================================== */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.eot"); + src: url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff") format("woff"), url("../fonts/fontawesome-webfont.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +/* + * 1. Allow margin + * 2. Prevent inherit font style + * 4. Correct line-height + * 5. Better font rendering + */ +[class*='uk-icon-'] { + font-family: FontAwesome; + /* 1 */ + display: inline-block; + /* 2 */ + font-weight: normal; + font-style: normal; + /* 4 */ + line-height: 1; + /* 5 */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* Size modifiers + ========================================================================== */ +.uk-icon-small:before { + font-size: 150%; + vertical-align: -10%; +} +.uk-icon-medium:before { + font-size: 200%; + vertical-align: -16%; +} +.uk-icon-large:before { + font-size: 250%; + vertical-align: -22%; +} +/* Modifier: `uk-icon-spin` + ========================================================================== */ +.uk-icon-spin { + display: inline-block; + -webkit-animation: uk-rotate 2s infinite linear; + animation: uk-rotate 2s infinite linear; +} +/* Modifier: `uk-icon-button` + ========================================================================== */ +.uk-icon-button { + -moz-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + width: 35px; + height: 35px; + border-radius: 100%; + background: #eeeeee; + line-height: 35px; + color: #444444; + font-size: 18px; + text-align: center; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-icon-button:hover, +.uk-icon-button:focus { + background-color: #f5f5f5; + color: #444444; + text-decoration: none; + /* 2 */ + outline: none; +} +/* Active */ +.uk-icon-button:active { + background-color: #dddddd; + color: #444444; +} +/* Icon mapping + ========================================================================== */ +.uk-icon-glass:before { + content: "\f000"; +} +.uk-icon-music:before { + content: "\f001"; +} +.uk-icon-search:before { + content: "\f002"; +} +.uk-icon-envelope-o:before { + content: "\f003"; +} +.uk-icon-heart:before { + content: "\f004"; +} +.uk-icon-star:before { + content: "\f005"; +} +.uk-icon-star-o:before { + content: "\f006"; +} +.uk-icon-user:before { + content: "\f007"; +} +.uk-icon-film:before { + content: "\f008"; +} +.uk-icon-th-large:before { + content: "\f009"; +} +.uk-icon-th:before { + content: "\f00a"; +} +.uk-icon-th-list:before { + content: "\f00b"; +} +.uk-icon-check:before { + content: "\f00c"; +} +.uk-icon-remove:before, +.uk-icon-close:before, +.uk-icon-times:before { + content: "\f00d"; +} +.uk-icon-search-plus:before { + content: "\f00e"; +} +.uk-icon-search-minus:before { + content: "\f010"; +} +.uk-icon-power-off:before { + content: "\f011"; +} +.uk-icon-signal:before { + content: "\f012"; +} +.uk-icon-gear:before, +.uk-icon-cog:before { + content: "\f013"; +} +.uk-icon-trash-o:before { + content: "\f014"; +} +.uk-icon-home:before { + content: "\f015"; +} +.uk-icon-file-o:before { + content: "\f016"; +} +.uk-icon-clock-o:before { + content: "\f017"; +} +.uk-icon-road:before { + content: "\f018"; +} +.uk-icon-download:before { + content: "\f019"; +} +.uk-icon-arrow-circle-o-down:before { + content: "\f01a"; +} +.uk-icon-arrow-circle-o-up:before { + content: "\f01b"; +} +.uk-icon-inbox:before { + content: "\f01c"; +} +.uk-icon-play-circle-o:before { + content: "\f01d"; +} +.uk-icon-rotate-right:before, +.uk-icon-repeat:before { + content: "\f01e"; +} +.uk-icon-refresh:before { + content: "\f021"; +} +.uk-icon-list-alt:before { + content: "\f022"; +} +.uk-icon-lock:before { + content: "\f023"; +} +.uk-icon-flag:before { + content: "\f024"; +} +.uk-icon-headphones:before { + content: "\f025"; +} +.uk-icon-volume-off:before { + content: "\f026"; +} +.uk-icon-volume-down:before { + content: "\f027"; +} +.uk-icon-volume-up:before { + content: "\f028"; +} +.uk-icon-qrcode:before { + content: "\f029"; +} +.uk-icon-barcode:before { + content: "\f02a"; +} +.uk-icon-tag:before { + content: "\f02b"; +} +.uk-icon-tags:before { + content: "\f02c"; +} +.uk-icon-book:before { + content: "\f02d"; +} +.uk-icon-bookmark:before { + content: "\f02e"; +} +.uk-icon-print:before { + content: "\f02f"; +} +.uk-icon-camera:before { + content: "\f030"; +} +.uk-icon-font:before { + content: "\f031"; +} +.uk-icon-bold:before { + content: "\f032"; +} +.uk-icon-italic:before { + content: "\f033"; +} +.uk-icon-text-height:before { + content: "\f034"; +} +.uk-icon-text-width:before { + content: "\f035"; +} +.uk-icon-align-left:before { + content: "\f036"; +} +.uk-icon-align-center:before { + content: "\f037"; +} +.uk-icon-align-right:before { + content: "\f038"; +} +.uk-icon-align-justify:before { + content: "\f039"; +} +.uk-icon-list:before { + content: "\f03a"; +} +.uk-icon-dedent:before, +.uk-icon-outdent:before { + content: "\f03b"; +} +.uk-icon-indent:before { + content: "\f03c"; +} +.uk-icon-video-camera:before { + content: "\f03d"; +} +.uk-icon-photo:before, +.uk-icon-image:before, +.uk-icon-picture-o:before { + content: "\f03e"; +} +.uk-icon-pencil:before { + content: "\f040"; +} +.uk-icon-map-marker:before { + content: "\f041"; +} +.uk-icon-adjust:before { + content: "\f042"; +} +.uk-icon-tint:before { + content: "\f043"; +} +.uk-icon-edit:before, +.uk-icon-pencil-square-o:before { + content: "\f044"; +} +.uk-icon-share-square-o:before { + content: "\f045"; +} +.uk-icon-check-square-o:before { + content: "\f046"; +} +.uk-icon-arrows:before { + content: "\f047"; +} +.uk-icon-step-backward:before { + content: "\f048"; +} +.uk-icon-fast-backward:before { + content: "\f049"; +} +.uk-icon-backward:before { + content: "\f04a"; +} +.uk-icon-play:before { + content: "\f04b"; +} +.uk-icon-pause:before { + content: "\f04c"; +} +.uk-icon-stop:before { + content: "\f04d"; +} +.uk-icon-forward:before { + content: "\f04e"; +} +.uk-icon-fast-forward:before { + content: "\f050"; +} +.uk-icon-step-forward:before { + content: "\f051"; +} +.uk-icon-eject:before { + content: "\f052"; +} +.uk-icon-chevron-left:before { + content: "\f053"; +} +.uk-icon-chevron-right:before { + content: "\f054"; +} +.uk-icon-plus-circle:before { + content: "\f055"; +} +.uk-icon-minus-circle:before { + content: "\f056"; +} +.uk-icon-times-circle:before { + content: "\f057"; +} +.uk-icon-check-circle:before { + content: "\f058"; +} +.uk-icon-question-circle:before { + content: "\f059"; +} +.uk-icon-info-circle:before { + content: "\f05a"; +} +.uk-icon-crosshairs:before { + content: "\f05b"; +} +.uk-icon-times-circle-o:before { + content: "\f05c"; +} +.uk-icon-check-circle-o:before { + content: "\f05d"; +} +.uk-icon-ban:before { + content: "\f05e"; +} +.uk-icon-arrow-left:before { + content: "\f060"; +} +.uk-icon-arrow-right:before { + content: "\f061"; +} +.uk-icon-arrow-up:before { + content: "\f062"; +} +.uk-icon-arrow-down:before { + content: "\f063"; +} +.uk-icon-mail-forward:before, +.uk-icon-share:before { + content: "\f064"; +} +.uk-icon-expand:before { + content: "\f065"; +} +.uk-icon-compress:before { + content: "\f066"; +} +.uk-icon-plus:before { + content: "\f067"; +} +.uk-icon-minus:before { + content: "\f068"; +} +.uk-icon-asterisk:before { + content: "\f069"; +} +.uk-icon-exclamation-circle:before { + content: "\f06a"; +} +.uk-icon-gift:before { + content: "\f06b"; +} +.uk-icon-leaf:before { + content: "\f06c"; +} +.uk-icon-fire:before { + content: "\f06d"; +} +.uk-icon-eye:before { + content: "\f06e"; +} +.uk-icon-eye-slash:before { + content: "\f070"; +} +.uk-icon-warning:before, +.uk-icon-exclamation-triangle:before { + content: "\f071"; +} +.uk-icon-plane:before { + content: "\f072"; +} +.uk-icon-calendar:before { + content: "\f073"; +} +.uk-icon-random:before { + content: "\f074"; +} +.uk-icon-comment:before { + content: "\f075"; +} +.uk-icon-magnet:before { + content: "\f076"; +} +.uk-icon-chevron-up:before { + content: "\f077"; +} +.uk-icon-chevron-down:before { + content: "\f078"; +} +.uk-icon-retweet:before { + content: "\f079"; +} +.uk-icon-shopping-cart:before { + content: "\f07a"; +} +.uk-icon-folder:before { + content: "\f07b"; +} +.uk-icon-folder-open:before { + content: "\f07c"; +} +.uk-icon-arrows-v:before { + content: "\f07d"; +} +.uk-icon-arrows-h:before { + content: "\f07e"; +} +.uk-icon-bar-chart-o:before, +.uk-icon-bar-chart:before { + content: "\f080"; +} +.uk-icon-twitter-square:before { + content: "\f081"; +} +.uk-icon-facebook-square:before { + content: "\f082"; +} +.uk-icon-camera-retro:before { + content: "\f083"; +} +.uk-icon-key:before { + content: "\f084"; +} +.uk-icon-gears:before, +.uk-icon-cogs:before { + content: "\f085"; +} +.uk-icon-comments:before { + content: "\f086"; +} +.uk-icon-thumbs-o-up:before { + content: "\f087"; +} +.uk-icon-thumbs-o-down:before { + content: "\f088"; +} +.uk-icon-star-half:before { + content: "\f089"; +} +.uk-icon-heart-o:before { + content: "\f08a"; +} +.uk-icon-sign-out:before { + content: "\f08b"; +} +.uk-icon-linkedin-square:before { + content: "\f08c"; +} +.uk-icon-thumb-tack:before { + content: "\f08d"; +} +.uk-icon-external-link:before { + content: "\f08e"; +} +.uk-icon-sign-in:before { + content: "\f090"; +} +.uk-icon-trophy:before { + content: "\f091"; +} +.uk-icon-github-square:before { + content: "\f092"; +} +.uk-icon-upload:before { + content: "\f093"; +} +.uk-icon-lemon-o:before { + content: "\f094"; +} +.uk-icon-phone:before { + content: "\f095"; +} +.uk-icon-square-o:before { + content: "\f096"; +} +.uk-icon-bookmark-o:before { + content: "\f097"; +} +.uk-icon-phone-square:before { + content: "\f098"; +} +.uk-icon-twitter:before { + content: "\f099"; +} +.uk-icon-facebook:before { + content: "\f09a"; +} +.uk-icon-github:before { + content: "\f09b"; +} +.uk-icon-unlock:before { + content: "\f09c"; +} +.uk-icon-credit-card:before { + content: "\f09d"; +} +.uk-icon-rss:before { + content: "\f09e"; +} +.uk-icon-hdd-o:before { + content: "\f0a0"; +} +.uk-icon-bullhorn:before { + content: "\f0a1"; +} +.uk-icon-bell:before { + content: "\f0f3"; +} +.uk-icon-certificate:before { + content: "\f0a3"; +} +.uk-icon-hand-o-right:before { + content: "\f0a4"; +} +.uk-icon-hand-o-left:before { + content: "\f0a5"; +} +.uk-icon-hand-o-up:before { + content: "\f0a6"; +} +.uk-icon-hand-o-down:before { + content: "\f0a7"; +} +.uk-icon-arrow-circle-left:before { + content: "\f0a8"; +} +.uk-icon-arrow-circle-right:before { + content: "\f0a9"; +} +.uk-icon-arrow-circle-up:before { + content: "\f0aa"; +} +.uk-icon-arrow-circle-down:before { + content: "\f0ab"; +} +.uk-icon-globe:before { + content: "\f0ac"; +} +.uk-icon-wrench:before { + content: "\f0ad"; +} +.uk-icon-tasks:before { + content: "\f0ae"; +} +.uk-icon-filter:before { + content: "\f0b0"; +} +.uk-icon-briefcase:before { + content: "\f0b1"; +} +.uk-icon-arrows-alt:before { + content: "\f0b2"; +} +.uk-icon-group:before, +.uk-icon-users:before { + content: "\f0c0"; +} +.uk-icon-chain:before, +.uk-icon-link:before { + content: "\f0c1"; +} +.uk-icon-cloud:before { + content: "\f0c2"; +} +.uk-icon-flask:before { + content: "\f0c3"; +} +.uk-icon-cut:before, +.uk-icon-scissors:before { + content: "\f0c4"; +} +.uk-icon-copy:before, +.uk-icon-files-o:before { + content: "\f0c5"; +} +.uk-icon-paperclip:before { + content: "\f0c6"; +} +.uk-icon-save:before, +.uk-icon-floppy-o:before { + content: "\f0c7"; +} +.uk-icon-square:before { + content: "\f0c8"; +} +.uk-icon-navicon:before, +.uk-icon-reorder:before, +.uk-icon-bars:before { + content: "\f0c9"; +} +.uk-icon-list-ul:before { + content: "\f0ca"; +} +.uk-icon-list-ol:before { + content: "\f0cb"; +} +.uk-icon-strikethrough:before { + content: "\f0cc"; +} +.uk-icon-underline:before { + content: "\f0cd"; +} +.uk-icon-table:before { + content: "\f0ce"; +} +.uk-icon-magic:before { + content: "\f0d0"; +} +.uk-icon-truck:before { + content: "\f0d1"; +} +.uk-icon-pinterest:before { + content: "\f0d2"; +} +.uk-icon-pinterest-square:before { + content: "\f0d3"; +} +.uk-icon-google-plus-square:before { + content: "\f0d4"; +} +.uk-icon-google-plus:before { + content: "\f0d5"; +} +.uk-icon-money:before { + content: "\f0d6"; +} +.uk-icon-caret-down:before { + content: "\f0d7"; +} +.uk-icon-caret-up:before { + content: "\f0d8"; +} +.uk-icon-caret-left:before { + content: "\f0d9"; +} +.uk-icon-caret-right:before { + content: "\f0da"; +} +.uk-icon-columns:before { + content: "\f0db"; +} +.uk-icon-unsorted:before, +.uk-icon-sort:before { + content: "\f0dc"; +} +.uk-icon-sort-down:before, +.uk-icon-sort-desc:before { + content: "\f0dd"; +} +.uk-icon-sort-up:before, +.uk-icon-sort-asc:before { + content: "\f0de"; +} +.uk-icon-envelope:before { + content: "\f0e0"; +} +.uk-icon-linkedin:before { + content: "\f0e1"; +} +.uk-icon-rotate-left:before, +.uk-icon-undo:before { + content: "\f0e2"; +} +.uk-icon-legal:before, +.uk-icon-gavel:before { + content: "\f0e3"; +} +.uk-icon-dashboard:before, +.uk-icon-tachometer:before { + content: "\f0e4"; +} +.uk-icon-comment-o:before { + content: "\f0e5"; +} +.uk-icon-comments-o:before { + content: "\f0e6"; +} +.uk-icon-flash:before, +.uk-icon-bolt:before { + content: "\f0e7"; +} +.uk-icon-sitemap:before { + content: "\f0e8"; +} +.uk-icon-umbrella:before { + content: "\f0e9"; +} +.uk-icon-paste:before, +.uk-icon-clipboard:before { + content: "\f0ea"; +} +.uk-icon-lightbulb-o:before { + content: "\f0eb"; +} +.uk-icon-exchange:before { + content: "\f0ec"; +} +.uk-icon-cloud-download:before { + content: "\f0ed"; +} +.uk-icon-cloud-upload:before { + content: "\f0ee"; +} +.uk-icon-user-md:before { + content: "\f0f0"; +} +.uk-icon-stethoscope:before { + content: "\f0f1"; +} +.uk-icon-suitcase:before { + content: "\f0f2"; +} +.uk-icon-bell-o:before { + content: "\f0a2"; +} +.uk-icon-coffee:before { + content: "\f0f4"; +} +.uk-icon-cutlery:before { + content: "\f0f5"; +} +.uk-icon-file-text-o:before { + content: "\f0f6"; +} +.uk-icon-building-o:before { + content: "\f0f7"; +} +.uk-icon-hospital-o:before { + content: "\f0f8"; +} +.uk-icon-ambulance:before { + content: "\f0f9"; +} +.uk-icon-medkit:before { + content: "\f0fa"; +} +.uk-icon-fighter-jet:before { + content: "\f0fb"; +} +.uk-icon-beer:before { + content: "\f0fc"; +} +.uk-icon-h-square:before { + content: "\f0fd"; +} +.uk-icon-plus-square:before { + content: "\f0fe"; +} +.uk-icon-angle-double-left:before { + content: "\f100"; +} +.uk-icon-angle-double-right:before { + content: "\f101"; +} +.uk-icon-angle-double-up:before { + content: "\f102"; +} +.uk-icon-angle-double-down:before { + content: "\f103"; +} +.uk-icon-angle-left:before { + content: "\f104"; +} +.uk-icon-angle-right:before { + content: "\f105"; +} +.uk-icon-angle-up:before { + content: "\f106"; +} +.uk-icon-angle-down:before { + content: "\f107"; +} +.uk-icon-desktop:before { + content: "\f108"; +} +.uk-icon-laptop:before { + content: "\f109"; +} +.uk-icon-tablet:before { + content: "\f10a"; +} +.uk-icon-mobile-phone:before, +.uk-icon-mobile:before { + content: "\f10b"; +} +.uk-icon-circle-o:before { + content: "\f10c"; +} +.uk-icon-quote-left:before { + content: "\f10d"; +} +.uk-icon-quote-right:before { + content: "\f10e"; +} +.uk-icon-spinner:before { + content: "\f110"; +} +.uk-icon-circle:before { + content: "\f111"; +} +.uk-icon-mail-reply:before, +.uk-icon-reply:before { + content: "\f112"; +} +.uk-icon-github-alt:before { + content: "\f113"; +} +.uk-icon-folder-o:before { + content: "\f114"; +} +.uk-icon-folder-open-o:before { + content: "\f115"; +} +.uk-icon-smile-o:before { + content: "\f118"; +} +.uk-icon-frown-o:before { + content: "\f119"; +} +.uk-icon-meh-o:before { + content: "\f11a"; +} +.uk-icon-gamepad:before { + content: "\f11b"; +} +.uk-icon-keyboard-o:before { + content: "\f11c"; +} +.uk-icon-flag-o:before { + content: "\f11d"; +} +.uk-icon-flag-checkered:before { + content: "\f11e"; +} +.uk-icon-terminal:before { + content: "\f120"; +} +.uk-icon-code:before { + content: "\f121"; +} +.uk-icon-mail-reply-all:before, +.uk-icon-reply-all:before { + content: "\f122"; +} +.uk-icon-star-half-empty:before, +.uk-icon-star-half-full:before, +.uk-icon-star-half-o:before { + content: "\f123"; +} +.uk-icon-location-arrow:before { + content: "\f124"; +} +.uk-icon-crop:before { + content: "\f125"; +} +.uk-icon-code-fork:before { + content: "\f126"; +} +.uk-icon-unlink:before, +.uk-icon-chain-broken:before { + content: "\f127"; +} +.uk-icon-question:before { + content: "\f128"; +} +.uk-icon-info:before { + content: "\f129"; +} +.uk-icon-exclamation:before { + content: "\f12a"; +} +.uk-icon-superscript:before { + content: "\f12b"; +} +.uk-icon-subscript:before { + content: "\f12c"; +} +.uk-icon-eraser:before { + content: "\f12d"; +} +.uk-icon-puzzle-piece:before { + content: "\f12e"; +} +.uk-icon-microphone:before { + content: "\f130"; +} +.uk-icon-microphone-slash:before { + content: "\f131"; +} +.uk-icon-shield:before { + content: "\f132"; +} +.uk-icon-calendar-o:before { + content: "\f133"; +} +.uk-icon-fire-extinguisher:before { + content: "\f134"; +} +.uk-icon-rocket:before { + content: "\f135"; +} +.uk-icon-maxcdn:before { + content: "\f136"; +} +.uk-icon-chevron-circle-left:before { + content: "\f137"; +} +.uk-icon-chevron-circle-right:before { + content: "\f138"; +} +.uk-icon-chevron-circle-up:before { + content: "\f139"; +} +.uk-icon-chevron-circle-down:before { + content: "\f13a"; +} +.uk-icon-html5:before { + content: "\f13b"; +} +.uk-icon-css3:before { + content: "\f13c"; +} +.uk-icon-anchor:before { + content: "\f13d"; +} +.uk-icon-unlock-alt:before { + content: "\f13e"; +} +.uk-icon-bullseye:before { + content: "\f140"; +} +.uk-icon-ellipsis-h:before { + content: "\f141"; +} +.uk-icon-ellipsis-v:before { + content: "\f142"; +} +.uk-icon-rss-square:before { + content: "\f143"; +} +.uk-icon-play-circle:before { + content: "\f144"; +} +.uk-icon-ticket:before { + content: "\f145"; +} +.uk-icon-minus-square:before { + content: "\f146"; +} +.uk-icon-minus-square-o:before { + content: "\f147"; +} +.uk-icon-level-up:before { + content: "\f148"; +} +.uk-icon-level-down:before { + content: "\f149"; +} +.uk-icon-check-square:before { + content: "\f14a"; +} +.uk-icon-pencil-square:before { + content: "\f14b"; +} +.uk-icon-external-link-square:before { + content: "\f14c"; +} +.uk-icon-share-square:before { + content: "\f14d"; +} +.uk-icon-compass:before { + content: "\f14e"; +} +.uk-icon-toggle-down:before, +.uk-icon-caret-square-o-down:before { + content: "\f150"; +} +.uk-icon-toggle-up:before, +.uk-icon-caret-square-o-up:before { + content: "\f151"; +} +.uk-icon-toggle-right:before, +.uk-icon-caret-square-o-right:before { + content: "\f152"; +} +.uk-icon-euro:before, +.uk-icon-eur:before { + content: "\f153"; +} +.uk-icon-gbp:before { + content: "\f154"; +} +.uk-icon-dollar:before, +.uk-icon-usd:before { + content: "\f155"; +} +.uk-icon-rupee:before, +.uk-icon-inr:before { + content: "\f156"; +} +.uk-icon-cny:before, +.uk-icon-rmb:before, +.uk-icon-yen:before, +.uk-icon-jpy:before { + content: "\f157"; +} +.uk-icon-ruble:before, +.uk-icon-rouble:before, +.uk-icon-rub:before { + content: "\f158"; +} +.uk-icon-won:before, +.uk-icon-krw:before { + content: "\f159"; +} +.uk-icon-bitcoin:before, +.uk-icon-btc:before { + content: "\f15a"; +} +.uk-icon-file:before { + content: "\f15b"; +} +.uk-icon-file-text:before { + content: "\f15c"; +} +.uk-icon-sort-alpha-asc:before { + content: "\f15d"; +} +.uk-icon-sort-alpha-desc:before { + content: "\f15e"; +} +.uk-icon-sort-amount-asc:before { + content: "\f160"; +} +.uk-icon-sort-amount-desc:before { + content: "\f161"; +} +.uk-icon-sort-numeric-asc:before { + content: "\f162"; +} +.uk-icon-sort-numeric-desc:before { + content: "\f163"; +} +.uk-icon-thumbs-up:before { + content: "\f164"; +} +.uk-icon-thumbs-down:before { + content: "\f165"; +} +.uk-icon-youtube-square:before { + content: "\f166"; +} +.uk-icon-youtube:before { + content: "\f167"; +} +.uk-icon-xing:before { + content: "\f168"; +} +.uk-icon-xing-square:before { + content: "\f169"; +} +.uk-icon-youtube-play:before { + content: "\f16a"; +} +.uk-icon-dropbox:before { + content: "\f16b"; +} +.uk-icon-stack-overflow:before { + content: "\f16c"; +} +.uk-icon-instagram:before { + content: "\f16d"; +} +.uk-icon-flickr:before { + content: "\f16e"; +} +.uk-icon-adn:before { + content: "\f170"; +} +.uk-icon-bitbucket:before { + content: "\f171"; +} +.uk-icon-bitbucket-square:before { + content: "\f172"; +} +.uk-icon-tumblr:before { + content: "\f173"; +} +.uk-icon-tumblr-square:before { + content: "\f174"; +} +.uk-icon-long-arrow-down:before { + content: "\f175"; +} +.uk-icon-long-arrow-up:before { + content: "\f176"; +} +.uk-icon-long-arrow-left:before { + content: "\f177"; +} +.uk-icon-long-arrow-right:before { + content: "\f178"; +} +.uk-icon-apple:before { + content: "\f179"; +} +.uk-icon-windows:before { + content: "\f17a"; +} +.uk-icon-android:before { + content: "\f17b"; +} +.uk-icon-linux:before { + content: "\f17c"; +} +.uk-icon-dribbble:before { + content: "\f17d"; +} +.uk-icon-skype:before { + content: "\f17e"; +} +.uk-icon-foursquare:before { + content: "\f180"; +} +.uk-icon-trello:before { + content: "\f181"; +} +.uk-icon-female:before { + content: "\f182"; +} +.uk-icon-male:before { + content: "\f183"; +} +.uk-icon-gittip:before { + content: "\f184"; +} +.uk-icon-sun-o:before { + content: "\f185"; +} +.uk-icon-moon-o:before { + content: "\f186"; +} +.uk-icon-archive:before { + content: "\f187"; +} +.uk-icon-bug:before { + content: "\f188"; +} +.uk-icon-vk:before { + content: "\f189"; +} +.uk-icon-weibo:before { + content: "\f18a"; +} +.uk-icon-renren:before { + content: "\f18b"; +} +.uk-icon-pagelines:before { + content: "\f18c"; +} +.uk-icon-stack-exchange:before { + content: "\f18d"; +} +.uk-icon-arrow-circle-o-right:before { + content: "\f18e"; +} +.uk-icon-arrow-circle-o-left:before { + content: "\f190"; +} +.uk-icon-toggle-left:before, +.uk-icon-caret-square-o-left:before { + content: "\f191"; +} +.uk-icon-dot-circle-o:before { + content: "\f192"; +} +.uk-icon-wheelchair:before { + content: "\f193"; +} +.uk-icon-vimeo-square:before { + content: "\f194"; +} +.uk-icon-turkish-lira:before, +.uk-icon-try:before { + content: "\f195"; +} +.uk-icon-plus-square-o:before { + content: "\f196"; +} +.uk-icon-space-shuttle:before { + content: "\f197"; +} +.uk-icon-slack:before { + content: "\f198"; +} +.uk-icon-envelope-square:before { + content: "\f199"; +} +.uk-icon-wordpress:before { + content: "\f19a"; +} +.uk-icon-openid:before { + content: "\f19b"; +} +.uk-icon-institution:before, +.uk-icon-bank:before, +.uk-icon-university:before { + content: "\f19c"; +} +.uk-icon-mortar-board:before, +.uk-icon-graduation-cap:before { + content: "\f19d"; +} +.uk-icon-yahoo:before { + content: "\f19e"; +} +.uk-icon-google:before { + content: "\f1a0"; +} +.uk-icon-reddit:before { + content: "\f1a1"; +} +.uk-icon-reddit-square:before { + content: "\f1a2"; +} +.uk-icon-stumbleupon-circle:before { + content: "\f1a3"; +} +.uk-icon-stumbleupon:before { + content: "\f1a4"; +} +.uk-icon-delicious:before { + content: "\f1a5"; +} +.uk-icon-digg:before { + content: "\f1a6"; +} +.uk-icon-pied-piper:before { + content: "\f1a7"; +} +.uk-icon-pied-piper-alt:before { + content: "\f1a8"; +} +.uk-icon-drupal:before { + content: "\f1a9"; +} +.uk-icon-joomla:before { + content: "\f1aa"; +} +.uk-icon-language:before { + content: "\f1ab"; +} +.uk-icon-fax:before { + content: "\f1ac"; +} +.uk-icon-building:before { + content: "\f1ad"; +} +.uk-icon-child:before { + content: "\f1ae"; +} +.uk-icon-paw:before { + content: "\f1b0"; +} +.uk-icon-spoon:before { + content: "\f1b1"; +} +.uk-icon-cube:before { + content: "\f1b2"; +} +.uk-icon-cubes:before { + content: "\f1b3"; +} +.uk-icon-behance:before { + content: "\f1b4"; +} +.uk-icon-behance-square:before { + content: "\f1b5"; +} +.uk-icon-steam:before { + content: "\f1b6"; +} +.uk-icon-steam-square:before { + content: "\f1b7"; +} +.uk-icon-recycle:before { + content: "\f1b8"; +} +.uk-icon-automobile:before, +.uk-icon-car:before { + content: "\f1b9"; +} +.uk-icon-cab:before, +.uk-icon-taxi:before { + content: "\f1ba"; +} +.uk-icon-tree:before { + content: "\f1bb"; +} +.uk-icon-spotify:before { + content: "\f1bc"; +} +.uk-icon-deviantart:before { + content: "\f1bd"; +} +.uk-icon-soundcloud:before { + content: "\f1be"; +} +.uk-icon-database:before { + content: "\f1c0"; +} +.uk-icon-file-pdf-o:before { + content: "\f1c1"; +} +.uk-icon-file-word-o:before { + content: "\f1c2"; +} +.uk-icon-file-excel-o:before { + content: "\f1c3"; +} +.uk-icon-file-powerpoint-o:before { + content: "\f1c4"; +} +.uk-icon-file-photo-o:before, +.uk-icon-file-picture-o:before, +.uk-icon-file-image-o:before { + content: "\f1c5"; +} +.uk-icon-file-zip-o:before, +.uk-icon-file-archive-o:before { + content: "\f1c6"; +} +.uk-icon-file-sound-o:before, +.uk-icon-file-audio-o:before { + content: "\f1c7"; +} +.uk-icon-file-movie-o:before, +.uk-icon-file-video-o:before { + content: "\f1c8"; +} +.uk-icon-file-code-o:before { + content: "\f1c9"; +} +.uk-icon-vine:before { + content: "\f1ca"; +} +.uk-icon-codepen:before { + content: "\f1cb"; +} +.uk-icon-jsfiddle:before { + content: "\f1cc"; +} +.uk-icon-life-bouy:before, +.uk-icon-life-buoy:before, +.uk-icon-life-saver:before, +.uk-icon-support:before, +.uk-icon-life-ring:before { + content: "\f1cd"; +} +.uk-icon-circle-o-notch:before { + content: "\f1ce"; +} +.uk-icon-ra:before, +.uk-icon-rebel:before { + content: "\f1d0"; +} +.uk-icon-ge:before, +.uk-icon-empire:before { + content: "\f1d1"; +} +.uk-icon-git-square:before { + content: "\f1d2"; +} +.uk-icon-git:before { + content: "\f1d3"; +} +.uk-icon-hacker-news:before { + content: "\f1d4"; +} +.uk-icon-tencent-weibo:before { + content: "\f1d5"; +} +.uk-icon-qq:before { + content: "\f1d6"; +} +.uk-icon-wechat:before, +.uk-icon-weixin:before { + content: "\f1d7"; +} +.uk-icon-send:before, +.uk-icon-paper-plane:before { + content: "\f1d8"; +} +.uk-icon-send-o:before, +.uk-icon-paper-plane-o:before { + content: "\f1d9"; +} +.uk-icon-history:before { + content: "\f1da"; +} +.uk-icon-circle-thin:before { + content: "\f1db"; +} +.uk-icon-header:before { + content: "\f1dc"; +} +.uk-icon-paragraph:before { + content: "\f1dd"; +} +.uk-icon-sliders:before { + content: "\f1de"; +} +.uk-icon-share-alt:before { + content: "\f1e0"; +} +.uk-icon-share-alt-square:before { + content: "\f1e1"; +} +.uk-icon-bomb:before { + content: "\f1e2"; +} +.uk-icon-soccer-ball-o:before, +.uk-icon-futbol-o:before { + content: "\f1e3"; +} +.uk-icon-tty:before { + content: "\f1e4"; +} +.uk-icon-binoculars:before { + content: "\f1e5"; +} +.uk-icon-plug:before { + content: "\f1e6"; +} +.uk-icon-slideshare:before { + content: "\f1e7"; +} +.uk-icon-twitch:before { + content: "\f1e8"; +} +.uk-icon-yelp:before { + content: "\f1e9"; +} +.uk-icon-newspaper-o:before { + content: "\f1ea"; +} +.uk-icon-wifi:before { + content: "\f1eb"; +} +.uk-icon-calculator:before { + content: "\f1ec"; +} +.uk-icon-paypal:before { + content: "\f1ed"; +} +.uk-icon-google-wallet:before { + content: "\f1ee"; +} +.uk-icon-cc-visa:before { + content: "\f1f0"; +} +.uk-icon-cc-mastercard:before { + content: "\f1f1"; +} +.uk-icon-cc-discover:before { + content: "\f1f2"; +} +.uk-icon-cc-amex:before { + content: "\f1f3"; +} +.uk-icon-cc-paypal:before { + content: "\f1f4"; +} +.uk-icon-cc-stripe:before { + content: "\f1f5"; +} +.uk-icon-bell-slash:before { + content: "\f1f6"; +} +.uk-icon-bell-slash-o:before { + content: "\f1f7"; +} +.uk-icon-trash:before { + content: "\f1f8"; +} +.uk-icon-copyright:before { + content: "\f1f9"; +} +.uk-icon-at:before { + content: "\f1fa"; +} +.uk-icon-eyedropper:before { + content: "\f1fb"; +} +.uk-icon-paint-brush:before { + content: "\f1fc"; +} +.uk-icon-birthday-cake:before { + content: "\f1fd"; +} +.uk-icon-area-chart:before { + content: "\f1fe"; +} +.uk-icon-pie-chart:before { + content: "\f200"; +} +.uk-icon-line-chart:before { + content: "\f201"; +} +.uk-icon-lastfm:before { + content: "\f202"; +} +.uk-icon-lastfm-square:before { + content: "\f203"; +} +.uk-icon-toggle-off:before { + content: "\f204"; +} +.uk-icon-toggle-on:before { + content: "\f205"; +} +.uk-icon-bicycle:before { + content: "\f206"; +} +.uk-icon-bus:before { + content: "\f207"; +} +.uk-icon-ioxhost:before { + content: "\f208"; +} +.uk-icon-angellist:before { + content: "\f209"; +} +.uk-icon-cc:before { + content: "\f20a"; +} +.uk-icon-shekel:before, +.uk-icon-sheqel:before, +.uk-icon-ils:before { + content: "\f20b"; +} +.uk-icon-meanpath:before { + content: "\f20c"; +} +/* ======================================================================== + Component: Close + ========================================================================== */ +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-close::-moz-focus-inner { + border: 0; + padding: 0; +} +/* + * 1. Correct inability to style clickable `input` types in iOS. + * 2. Remove margins in Chrome, Safari and Opera. + * 3. Remove borders for `button`. + * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. + * 5. Correct `font` properties and `color` not being inherited for `button`. + * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE + * 7. Remove default `button` padding and background color + * 8. Style + */ +.uk-close { + /* 1 */ + -webkit-appearance: none; + /* 2 */ + margin: 0; + /* 3 */ + border: none; + /* 4 */ + overflow: visible; + /* 5 */ + font: inherit; + color: inherit; + /* 6 */ + text-transform: none; + /* 7. */ + padding: 0; + background: transparent; + /* 8 */ + display: inline-block; + -moz-box-sizing: content-box; + box-sizing: content-box; + width: 20px; + line-height: 20px; + text-align: center; + vertical-align: middle; + opacity: 0.3; +} +/* Icon */ +.uk-close:after { + display: block; + content: "\f00d"; + font-family: FontAwesome; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + * 3. Required for `a` elements + */ +.uk-close:hover, +.uk-close:focus { + opacity: 0.5; + /* 2 */ + outline: none; + /* 3 */ + color: inherit; + text-decoration: none; + cursor: pointer; +} +/* Modifier + ========================================================================== */ +.uk-close-alt { + padding: 2px; + border-radius: 50%; + background: #eeeeee; + opacity: 1; +} +/* Hover */ +.uk-close-alt:hover, +.uk-close-alt:focus { + opacity: 1; +} +/* Icon */ +.uk-close-alt:after { + opacity: 0.5; +} +.uk-close-alt:hover:after, +.uk-close-alt:focus:after { + opacity: 0.8; +} +/* ======================================================================== + Component: Badge + ========================================================================== */ +.uk-badge { + display: inline-block; + padding: 0 5px; + background: #00a8e6; + font-size: 10px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-align: center; + vertical-align: middle; + text-transform: none; +} +/* + * Keep color when badge is a link + */ +a.uk-badge:hover { + color: #ffffff; +} +/* Modifier: `uk-badge-notification`; + ========================================================================== */ +.uk-badge-notification { + -moz-box-sizing: border-box; + box-sizing: border-box; + min-width: 18px; + border-radius: 500px; + font-size: 12px; + line-height: 18px; +} +/* Color modifier + ========================================================================== */ +/* + * Modifier: `uk-badge-success` + */ +.uk-badge-success { + background-color: #8cc14c; +} +/* + * Modifier: `uk-badge-warning` + */ +.uk-badge-warning { + background-color: #faa732; +} +/* + * Modifier: `uk-badge-danger` + */ +.uk-badge-danger { + background-color: #da314b; +} +/* ======================================================================== + Component: Alert + ========================================================================== */ +.uk-alert { + margin-bottom: 15px; + padding: 10px; + background: #ebf7fd; + color: #2d7091; +} +/* + * Add margin if adjacent element + */ +* + .uk-alert { + margin-top: 15px; +} +/* + * Remove margin from the last-child + */ +.uk-alert > :last-child { + margin-bottom: 0; +} +/* + * Keep color for headings if the default heading color is changed + */ +.uk-alert h1, +.uk-alert h2, +.uk-alert h3, +.uk-alert h4, +.uk-alert h5, +.uk-alert h6 { + color: inherit; +} +/* Close in alert + ========================================================================== */ +.uk-alert > .uk-close:first-child { + float: right; +} +/* + * Remove margin from adjacent element + */ +.uk-alert > .uk-close:first-child + * { + margin-top: 0; +} +/* Modifier: `uk-alert-success` + ========================================================================== */ +.uk-alert-success { + background: #f2fae3; + color: #659f13; +} +/* Modifier: `uk-alert-warning` + ========================================================================== */ +.uk-alert-warning { + background: #fffceb; + color: #e28327; +} +/* Modifier: `uk-alert-danger` + ========================================================================== */ +.uk-alert-danger { + background: #fff1f0; + color: #d85030; +} +/* Modifier: `uk-alert-large` + ========================================================================== */ +.uk-alert-large { + padding: 20px; +} +.uk-alert-large > .uk-close:first-child { + margin: -10px -10px 0 0; +} +/* ======================================================================== + Component: Thumbnail + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Responsive behavior + * 3. Corrects `max-width` behavior sed + * 4. Required for `figure` element + * 5. Style + */ +.uk-thumbnail { + /* 1 */ + display: inline-block; + /* 2 */ + max-width: 100%; + /* 3 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 3 */ + margin: 0; + /* 4 */ + padding: 4px; + border: 1px solid #dddddd; + background: #ffffff; +} +/* + * Hover state for `a` elements + * 1. Apply hover style also to focus state + * 2. Needed for caption + * 3. Remove default focus style + */ +a.uk-thumbnail:hover, +a.uk-thumbnail:focus { + border-color: #aaaaaa; + background-color: #ffffff; + /* 2 */ + text-decoration: none; + /* 3 */ + outline: none; +} +/* Caption + ========================================================================== */ +.uk-thumbnail-caption { + padding-top: 4px; + text-align: center; + color: #444444; +} +/* Sizes + ========================================================================== */ +.uk-thumbnail-mini { + width: 150px; +} +.uk-thumbnail-small { + width: 200px; +} +.uk-thumbnail-medium { + width: 300px; +} +.uk-thumbnail-large { + width: 400px; +} +.uk-thumbnail-expand, +.uk-thumbnail-expand > img { + width: 100%; +} +/* ======================================================================== + Component: Overlay + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Create position context + * 3. Set max-width for responsive images to prevent `inline-block` consequences + * 4. Remove the gap between the container and its child element + * 5. Fixed wrong scaling calculation for images in Chrome + */ +.uk-overlay { + /* 1 */ + display: inline-block; + /* 2 */ + position: relative; + /* 3 */ + max-width: 100%; + /* 4 */ + vertical-align: middle; + /* 5 */ + overflow: hidden; +} +/* + * Remove margin from content + */ +.uk-overlay > :first-child { + margin-bottom: 0; +} +/* Sub-object `uk-overlay-area` + ========================================================================== */ +/* + * 1. Set position + * 2. Set style + * 3. Fade-in transition + */ +.uk-overlay-area { + /* 1 */ + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + background: rgba(0, 0, 0, 0.3); + /* 3 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + -webkit-transform: translate3d(0, 0, 0); +} +/* + * Hover + * 1. `uk-hover` to support touch devices + * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier + */ +.uk-overlay:hover .uk-overlay-area, +.uk-overlay.uk-hover .uk-overlay-area, +.uk-overlay-toggle:hover .uk-overlay-area, +.uk-overlay-toggle.uk-hover .uk-overlay-area { + opacity: 1; +} +/* + * Icon + */ +.uk-overlay-area:empty:before { + content: "\f002"; + position: absolute; + top: 50%; + left: 50%; + width: 50px; + height: 50px; + margin-top: -25px; + margin-left: -25px; + font-size: 50px; + line-height: 1; + font-family: FontAwesome; + text-align: center; + color: #ffffff; +} +/* Sub-object `uk-overlay-area-content` + ========================================================================== */ +/* + * Remove whitespace between child elements when using `inline-block` + * Needed for Firefox + */ +.uk-overlay-area:not(:empty) { + font-size: 0.001px; +} +/* + * 1. Needed for vertical alignment + */ +.uk-overlay-area:not(:empty):before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +/* + * 1. Set vertical alignment + * 2. Reset whitespace hack + * 3. Set horizontal alignment + * 4. Set style + */ +.uk-overlay-area-content { + /* 1 */ + display: inline-block; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + vertical-align: middle; + /* 2 */ + font-size: 1rem; + /* 3 */ + text-align: center; + /* 4 */ + padding: 0 15px; + color: #ffffff; +} +/* + * Remove margin from the last-child + */ +.uk-overlay-area-content > :last-child { + margin-bottom: 0; +} +/* + * Links in overlay area + */ +.uk-overlay-area-content a:not([class]), +.uk-overlay-area-content a:not([class]):hover { + color: inherit; +} +/* Sub-object `uk-overlay-caption` + ========================================================================== */ +/* + * 1. Set position + * 2. Set style + * 3. Fade-in transition + */ +.uk-overlay-caption { + /* 1 */ + position: absolute; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + padding: 15px; + background: rgba(0, 0, 0, 0.5); + color: #ffffff; + /* 3 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + -webkit-transform: translate3d(0, 0, 0); +} +/* + * Hover + * 1. `uk-hover` to support touch devices + * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier + */ +.uk-overlay:hover .uk-overlay-caption, +.uk-overlay.uk-hover .uk-overlay-caption, +.uk-overlay-toggle:hover .uk-overlay-caption, +.uk-overlay-toggle.uk-hover .uk-overlay-caption { + opacity: 1; +} +/* ======================================================================== + Component: Progress + ========================================================================== */ +/* + * 1. Clearing + * 2. Vertical alignment if text is used + */ +.uk-progress { + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 20px; + margin-bottom: 15px; + background: #eeeeee; + /* 1 */ + overflow: hidden; + /* 2 */ + line-height: 20px; +} +/* + * Add margin if adjacent element + */ +* + .uk-progress { + margin-top: 15px; +} +/* Sub-object: `uk-progress-bar` + ========================================================================== */ +/* + * 1. Transition + * 2. Needed for text + */ +.uk-progress-bar { + width: 0; + height: 100%; + background: #00a8e6; + float: left; + /* 1 */ + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; + /* 2 */ + font-size: 12px; + color: #ffffff; + text-align: center; +} +/* Size modifiers + ========================================================================== */ +/* Mini */ +.uk-progress-mini { + height: 6px; +} +/* Small */ +.uk-progress-small { + height: 12px; +} +/* Color modifiers + ========================================================================== */ +.uk-progress-success .uk-progress-bar { + background-color: #8cc14c; +} +.uk-progress-warning .uk-progress-bar { + background-color: #faa732; +} +.uk-progress-danger .uk-progress-bar { + background-color: #da314b; +} +/* Modifier: `uk-progress-striped` + ========================================================================== */ +.uk-progress-striped .uk-progress-bar { + 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: 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-size: 30px 30px; +} +/* + * Animation + */ +.uk-progress-striped.uk-active .uk-progress-bar { + -webkit-animation: uk-progress-bar-stripes 2s linear infinite; + animation: uk-progress-bar-stripes 2s linear infinite; +} +@-webkit-keyframes uk-progress-bar-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 30px 0; + } +} +@keyframes uk-progress-bar-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 30px 0; + } +} +/* ======================================================================== + Component: Animation + ========================================================================== */ +[class*='uk-animation-'] { + -webkit-animation-duration: 0.5s; + animation-duration: 0.5s; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +/* Hide animated element if scrollspy is used */ +@media screen { + [data-uk-scrollspy*='uk-animation-'] { + opacity: 0; + } +} +/* + * Fade + * Higher specificity (!important) needed because of reverse modifier + */ +.uk-animation-fade { + -webkit-animation-name: uk-fade; + animation-name: uk-fade; + -webkit-animation-duration: 0.8s; + animation-duration: 0.8s; + -webkit-animation-timing-function: linear !important; + animation-timing-function: linear !important; +} +/* + * Fade with scale + */ +.uk-animation-scale-up { + -webkit-animation-name: uk-fade-scale-02; + animation-name: uk-fade-scale-02; +} +.uk-animation-scale-down { + -webkit-animation-name: uk-fade-scale-18; + animation-name: uk-fade-scale-18; +} +/* + * Fade with slide + */ +.uk-animation-slide-top { + -webkit-animation-name: uk-fade-top; + animation-name: uk-fade-top; +} +.uk-animation-slide-bottom { + -webkit-animation-name: uk-fade-bottom; + animation-name: uk-fade-bottom; +} +.uk-animation-slide-left { + -webkit-animation-name: uk-fade-left; + animation-name: uk-fade-left; +} +.uk-animation-slide-right { + -webkit-animation-name: uk-fade-right; + animation-name: uk-fade-right; +} +/* + * Scale + */ +.uk-animation-scale { + -webkit-animation-name: uk-scale-12; + animation-name: uk-scale-12; +} +/* + * Shake + */ +.uk-animation-shake { + -webkit-animation-name: uk-shake; + animation-name: uk-shake; +} +/* Direction modifiers + ========================================================================== */ +.uk-animation-reverse { + -webkit-animation-direction: reverse; + animation-direction: reverse; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +/* Duration modifiers +========================================================================== */ +.uk-animation-10 { + -webkit-animation-duration: 10s; + animation-duration: 10s; +} +/* Origin modifiers +========================================================================== */ +.uk-animation-top-left { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.uk-animation-top-center { + -webkit-transform-origin: 50% 0; + transform-origin: 50% 0; +} +.uk-animation-top-right { + -webkit-transform-origin: 100% 0; + transform-origin: 100% 0; +} +.uk-animation-middle-left { + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; +} +.uk-animation-middle-right { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; +} +.uk-animation-bottom-left { + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; +} +.uk-animation-bottom-center { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; +} +.uk-animation-bottom-right { + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} +/* Keyframes: Fade + * Used by dropdown, datepicker and slideshow component + ========================================================================== */ +@-webkit-keyframes uk-fade { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes uk-fade { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +/* Keyframes: Fade with slide + ========================================================================== */ +/* + * Top + */ +@-webkit-keyframes uk-fade-top { + 0% { + opacity: 0; + -webkit-transform: translateY(-100%); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-fade-top { + 0% { + opacity: 0; + transform: translateY(-100%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* + * Bottom + */ +@-webkit-keyframes uk-fade-bottom { + 0% { + opacity: 0; + -webkit-transform: translateY(100%); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-fade-bottom { + 0% { + opacity: 0; + transform: translateY(100%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* + * Left + */ +@-webkit-keyframes uk-fade-left { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@keyframes uk-fade-left { + 0% { + opacity: 0; + transform: translateX(-100%); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +/* + * Right + */ +@-webkit-keyframes uk-fade-right { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@keyframes uk-fade-right { + 0% { + opacity: 0; + transform: translateX(100%); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +/* Keyframes: Fade with scale + ========================================================================== */ +/* + * Scale by 0.2 + */ +@-webkit-keyframes uk-fade-scale-02 { + 0% { + opacity: 0; + -webkit-transform: scale(0.2); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} +@keyframes uk-fade-scale-02 { + 0% { + opacity: 0; + transform: scale(0.2); + } + 100% { + opacity: 1; + transform: scale(1); + } +} +/* + * Scale by 1.5 + * Used by slideshow component + */ +@-webkit-keyframes uk-fade-scale-15 { + 0% { + opacity: 0; + -webkit-transform: scale(1.5); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} +@keyframes uk-fade-scale-15 { + 0% { + opacity: 0; + transform: scale(1.5); + } + 100% { + opacity: 1; + transform: scale(1); + } +} +/* + * Scale by 1.8 + */ +@-webkit-keyframes uk-fade-scale-18 { + 0% { + opacity: 0; + -webkit-transform: scale(1.8); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} +@keyframes uk-fade-scale-18 { + 0% { + opacity: 0; + transform: scale(1.8); + } + 100% { + opacity: 1; + transform: scale(1); + } +} +/* Keyframes: Slide + * Used by slideshow component + ========================================================================== */ +/* + * Left + */ +@-webkit-keyframes uk-slide-left { + 0% { + -webkit-transform: translateX(-100%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-left { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(0); + } +} +/* + * Right + */ +@-webkit-keyframes uk-slide-right { + 0% { + -webkit-transform: translateX(100%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-right { + 0% { + transform: translateX(100%); + } + 100% { + transform: translateX(0); + } +} +/* + * Left third + */ +@-webkit-keyframes uk-slide-left-33 { + 0% { + -webkit-transform: translateX(33%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-left-33 { + 0% { + transform: translateX(33%); + } + 100% { + transform: translateX(0); + } +} +/* + * Right third + */ +@-webkit-keyframes uk-slide-right-33 { + 0% { + -webkit-transform: translateX(-33%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-right-33 { + 0% { + transform: translateX(-33%); + } + 100% { + transform: translateX(0); + } +} +/* Keyframes: Scale + ========================================================================== */ +@-webkit-keyframes uk-scale-12 { + 0% { + -webkit-transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + } +} +@keyframes uk-scale-12 { + 0% { + transform: scale(1.2); + } + 100% { + transform: scale(1); + } +} +/* Keyframes: Rotate + * Used by icon and search component + ========================================================================== */ +@-webkit-keyframes uk-rotate { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@keyframes uk-rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* Keyframes: Shake + ========================================================================== */ +@-webkit-keyframes uk-shake { + 0%, + 100% { + -webkit-transform: translateX(0); + } + 10% { + -webkit-transform: translateX(-9px); + } + 20% { + -webkit-transform: translateX(8px); + } + 30% { + -webkit-transform: translateX(-7px); + } + 40% { + -webkit-transform: translateX(6px); + } + 50% { + -webkit-transform: translateX(-5px); + } + 60% { + -webkit-transform: translateX(4px); + } + 70% { + -webkit-transform: translateX(-3px); + } + 80% { + -webkit-transform: translateX(2px); + } + 90% { + -webkit-transform: translateX(-1px); + } +} +@keyframes uk-shake { + 0%, + 100% { + transform: translateX(0); + } + 10% { + transform: translateX(-9px); + } + 20% { + transform: translateX(8px); + } + 30% { + transform: translateX(-7px); + } + 40% { + transform: translateX(6px); + } + 50% { + transform: translateX(-5px); + } + 60% { + transform: translateX(4px); + } + 70% { + transform: translateX(-3px); + } + 80% { + transform: translateX(2px); + } + 90% { + transform: translateX(-1px); + } +} +/* Keyframes: Fade with slide fixed + * Used by dropdown and search component + ========================================================================== */ +/* + * Top fixed + */ +@-webkit-keyframes uk-slide-top-fixed { + 0% { + opacity: 0; + -webkit-transform: translateY(-10px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-slide-top-fixed { + 0% { + opacity: 0; + transform: translateY(-10px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* + * Bottom fixed + */ +@-webkit-keyframes uk-slide-bottom-fixed { + 0% { + opacity: 0; + -webkit-transform: translateY(10px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-slide-bottom-fixed { + 0% { + opacity: 0; + transform: translateY(10px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* ======================================================================== + Component: Dropdown + ========================================================================== */ +/* + * 1. Hide by default + * 2. Set position + * 3. Box-sizing is needed for `uk-dropdown-justify` + * 4. Set style + * 5. Reset button group whitespace hack + */ +.uk-dropdown { + /* 1 */ + display: none; + /* 2 */ + position: absolute; + top: 100%; + left: 0; + z-index: 1020; + /* 3 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 4 */ + width: 200px; + margin-top: 5px; + padding: 15px; + background: #f5f5f5; + color: #444444; + /* 5 */ + font-size: 1rem; + vertical-align: top; +} +/* + * 1. Show dropdown + * 2. Set animation + * 3. Needed for scale animation + */ +.uk-open > .uk-dropdown { + /* 1 */ + display: block; + /* 2 */ + -webkit-animation: uk-fade 0.2s ease-in-out; + animation: uk-fade 0.2s ease-in-out; + /* 3 */ + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +/* Alignment modifiers + ========================================================================== */ +/* + * Modifier `uk-dropdown-flip` + */ +.uk-dropdown-flip { + left: auto; + right: 0; +} +/* + * Modifier `uk-dropdown-up` + */ +.uk-dropdown-up { + top: auto; + bottom: 100%; + margin-top: auto; + margin-bottom: 5px; +} +/* Nav in dropdown + ========================================================================== */ +.uk-dropdown .uk-nav { + margin: 0 -15px; +} +/* Grid and panel in dropdown + ========================================================================== */ +/* +* Vertical gutter +*/ +/* + * Grid + * Higher specificity to override large gutter + */ +.uk-grid .uk-dropdown-grid + .uk-dropdown-grid { + margin-top: 15px; +} +/* Panels */ +.uk-dropdown-grid > [class*='uk-width-'] > .uk-panel + .uk-panel { + margin-top: 15px; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + /* + * Horizontal gutter + */ + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid { + margin-left: -15px; + margin-right: -15px; + } + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-'] { + padding-left: 15px; + padding-right: 15px; + } + /* + * Column divider + */ + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + border-left: 1px solid #dddddd; + } + /* + * Width multiplier for dropdown columns + */ + .uk-dropdown-width-2:not(.uk-dropdown-stack) { + width: 400px; + } + .uk-dropdown-width-3:not(.uk-dropdown-stack) { + width: 600px; + } + .uk-dropdown-width-4:not(.uk-dropdown-stack) { + width: 800px; + } + .uk-dropdown-width-5:not(.uk-dropdown-stack) { + width: 1000px; + } +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + /* + * Stack columns and take full width + */ + .uk-dropdown-grid > [class*='uk-width-'] { + width: 100%; + } + /* + * Vertical gutter + */ + .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + margin-top: 15px; + } +} +/* +* Stack grid columns +*/ +.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-'] { + width: 100%; +} +.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + margin-top: 15px; +} +/* Modifier `uk-dropdown-small` + ========================================================================== */ +/* + * Set min-width and text expands dropdown if needed + */ +.uk-dropdown-small { + min-width: 150px; + width: auto; + padding: 5px; + white-space: nowrap; +} +/* + * Nav in dropdown + */ +.uk-dropdown-small .uk-nav { + margin: 0 -5px; +} +/* Modifier: `uk-dropdown-navbar` + ========================================================================== */ +.uk-dropdown-navbar { + margin-top: 0; + background: #f5f5f5; + color: #444444; +} +.uk-open > .uk-dropdown-navbar { + -webkit-animation: uk-slide-top-fixed 0.2s ease-in-out; + animation: uk-slide-top-fixed 0.2s ease-in-out; +} +/* Modifier `uk-dropdown-scrollable` + ========================================================================== */ +/* + * Usefull for long lists + */ +.uk-dropdown-scrollable { + overflow-y: auto; + max-height: 200px; +} +/* ======================================================================== + Component: Modal + ========================================================================== */ +/* + * This is the modal overlay and modal dialog container + * 1. Hide by default + * 2. Set fixed position + * 3. Allow scrolling for the modal dialog + * 4. Mask the background page + * 5. Fade-in transition + */ +.uk-modal { + /* 1 */ + display: none; + /* 2 */ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1010; + /* 3 */ + overflow-y: auto; + -webkit-overflow-scrolling: touch; + /* 4 */ + background: rgba(0, 0, 0, 0.6); + /* 5 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +/* + * Open state + */ +.uk-modal.uk-open { + opacity: 1; +} +/* + * Prevents duplicated scrollbar caused by 4. + */ +.uk-modal-page, +.uk-modal-page body { + overflow: hidden; +} +/* Sub-object: `uk-modal-dialog` + ========================================================================== */ +/* + * 1. Create position context for `uk-modal-dialog-frameless` + * 2. Set box sizing + * 3. Set style + * 4. Slide-in transition + */ +.uk-modal-dialog { + /* 1 */ + position: relative; + /* 2 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + margin: 50px auto; + padding: 20px; + width: 600px; + max-width: 100%; + max-width: calc(100% - 20px); + /* 3 */ + background: #ffffff; + /* 4 */ + opacity: 0; + -webkit-transform: translateY(-100px); + transform: translateY(-100px); + -webkit-transition: opacity 0.3s linear, -webkit-transform 0.3s ease-out; + transition: opacity 0.3s linear, transform 0.3s ease-out; +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + /* + * Fit in small screen + */ + .uk-modal-dialog { + width: auto; + margin: 10px; + } +} +/* + * Open state + */ +.uk-open .uk-modal-dialog { + /* 4 */ + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); +} +/* + * Remove margin from the last-child + */ +.uk-modal-dialog > :last-child { + margin-bottom: 0; +} +/* Close in modal + ========================================================================== */ +.uk-modal-dialog > .uk-close:first-child { + margin: -10px -10px 0 0; + float: right; +} +/* + * Remove margin from adjacent element + */ +.uk-modal-dialog > .uk-close:first-child + * { + margin-top: 0; +} +/* Modifier: `uk-modal-dialog-frameless` + ========================================================================== */ +.uk-modal-dialog-frameless { + padding: 0; +} +/* + * Close in modal + */ +.uk-modal-dialog-frameless > .uk-close:first-child { + position: absolute; + top: -12px; + right: -12px; + margin: 0; + float: none; +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + .uk-modal-dialog-frameless > .uk-close:first-child { + top: -7px; + right: -7px; + } +} +/* Modifier: `uk-modal-dialog-large` + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-modal-dialog-large { + width: 930px; + } +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-modal-dialog-large { + width: 1130px; + } +} +/* ======================================================================== + Component: Off-canvas + ========================================================================== */ +/* + * This is the offcanvas overlay and bar container + * 1. Hide by default + * 2. Set fixed position + * 3. Mask the background page + */ +.uk-offcanvas { + /* 1 */ + display: none; + /* 2 */ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + /* 3 */ + background: rgba(0, 0, 0, 0.1); +} +.uk-offcanvas.uk-active { + display: block; +} +/* Sub-object `uk-offcanvas-page` + ========================================================================== */ +/* + * Prepares the whole HTML page to slide-out + * 1. Fix the main page and disallow scrolling + * 2. Side-out transition + */ +.uk-offcanvas-page { + /* 1 */ + position: fixed; + /* 2 */ + -webkit-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; +} +/* Sub-object `uk-offcanvas-bar` + ========================================================================== */ +/* + * This is the offcanvas bar + * 1. Set fixed position + * 2. Size and style + * 3. Allow scrolling + * 4. Side-out transition + */ +.uk-offcanvas-bar { + /* 1 */ + position: fixed; + top: 0; + bottom: 0; + left: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + z-index: 1001; + /* 2 */ + width: 270px; + max-width: 100%; + background: #333333; + /* 3 */ + overflow-y: auto; + -webkit-overflow-scrolling: touch; + /* 4 */ + -webkit-transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; +} +.uk-offcanvas.uk-active .uk-offcanvas-bar.uk-offcanvas-bar-show { + -webkit-transform: translateX(0%); + transform: translateX(0%); +} +/* Modifier `uk-offcanvas-bar-flip` + ========================================================================== */ +.uk-offcanvas-bar-flip { + left: auto; + right: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); +} +/* Panel in offcanvas + ========================================================================== */ +.uk-offcanvas .uk-panel { + margin: 20px 15px; + color: #777777; +} +.uk-offcanvas .uk-panel-title { + color: #cccccc; +} +.uk-offcanvas .uk-panel a:not([class]) { + color: #cccccc; +} +.uk-offcanvas .uk-panel a:not([class]):hover { + color: #ffffff; +} +/* ======================================================================== + Component: Switcher + ========================================================================== */ +.uk-switcher { + margin: 0; + padding: 0; + list-style: none; +} +/* + * Items + */ +.uk-switcher > *:not(.uk-active) { + display: none; +} +/* ======================================================================== + Component: Tooltip + ========================================================================== */ +/* + * 1. Hide by default + * 2. Set fixed position + * 3. Set dimensions + * 4. Set style + */ +.uk-tooltip { + /* 1 */ + display: none; + /* 2 */ + position: absolute; + z-index: 1030; + /* 3 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 200px; + padding: 5px 8px; + /* 4 */ + background: #333333; + color: rgba(255, 255, 255, 0.7); + font-size: 12px; + line-height: 18px; + text-align: center; +} +/* Triangle + ========================================================================== */ +/* + * 1. Dashed is less antialised than solid + */ +.uk-tooltip:after { + content: ""; + display: block; + position: absolute; + width: 0; + height: 0; + /* 1 */ + border: 5px dashed #333333; +} +/* Direction modifiers + ========================================================================== */ +/* + * Top + */ +.uk-tooltip-top:after, +.uk-tooltip-top-left:after, +.uk-tooltip-top-right:after { + bottom: -5px; + border-top-style: solid; + border-bottom: none; + border-left-color: transparent; + border-right-color: transparent; + border-top-color: #333333; +} +/* + * Bottom + */ +.uk-tooltip-bottom:after, +.uk-tooltip-bottom-left:after, +.uk-tooltip-bottom-right:after { + top: -5px; + border-bottom-style: solid; + border-top: none; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-color: #333333; +} +/* + * Top/Bottom center + */ +.uk-tooltip-top:after, +.uk-tooltip-bottom:after { + left: 50%; + margin-left: -5px; +} +/* + * Top/Bottom left + */ +.uk-tooltip-top-left:after, +.uk-tooltip-bottom-left:after { + left: 10px; +} +/* + * Top/Bottom right + */ +.uk-tooltip-top-right:after, +.uk-tooltip-bottom-right:after { + right: 10px; +} +/* + * Left + */ +.uk-tooltip-left:after { + right: -5px; + top: 50%; + margin-top: -5px; + border-left-style: solid; + border-right: none; + border-top-color: transparent; + border-bottom-color: transparent; + border-left-color: #333333; +} +/* + * Right + */ +.uk-tooltip-right:after { + left: -5px; + top: 50%; + margin-top: -5px; + border-right-style: solid; + border-left: none; + border-top-color: transparent; + border-bottom-color: transparent; + border-right-color: #333333; +} +/* ======================================================================== + Component: Text + ========================================================================== */ +/* Size modifiers + ========================================================================== */ +.uk-text-small { + font-size: 11px; + line-height: 16px; +} +.uk-text-large { + font-size: 18px; + line-height: 24px; + font-weight: normal; +} +/* Weight modifiers + ========================================================================== */ +.uk-text-bold { + font-weight: bold; +} +/* Color modifiers + ========================================================================== */ +.uk-text-muted { + color: #999999 !important; +} +.uk-text-primary { + color: #2d7091 !important; +} +.uk-text-success { + color: #659f13 !important; +} +.uk-text-warning { + color: #e28327 !important; +} +.uk-text-danger { + color: #d85030 !important; +} +/* Alignment modifiers + ========================================================================== */ +.uk-text-left { + text-align: left !important; +} +.uk-text-right { + text-align: right !important; +} +.uk-text-center { + text-align: center !important; +} +.uk-text-justify { + text-align: justify !important; +} +.uk-text-top { + vertical-align: top !important; +} +.uk-text-middle { + vertical-align: middle !important; +} +.uk-text-bottom { + vertical-align: bottom !important; +} +/* Only tablets portrait */ +@media (max-width: 959px) { + .uk-text-center-medium { + text-align: center !important; + } +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + .uk-text-center-small { + text-align: center !important; + } +} +/* Wrap modifiers + ========================================================================== */ +/* + * Prevent text from wrapping onto multiple lines + */ +.uk-text-nowrap { + white-space: nowrap; +} +/* + * Prevent text from wrapping onto multiple lines, and truncate with an ellipsis + */ +.uk-text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* + * Break strings if their length exceeds the width of their container + */ +.uk-text-break { + word-wrap: break-word; + -webkit-hyphens: auto; + -ms-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +} +/* ======================================================================== + Component: Utility + ========================================================================== */ +/* Container + ========================================================================== */ +.uk-container { + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 980px; + padding: 0 25px; +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-container { + max-width: 1200px; + padding: 0 35px; + } +} +/* + * Micro clearfix + */ +.uk-container:before, +.uk-container:after { + content: " "; + display: table; +} +.uk-container:after { + clear: both; +} +/* + * Center container + */ +.uk-container-center { + margin-left: auto; + margin-right: auto; +} +/* Clearing + ========================================================================== */ +/* + * Micro clearfix + */ +.uk-clearfix:before, +.uk-clearfix:after { + content: " "; + display: table; +} +.uk-clearfix:after { + clear: both; +} +/* + * Create a new block formatting context + */ +.uk-nbfc { + overflow: hidden; +} +.uk-nbfc-alt { + display: table-cell; + width: 10000px; +} +/* Alignment of block elements + ========================================================================== */ +/* + * Float blocks + * 1. Prevent content overflow on small devices + */ +.uk-float-left { + float: left; +} +.uk-float-right { + float: right; +} +/* 1 */ +[class*='uk-float-'] { + max-width: 100%; +} +/* Alignment of images and objects + ========================================================================== */ +/* + * Alignment + */ +[class*='uk-align-'] { + display: block; + margin-bottom: 15px; +} +.uk-align-left { + margin-right: 15px; + float: left; +} +.uk-align-right { + margin-left: 15px; + float: right; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-align-medium-left { + margin-right: 15px; + margin-bottom: 15px; + float: left; + } + .uk-align-medium-right { + margin-left: 15px; + margin-bottom: 15px; + float: right; + } +} +.uk-align-center { + margin-left: auto; + margin-right: auto; +} +/* Vertical alignment + ========================================================================== */ +/* + * Remove whitespace between child elements when using `inline-block` + */ +.uk-vertical-align { + font-size: 0.001px; +} +/* + * The `uk-vertical-align` container needs a specific height + */ +.uk-vertical-align:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +/* + * Sub-object which can have any height + * 1. Reset whitespace hack + */ +.uk-vertical-align-middle, +.uk-vertical-align-bottom { + display: inline-block; + max-width: 100%; + /* 1 */ + font-size: 1rem; +} +.uk-vertical-align-middle { + vertical-align: middle; +} +.uk-vertical-align-bottom { + vertical-align: bottom; +} +/* Height + ========================================================================== */ +/* + * More robust if padding and border are used + */ +[class*='uk-height'] { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* + * Useful to extend the `html` and `body` element to the full height of the page. + */ +.uk-height-1-1 { + height: 100%; +} +/* + * Useful to create image teasers + */ +.uk-height-viewport { + height: 100vh; + min-height: 600px; +} +/* Responsive objects + * Note: Images are already responsive by default, see Base component + ========================================================================== */ +/* + * 1. Corrects `max-width` and `max-height` behavior if padding and border are used + */ +.uk-responsive-width, +.uk-responsive-height { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* + * Responsiveness: Sets a maximum width relative to the parent and auto scales the height + */ +.uk-responsive-width { + max-width: 100%; + height: auto; +} +/* + * Responsiveness: Sets a maximum height relative to the parent and auto scales the width + * Only works if the parent element has a fixed height. + */ +.uk-responsive-height { + max-height: 100%; + width: auto; +} +/* Margin + ========================================================================== */ +/* + * Create a block with the same margin of a paragraph + * Add margin if adjacent element + */ +.uk-margin { + margin-bottom: 15px; +} +* + .uk-margin { + margin-top: 15px; +} +.uk-margin-top { + margin-top: 15px !important; +} +.uk-margin-bottom { + margin-bottom: 15px !important; +} +.uk-margin-left { + margin-left: 15px !important; +} +.uk-margin-right { + margin-right: 15px !important; +} +/* + * Larger margins + */ +.uk-margin-large { + margin-bottom: 50px; +} +* + .uk-margin-large { + margin-top: 50px; +} +.uk-margin-large-top { + margin-top: 50px !important; +} +.uk-margin-large-bottom { + margin-bottom: 50px !important; +} +.uk-margin-large-left { + margin-left: 50px !important; +} +.uk-margin-large-right { + margin-right: 50px !important; +} +/* + * Smaller margins + */ +.uk-margin-small { + margin-bottom: 5px; +} +* + .uk-margin-small { + margin-top: 5px; +} +.uk-margin-small-top { + margin-top: 5px !important; +} +.uk-margin-small-bottom { + margin-bottom: 5px !important; +} +.uk-margin-small-left { + margin-left: 5px !important; +} +.uk-margin-small-right { + margin-right: 5px !important; +} +/* + * Remove margins + */ +.uk-margin-remove { + margin: 0 !important; +} +.uk-margin-top-remove { + margin-top: 0 !important; +} +.uk-margin-bottom-remove { + margin-bottom: 0 !important; +} +/* Border + ========================================================================== */ +.uk-border-circle { + border-radius: 50%; +} +.uk-border-rounded { + border-radius: 5px; +} +/* Headings + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-heading-large { + font-size: 52px; + line-height: 64px; + } +} +/* Link + ========================================================================== */ +/* + * Let links appear in default text color + */ +.uk-link-muted, +.uk-link-muted a { + color: #444444; +} +.uk-link-muted:hover, +.uk-link-muted a:hover { + color: #444444; +} +/* + * Reset link style + */ +.uk-link-reset, +.uk-link-reset a, +.uk-link-reset:hover, +.uk-link-reset a:hover { + color: inherit; + text-decoration: none; +} +/* Scrollable + ========================================================================== */ +/* + * Enable scrolling for preformatted text + */ +.uk-scrollable-text { + height: 300px; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + resize: both; +} +/* + * Box with scrolling enabled + */ +.uk-scrollable-box { + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 170px; + padding: 10px; + border: 1px solid #dddddd; + overflow: auto; + -webkit-overflow-scrolling: touch; + resize: both; +} +.uk-scrollable-box > :last-child { + margin-bottom: 0; +} +/* Overflow + ========================================================================== */ +/* + * Enable scrollbars if content is clipped + */ +.uk-overflow-container { + overflow: auto; + -webkit-overflow-scrolling: touch; +} +.uk-overflow-container > :last-child { + margin-bottom: 0; +} +/* Position + ========================================================================== */ +.uk-position-absolute { + position: absolute !important; +} +.uk-position-relative { + position: relative !important; +} +.uk-position-cover { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +/* Display + ========================================================================== */ +/* + * Display + */ +.uk-display-block { + display: block !important; +} +.uk-display-inline { + display: inline !important; +} +.uk-display-inline-block { + display: inline-block !important; +} +/* + * Visibility + * Avoids setting display to `block` so it works also with `inline-block` and `table` + */ +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-visible-small { + display: none !important; + } + .uk-visible-medium { + display: none !important; + } + .uk-hidden-large { + display: none !important; + } +} +/* Tablets portrait */ +@media (min-width: 768px) and (max-width: 959px) { + .uk-visible-small { + display: none !important; + } + .uk-visible-large { + display: none !important ; + } + .uk-hidden-medium { + display: none !important; + } +} +/* Phone landscape and smaller*/ +@media (max-width: 767px) { + .uk-visible-medium { + display: none !important; + } + .uk-visible-large { + display: none !important; + } + .uk-hidden-small { + display: none !important; + } +} +/* Remove from the flow and screen readers on any device */ +.uk-hidden { + display: none !important; + visibility: hidden !important; +} +/* It's hidden, but still affects layout */ +.uk-invisible { + visibility: hidden !important; +} +/* Show on hover */ +.uk-visible-hover:hover .uk-hidden, +.uk-visible-hover:hover .uk-invisible { + display: block !important; + visibility: visible !important; +} +.uk-visible-hover-inline:hover .uk-hidden, +.uk-visible-hover-inline:hover .uk-invisible { + display: inline-block !important; + visibility: visible !important; +} +/* ======================================================================== + Component: Print + ========================================================================== */ +@media print { + * { + background: transparent !important; + color: black !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} diff --git a/user/plugins/admin/themes/grav/fonts/FontAwesome.otf b/user/plugins/admin/themes/grav/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..681bdd4d4c8dddbaeb4d4f2a1f58c38cad92afe0 GIT binary patch literal 106260 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�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 literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.eot b/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..a30335d748c65c0bab5880b4e6dba53f5c79206c GIT binary patch literal 68875 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

7r8$?kb-D3z%-c} zLGfT`Wgm|$rwl&#jtEO8m)B!}oJ%(Y(1ZpeX!jfRK-wF?K|$LJuR~GdFpZL6EFp`H zFKc0?nf7)Jf~F8p9HP&6>OukC5dGx?Lbp8aZlyokWnzO{9f)9Eq=#VZ7oiJ19s_!U zKW^~F>qJP)$b+)$=5eqeuG%y_w~>W__r-D==WEwAxVHj#)B_QUqxOXBKA6BVKtLV$ zeYs+6ok?ZcBZ_E1nA7T;NjXlMlK3JMiknHuDCa2YDNa?#w8DpW+T2cSC2M~TY-&wp zU=khxHW;gbNOh@tL0WYr7+)8f*BopgUOjD}9Sue!X}rYPSzzq`X6Jr9J^El!nt7rV z-_LH88z|i8Lf(KFYzaW0B#NadwasYMt8x{fU74SMic0x(f<}NeWU2xUzMvPuQlu^W z0H(G%lz`WhgCVEdN1-&y%W8{_2{ggKk(d32qf0jMy*XA;L`zXPgJ=&K3E8Hl5-dQw zYQV(9u;^tEc=1P+CI+eu?p|QD(P+jL$ekSt-ql0w(gO@4M}h)q)&}d|3_!rXg}SO zNrzoRU12}4XW<~;c*q6wOIJih1VWbs-|gw$+;G&(?Hva3U%)z=Vh`p2;zsw{Hia)# zA#g}8ml%R60_?+hRS2l4a4$KYl)Ar6n>>S|?D|w-aL1fcG9nG7sr zTsw*AJG|Ot+~KTnGQA$0gs|wP60!-?EDjgUs=(5%o3HZAv%UlZTETO4?{?>IU^*c$ zfI|HiFZLfT*?tJjLjJKzEz1;a__-+ROUle%X|Srh0}`8Aj*dpURv9Y}D~%N~Jt|-< ztFc(?yokf2zSQEgU4vSB1^L4&cCo%Cs4sz(S3$BalWL$y}7Ymr_P(^@sQPB(NB&YK}P)MVu%NjiN0U^T{=6 zuS3%ou{xqv054t-X;k2$#}2uVv;ZVZ$qM9f1Pwe=2>tcwlQhdOypTc9CvkuayHdcn z?cQHu@yNNnk6J*e7KI}R;;@6(k{MnT1tV}p*H`1=gdlI;KroJR{d1w1c%Z<>;Fr$$ zs~90Ny7d$SuD78XKdMr2NEFSr5~W9sXq9Vu-{^0563Au-`^3zbOaY3z>Hn@Zfb4Vu z0vg(ibV4S=RWdkhXl9HOTqp$%L?T3UJ9sZNfOm6_G+1&Z;*!bXNn#N|Pb7-Ts3UwQ zlBN5KkHZ?Uu;26>j4v4(hfJe{BrX&)v5zCy46fxA;*~QI-Cl|W#u5mLj-~E)QKvSw zOOwMx{})jtMuUEhEr~mXgD(_GZ*&m323pEfy~k0lv?5}Fvx2unbibC6goRL|a%8nu z=*Q^2BR0hUy;^`y2E0jS21cpCNS%Z2M@zjqG(t_%z{;6R{yoI6_J4+g+TTFUm&lSns6m zq4GMm<~1lyAz(q0@V~M9JRA9en=atSBLeaV&5|?7T&A$5*E~ku>Se*PK@F4J-of3p zf~ygQi3`DA@C44^I%LxJ7y)YA!v9AESFFiht%#6SCSSKbfek0%ejZyN8^m$aKU?8$ zcjacpKYtPLq@Kf&zA>70>DFUyErOR_`|yPCaTR!BU(U^o(j%Kfkg%r`A~;@>bJdA= z5qTVKdeXKw1MYMYTOMdc%QTJsC@VIfbm0vP>MVm@SSV^mxu3Q-#H7#JOyGKum3p-c zAVeAc_ztmuUAH~7dZScBmu;za+5`?ik}!aX!d9}{FSAU&Wn!%+)%RQNb zT_Xye1j{iwDhEY!jB`%A6T+Ka(!P1O+`#6UfNR7DQ~#EvmO>FqoYLNr~%f zs#%lQ)PV-=$0~k4X>DgE>2Q~&+~uwM)>KNDr(q5ufV4i*%1QsZQz{%4zL|UH&*fN> zf(?GPYfb=nOgs(wG5lYvr8uXQdnE&!HF`xt4nU@iaZfV6C57t=1ljdfgph9_d+^8q z(y<*q^!66w^iZBre=<3`;8`#sVuA^{89TAE6ATz`9X#(jR5dgqK7EaWG}F+YoCY!N z`;_JGRWmbEPRL;rs;qqj}L8pX>m zEwAIf4GtC#>rV*KCAU5*TaAyOE(Bn0glhjI==&aL<`-jCu{)*Tqyos291*VDcpaGB z0$$9Kyaa4z-@t&NT*LNT@Jz&z$J~~>__hQKJp6Zoe9+K=gJjAO;1gGq$sUvC$f-HJ zP>R!Eq(NI><#-6P%1^Is)DaI1&oc8POdmv@yVeP6KNanDP9Z0!um?Z zc5slMebvf6YIx@ChBH+t=`PN5m4o0slgMbI7X1%oqLD~o6&dU;+l{(MgejrWOMtkT zmZcDZku1>I0;a(kqPGVH!SDlnOW=~-Is4S6?O31kvhr}@StWb@iqR$5mY=AB6nsm~Nb5t$9St z@eYSL5kh5A2)VEVYlfSJdbV%rWZcNJ9AnUe*S#N{t@b6!KBQ3OqP& zUx|4l$L*A~mO|JNL9V0FpT{iniWdzS#IQBfc(N5v!QMD1^SmfwAOm9naPgjwf$t)l z`m1{tO_`T*Q$kW`nGhK9p_X~vlSTMwhZ6l?u3Q(vv^wPm0Q_=r2pah~F`+5jhIHgZ z8!V!L)DztZ^W6z{YBml5vUOX57)z3cf8JKr8_@j9xyM$5EhIvV$a^^*dBy884CWJ? zU=rY|LIWU zdBFpUnN_6q$a+dnT%%G^{Y+C<^wp%|VFlmHiCe}O>V87Z2s$vjP#jVhCW@w8B>UK) zb1r+kijSezY^24mTH|%LrW;+o%T3c3M1$2ei4PZQAXjYY z@HpNqnxL{%JW2pl=mP=|jwU6Zff~Kc6rO~OA$TdqBXa*Z(%KDx)ksig&FLhatrf5S zp7O`6w+(y`Hv=|w902p$Vq86I=J}xXiOUh<1Ye06ZJP6*wq{@JhzD`A=bQL6wQnN)%L;ny86~&w(e6lpf6rgSMlK($cT7ZDxHy!-$NZ z;8RHh_@mL~;va@!^AfcGw%rJ~52_#3I%;=RF^rp+{e7Nt8l}U?I2ARzS)(+@u*ayy zV6QGW`1Fbj1W&gbCRQZ0g+{5Nh#|i11$3yAfAGW1AVl6hhZ zQY+R)U5<;guJ=AsmFf)*9-hbp;!wm!CCf4KWo|4STIYr^)in2Jp5%sr4{u)#C+%09 z&VYEaHx&b{H8BQx(i)OmQ%17S(L9b}5L|N@VeW~P=+Ybwb3KcteJme*66AuP0bO&+ z1qGc)mtFXcax{h9UDs~4XZ-s48Ffh9mx52Iqn;ko@>^0px$=WIWR2ushg`eLTqM*u z8U&H-_DZH}UvM1VQf_X40*tRMpX<*XM>W%=9D?wF5t{f#6yv1AQP8cyVZb^*wUWNs zJ?48?7M@otux$tctK54-&d&zj;%x3(PB7BII}Y^0tX$d+F3QUCh2x*Q)hdS=USu08 z>>tsjNey`}5UjvlpeAV-Ix34#2D4uhK;zi?nA#BIA)x+|=Kah&yaI*Uq76#HkXkr5 zvZ~)_HSF=bX-&r`v!SR9(|TQf%q#%oi70t({vz5d#QTZIwRNT27Nir>OV3?`~heshF0py}zPek+rr5>cmZOn;jN=P8kG&r-ObOMse zDP~Dvn6cj*?Cw2cSx?os_tHvT<^&~;;Px%HU4?hO3NZSGtRM?&=?TSQ@A6&fUF{20 zy6KX|S|CU)UB2AUj4g4m=JB%@2dB&dQm8{eagfplfC&wAy+ff<=Ob9oN< zJRsjeh_oweHD+~)o^FyWc>FLpVrOycmN-p52o8ntgH@IGwBL1*H(b_e{E^`vvbLYs zgPY$TWB{8dYYZlgv?GMIuGgqqUCFt=zWT#LU9X*V&pYxH5GWM?hzU&WrCygo6=H9J zs!g@a*XER-h`nby-V$>A4Y@4Ss5QySDPdf^6Pqac=K_vZaML*ZL;wUfO)F_-f~M!t z1AvqA|EK64{`pP-W6u%LK=WD^v5C2s0tE&iRi32A!Yr?*|KnxS+dNzp9UF}T*l3a&_Cj0-Ok z30BYpB9R%4Jz%py0!deR%^EP|>o@nJN!81B7;4HgWK>!blIn3UfmAtjQnMu1tfDLzFG-WP|_Sz7*N^2 zGu$?)ROl6z9WGeua1I#m&ht<6>v?sOHf1#Lis-eR?!ypl;z@7@?xZnLvjBx)Hi9a; znU}K*Hi(q)hZa0O!JxW)DUQoGRx#MwE5w{thSo`oVlVEWQTD@yQs?gf1V808s>9ml zsEwOyRC(YSFYcy92ez1kxzF$K&@%W0F+nt12LQ$TjM4f=m&Zp1Ocj<4LppWFk8!ad z?gjm%1-`*hs}_Fhdl(Th8rnHP;5si&S*iR<4fBHVJJubn>I<-7dtE*W#VTlwV)wX} z*~Ytx63Q)LTP&yu4&zEe%ljq@y7x0kw`=P?2S6n*S*%7XL^8`LWZtyvk&>`2R-tz* zB%s|H!xrDzqI@bRodF&tsC!F5oG>O_$qvFOOHv!s9=`Qw-5E`TP{dw=#Pj)bN4$R0 zbEg&*jF3O&xH(a$x;0Awk=kg<`M%`yd_o>5?Bwg?f&_TTqa#69Fs74$IKusCdxZg~ zGL*^y0Qj~P(9(EBCeFGvuUGd3V+I8T2Ib|;!+5&l;JQ*yO+BJFIRQyafGB}>wFf|& zK#w-U#;W1*uzP=wl%@etoDi&>yCDeW>Eu;640Zet*KCPQq)#%-Ui>=vA#Rsm&EUEZ zUBluAjdI0oScHG^L2!M^U7-sADVr5fBQ4BaZJ?+s2$<4rTN9` zA>>P3A8n%;77miy@5N2{~_ul&~<^3`%Uu zf}j{8PxGM&kL=IkUV2(ma3!v(Q6KH-kJR-5S3|YDGUsA!WI$+q@-`(Cc>(mm&rle! z<&woxb>T6H4QDLf0gF=~csU?S!(|drODqh@vG$>u4G0;c8osP}N>c)foMNL3Q=W@L zQj9c;=Fl#(OrZ`ou^Cm?;JB3eYcAg7kH^~Z9X8qZwUK*1Aj)Ckl({9T(F&yhZ*;NG zveM(U5f4+;rW|OHNhutQ0fIrU#5rNOVL5W+IETcE*QG@;Q5H|=TENP4MzI_E10P46 z^q@wn3W;Isn#yLtB0Ud(`dcjDX7abxd&_ZbhM+Uihl76QL91bOv_oA8de_f5uUl6| zJC`4AkYy3T%yf|H#Q?KF zc>|D!QUZe57A?+B4zGMt_{?pzX2D!jeKn>%FnHlVxKWn6q(0 zz^qZiN)4oRXt)*%$YMN*X^5pV?T)i%Kqp=r6D{Y`S#N12mMr7)K}i;!f#txTF9m)n za&wS|l7=K$r#tzB=l~1(D5Mi6bx@vu8l@B@rJ>^(1#Iz22?l^zfd|l_-rF<-Z8w4# z`*lDcGLan|piQ(paY%7>*8MFY^JN>=L^B<4+aAf(3wc!oKi#H`3z}h-8f-m-+alLl z0HAO}4~#8Jc|K`zCG2D!muGE( zpoM+XExtwX#OgsrYKA7s?PMdm61z=SvRFY5{)xX=a8XtqdlzPt@Q^($mV;|-kyvGX znn(buMZ`2la-vvp*KO&3F@a_*ZNfX(gHY^TfF8y82Pj#?I2LmCxhOshlbw+uj_8F@ zRV4FI$$!b`cfk5Yg*cN*0!{OvbKVymfoM4mhzRdqkX0;#P51^KmS|Cy$dcU;^o}gm zn$d6FdScdCgdKAZ_unA;o<7=}8#J()$s42`R@kKYD1ui?Xw_TMQCwp)Wx49kFW#;I zL_oX0X{o-zTzAD(xcIzZG$WZHI5ZhFH!R~GpXD~eTTRC`f|9cCz&AIG#dq{{7U(QV z%OGES*-MBPIYF@@&=RLeHxL#g4{UA8h=2SF5ks-5iTiGxWHL4dckua~h{73TQ;l>N zZZ4vntRzX@XeZRT3r{C|2ASJwA);D*5qKN~KHmc>G|xxxkzMBeVU$7LlXn^vb(RL7B00FD9kM!;Vc(&G6@)D z=mR+z7oysFLeZ1o4I#z?fHyG9ZS9dbeV0|WaC}ChQ*f} zDg>8(>;2*GIO%R@PlOkoqnU~H8;uxtyO0KxvCCQ-ze%A0&DCKF5xkR12#z7~-0Imz zCsk5jhq-ycveW@DyBwV*(%@ilBxTRdBe29UD3D4G2MHP(25^-fTktw1H9M|73@s`wqfCjwVb?fn zi{ey4n7TL&nU|fa17a}UxhQB5{6xXoYdQu9bLcDvTn0);*N2JKFihv3CBtA|`+|Ps zxKv&TA`*B@o#DaMR~a3XNO5nGy5S_@Zz>ZwWkE&@)jtmk=D65ELKb|da}jzQUU=I| zYle}r!-i#IKel8(OtL81EpwBWX#CdXEecJGH3^~AaUxk+i>3{N#(pX!5(@F+4U5qu z3pHdaT{7fdFd@JYl-|r=`USwU;VmrN6p!fmPUOG3?aUqEQWnBuwk5&v+W;xL8F#*N zP!AKz97%42zIYI*b2MZraa?^%n(f2CA>KDaL^Y}7V)Zf%>@BJu6pS4eBHIWUXh}oQ zdQEpi0<*Mu8)bDzTd{clcnwP(SLb+O70^F@2^nv9B9)b@o5$#z4L1Xg*U`%l;nuT~ zMiV^f;*BEqQ~Jd`^jsGy+ur zc)SrgxpTM2+|Ax8;YUl$2=B`Xm^>+eP;@y}Dt(hT+k^-z`1^!h2>am$uI#ayEHrAO z3mK6kc94CaW$0#EhyZCy;ONyOC=h4D&kk7nJ!zom!MLA0Yy{WRixS65ri1R#^79tN zFi97UdnXkhyl_L*A}L24hjDW)%D=fdEd)JcLI z3%4;_F~{3a>W;=WYYkw^K(ImeG&F=Z_iavcWG1Xx+@;#MU*Ic6Xnrh=E<50I!oe;? zpsYoz&o`ja1c+PKM2A@y1`+6;vj&IcJN=XC(Dl1HmDlG>(C~8# zCr`=B0BS_ljF(VNp&`8Nv>}ROI|M8f=nWCe3I?A*A!Lz`wp2zGeaSu0oZrBp0P?*L z-ogyHa8jXf0%K@nRjgibYe10LsgF7Q{z5@9wTMKA8GOElKW%2`jGz_a()K&ujX!3V zWSv)DgJD+DKS>@OZjc!(CejMO_!oyx?$L*&hPc5^W`J3LYXMEv@`Nd4W0TlhiUol) z)E8o5PM%4p+O>o*@vEo;LK=?r1|&s|$^3nw~wpz>4s6 zJ`%@)DLvS6e3&EY1)=`Xfw0 z2!ME9Xnjwfdtp^dl~w66n$1io2|=vx8`0bdwu5W~ZcB;iPydvHypJHq&$mEpiKl9z z(Dn#ITWB+c07f&!aA$OzGJ5fvM9gP2Jk0%QBdOwp%4DU{`wdl$dq| zn>9gPRKT;d{z;Y|HqLGKO-_XbbmAK7So?5}MzDlIyhvylvLJVi#fZplgDO4PEnMf2 zdU3e~`!xS7bF?fYNR}fRkO+g%)P0iQV$L$1b@XXUCG+INR#w|&*$n;GYLiZ;_S1N& z)q5^c9V##Zurw&>$!d!QLT}=!OcD^gx!N-naOyOIUGP50UTXFhf=p5r0+*Di{N62Z z;s;3_L-Rky8Og6Zay`)+l$Zw^uq8@>w07MQuxYJL0wcW@dv~%2>@ux+A(7ZS$vnTl zj+%WtudH%MAa&=>FR%>sldQ^S``Qgtu(Z;7I_kR)!36`?rr(M`%}ab&qoRpMH=*Kl z3zM3-5~UH66Ko^FNid1$Jmy;0gLR-ub!<+~N%0%EqbQK_lHlxZpYSa=T;v#=G)U~u z@*D_~tl`HTEps^ZZMh2%TH0aBXRI?7Y-5c_&_NnRQcn`&$HeKxW`GCzLAWb`hnu`O z3xy#oIF|y->4S`To>nFTB0uwcawgAa^w_dp#UUT-lmpskAYxYuN2p(ClW9Z4vU+p> z5G)dJ$YvA}nLmIOafAh~-*WUbN>KTJ=HLiKL`2WNb&(peqh=*8p9a@eRe9eGHZ#>w z_Z3oALz>+|-=er)p-^2z=Rggud}d@@sRncP!ucAObXGv;wWgx&H6lQT2w_IWpitr1 zEMa0IAZl3*0t6`dQ1xgdoJzdZqfc0(tA=`we*A<>)oH@$so_2!?HTX`(Gyz$WHkM`f@eO>9sGuVn3;L)7 z(6fnQt71xc!Ci?kP^Q<0up=8+v~T*@5=C!91Scq%TN?twj4tNfElc5cJlOm93o+!- zYQTU+MM(ge2xJ>tzm_U8Nr7b~fUepp{Kia1yn6z^Y&DiJ3FMse{^9>xDo4o4Nr_

MjT~HDem)#YNV}!)%NKBV=*$fkx6QQ6i^s@BkxFILM`8jk0 zXfbG4v}Z)>x$wz^PH_GfGtqXHRL40&M7JO~)rSEaEZ0E@6$9`JxSP^s64mfytiXHk zA6&_+{8+6;s+y1njZeo*P%_N>eI9ogXDBVGbyoQ}_rcx#l9(k25m?v$fQE`1ztn2Q`2oKv>Do9)hPk<^Qx$>9&lE>b2tCthjiiX{sD8i#ETOtCPf*vJ< zO8LANSRS4Q&Y934kDrsV$KiMkAPUHl`TULmIzOyG8~!wdj3)F3MX*A!;0p9;f>;CI zA(ny=3Zy5K4Ve!9?ocPK!;TV|St)lI!J@5P#{Gpj);bVufO_N%3KrF(0BDj!@{;=1 zm5_+|75R#bi%e8k>pv{G&pRXxSyBD4=D%|k*!5`?fSdb)nQI|q-zffG6JpxdO4Zp& z28pAg3@;u}5~1AvH+m%F>XB1&R3^7o3y^>^+$Ucul)CulvZ!K}R);CP+DLU-U>%bN zh!3hxug<4g7)MzFF)((8%_QiH(F`T(tSz|BY-BUE$aZziC^!O|n^R91`_C{OInEyS znDS;$emf+ji3p>}s9iBIgWVj712V~)qY)t(3han(m8)EXgV9VTw6bpiYBumb}v z^fd?=vU8-_G%~pYgwpL#gKk3s8+G2n4Bp7sx)?e`62bg?HFW}#T>RC65VIMy`PBj} zFwB5H5<3U(pJ43ygM%a2Ss;biZk3M;&_RLW%0(f*w{~?RtJMcViaUEieVjEx&Scu? zh7}$6E+9qZlhV2ld$dE^IwVg8O`zaPunQk$1B!YXf>bHV8HW74XEOIm_4n#neiQKq zK#PU*qEUpMac2T-FR^#t6pMHrY#p1rdc`6!A@llYd^Pn-g&gX_sc{K(^WhLWBH^U7 zNwkO^y>6(gmGOK?MI7AZe3vA;JGVuV*KS3M``}*_FM^gI#vbq>Ew@@p_qIuyd?E_O&%p3At>mU$1_F3Cq_eN z8^1-TQYa!a0t9Jcm5lg&#BAsaHzUVbXcz7R@Vz&`#LOSc;rjAMyIv z=zK3}n*y(gHmIaMm0VYuqrO7kkSM0H=`pS%0qGn3{NL=jA1N@&UBpHk4~mUM@!-tx zBY+8ybkD;AYDAOafD&Wfpr?F4zemSwgyvZP!qB3nL6b+$6CaHPcSmWj`ErD|Vzt%t zF=)gZe%K+I+-)f>w3$*bwWW?qiIqx5_{3}jU&f4y?Sc6;(8%nt!v=~3w3P|eiAt9= zA?e0aa2C)5;7y;7hT)o)T15R|H+m0$bBh(1`SzU3%%7y>mcXxKFcVOTgE` zh>K=j_6rKcUjkpoj4j}Vil*im>~uj#f+z)*ibv@vz>m2>@q~tVLO>3*teBBb$bqiabdai1T>>cAiMEsB3 z@JEL~ZSxpMSP|TG9-tOQvL7dam>l)Y$U6JfzwE3hks68=z4R<}9hQM);B7sBva0VJ zJ7}@de%u)@ydolpi7m*|>r(><;qqvB5fK=AbT9tAwI)Ly54N~hJOnN8m;U_0HZ)&i z^G?svl|AX)wx)?yFKz?w-)|kJY<9utmRvyt5v#28z(09<9!`}YB-$}?;M!I~Ps>7w zs&p4I=#=;rDsb(j+Q_ZXe(a6@h+aj->6xvH^rEODpmq1e zN)=JZPfR7(Awtu)F_jj)mzr+`6{XDyLx&Sgd_T$QW>_5-L4zQfc!0f;#n4PL;A)IK zEVFk4ru|uljvfi%D)`<3pcOVzlD-wCbV8~ffSG9^=o^}B8)wWeUW#m6@eyDbzi=%` z0|!VE!Y>>PKS%7Fb^buPHJ!i%>@13cDFx+~n^zz-a@WAPxwz%>D5@Knp?xm2klrdu z3`iCLAV#>VSvU9-n=e!zFt5j(-~%dE&*%8&f`B4Mj8c&0?2(TKq@cVFJMRVGc?S3I zTGt=O;Hc>ND}|;btA@MfpM87iptJoj*<@KvzZg`-P^ZgX;Be5E(k?{r%3Q3uLJnHX z0U;6kPPQ^XB8sa)>6Fa`nF3rvRY=Xct|{`L)+((5_a;xX7nRuqEyi|yL=Gw8R}k5h zTS(26Ese-GhItUiidK=vqgV1#GKLX0|5RcN`nC}Wx@MU#6`Z691FBjHP=zcSijGc2 z6UsX%*5o?~HM_^iMdG-w?Cb$SHH~cePnaXbItaCCTo6K0S?zlkNwFie5A|W1DWRDV zLGJo96Mxns&}LPtqa zn35OqH7_=QY7*#}-(KWvY0#f&4wTzL=#ThV&C;=YC)R>HoxPs|M#{-;43EKZq1w039W82tKZmwu(mK_L< z;AA8LS!|=!<~vkzJSc+e2?5S=;rJlMw;Sh!K0?3&gD4~0Pz2-fsDbVYMy2(Ee^FL2 zLX~kXf#r4#@sI~l(C2gw+Tah2HuX}zl#e(ZC{js_zA+=VFCMRCS2UvzW}OL0rc#s| zCZB|l)n2apHu8v*11q5Clh)yPDM2#KH3Qx8U%x=i8l+TGW8i=uhR`O zmWC6RNrLSm;W8#rA)W`21*?|`w#;%kluqj6j9F+5-1E#8l)+!N+)>s&+FN1uyLXIc z3nVMXn$_a-x%%~*N)K)g2kcznu zM-DS|Av{UJjVw6<5~Aq1b+o9Pb?JmMQ!=HI6sS~Z)q5UWHQpHwxvv`e1i&7F z?wd?|g;OVQu>jT>OC(-!fy%H9pA$u2{?Zvj5fn%#m?)%#kB5$1FeC=d+vt^5WGgrk zp*#e46CdRb=rs$J$o85a8=t?x%0;y}p*t+hnW zcE^F0xD1)8!Y^4t*_4}$ihC6ipA zjH^sKPYXFY^gWInz`<`5{~FMS^))*QX%~I^;l-_q0NJ)k5@Gsd5i{}T?wCZ{f%b?` zQve@aoi0^h+tR|66AwItc{!+K1u70mqKN<+9R)y@FAo=!Nu86k;<2X%`Cc61+2Ywpi0vC{nLTe}zfdMLiQZz?CW5s`4LgL9$w4p6eg!il& zJwYX!iMXlh$s$vqVjS+V&l*?qn#3Ghz>u0O7b^HR7n5JMFz8E*P!g1MB!$JRBuA)P zk~LUy$gS_(Z;Z$p=O=6$9t$lQ373mp^M5)-4M@r?;Bnpg+D07UhfrLtI?ZQrn1w5b zu&mRmB2b0gJP^qcU0}pO0VKN&5F#Q0%{lgi*rjz0EFUItTv~FEQ{1dMAHOd)s4CX@o)TcJV2q;iB>k)?@nf&i_2%Dr^@yz&hw2P13Uk9`MAi;Et^ zf=F9`Wz~V}3I+#%1$>K`99mA#Bm!v_-Vu4wKGw^+yCrHSB?1UrRiWvT47#*VDDqDaCau6|%j6Ox zg4P4U?Cc>SuP}E!xd3ZdQyAA*<$0kjoKZvUOIuPE`_s)YRaHFXLU!6i$^@3DhSlmE zB!q>W02xG28I_O030ZX>aM&m$W{vT}u|3{7Kt z3E5GQkr;^H{7hmjI8nwPq`j0Ug)$O(ex5!tI3gwovJa|>7!rrk>j1TAW6cG1!2ONH z3oo&gj6zAv9nb73A=0C;#->Si2NgD+cdDdFPr^<^67$%ejV^F* zGgryb9ga9)*tIx1Si+956{auxQ5GKS$TvE@q*X@VUr&tK9Cg6~_R>zY&@1Du#tUuM z!v%B;1Z)TU{F2dlLSNd0?oriMQasyhUEy6FmG|b;9^=YNQZ?~kFdv!x$w6|Wvh==H zMb5MJZo^bnfNZ4}$e}Dg5J=m+p{+psAi_DCZY`l12pNQBU@0Q2H5-~9_zCvPLJh_) znNR{PjjrbYXzD8q4q2=HL*Ji=ZkBwJE~k5kneV=#A3YbJ6jdcC;v|2|l9biwN3S!+ zQw4k(u9DD%N+)Niip`Ip*r<<1jIijJA*S8el&M53gP%dCDQNX_-7}Jpr?_(3R;20? zDjE7UvwbhElfuOzvhmOOwF()|C$pbXR2ScoY+C9l$ryTjt~UYE{>ET3=|#<;pUO(Y z0zOqN2ExLfZqi9XG9jjdGoCo;V@tA`?d%|#(hwrFl#1TrM#SwM-BagV;p~z(u89I0 z^q!r{ydORY1-eR>L`LA?E_>(X%*0o6r=&jwYVQ3@*IfJ+p`e4Iz%8B4m7@DTAaEJ> z!okWTY$DgNq%9MSBd#D4&YzkIL)1fHnNIJH}U2FK{*W% zQ8AZ;r)_1aRNJpAU9=+$Wu$R^lz<<>pxZZBoou2JIo;@o8BmnEj2s7-9To@oVik>M zYJ;l9U0Za$4+Yxy*!w#zJZ~ z!$#}ucehBeon4(~pX~Vq^H2+d*<`U_sK7Rd!UPdG-7r9OnH2YTu)$Y^CQC($MiWNR zd!>5c^{FcB$JcisVBf}8e!nsbEMSJ=?4hC-4`As>M6gkfd2eKc`wM{RYcw#Fl$4MG z-LiPxTx2SA_%abgfQ{9gMjAC{u~p?rt`c?gUK|9>B4R3v+an^ zO%&=Xc{Dy^jx{4D_DqN5OE?7Qu<3K52`Rx+i)7`j2*kiG1+Uh$)Z^({mNndvPH}${ zGPZ2OZ+D`firapIrfe9abD$*ZYa%+Q><>(evBeaZM8cSz4XE}h_>NNnoB+ins2GVG zFHRfXL4>mstX(S3h&V>m6m~RM*8t|=&Ag8agFotrkJH`~Y|O9uxl5eGhM1!Msr`cu zNk%|dhTSe1?HqMFKrv06+aTR;tqEsbm4TNZ=zclneHnI%@y!0`4V5-21iyRVGl_ypspc2>nW(41D{ zUl`F?7(W}*!5Ba+Z}S6)`3#cIZ6&|0ORmPjYY`Km{^1&F{mN1T>ZrY z2?g(%&C>&PeFsb~hC>Cs!_15G?sy5@%5Q6EQy|&DvkFjVZ9DQnG>Mtk(uMBG=;~7c zHl3Fi;SL%A1(s?lw(us1*Re9fs5Fdbrk)}XI?b-(5T@}5N)|~;Rz#FL_T`QxlzGv% z2J^)(d5o`H%!|H7rE)??M#J8fbM$~D>^L)LjqPSc%2Nnw6m_mEzo_&`sPy(%w{+-f=q2U>kNU)ii~|9YKDmJP9QG2 zbLWO^hjmMhhPTIf?D32Z7y`AJR)j%j3ML71^rsM!ZQ^n~y+Sr~JUkL`ivDRN#E`m6 z`^_p$(c#}t8+byeLCUo=hA`$gn-bvQ`YG^~d`C1=7r(eSZqG1Y&dj{%9$wgKg85_j zM9$1AGPF`~5k(p$HY8GzP~mlvQ)A08I@E44=0lWTdawPXtqccngJ*z zoM;6(m?Q`I(@a8QWkMLg36ioy5`%UMpfqtul0y!piX4YnK_?*BAY)mq)8sSAKtx1y zj)L(-J+pR3EJXg>gDDZbykUv(g3IY*s60-wv2w_U(8^5NSvn@uFsI8XZ3QqSt|6-yZC&M&+0ZdF{ z8G&KSx$vhI@rq)KjD*NCDEcq))Hjc0S%`a*uDKU zRYxh?0pZ=UUuU0!0Lq=sq`+clQ}g6~(u!uu1*kOgmoBF6M*x!Ptt_iSUzP2S)b(f2 zFnfCnu-J)^mYLZGnJ$h*yFR2QR4o8hAOWwcoEJ$YQp&%;-Z6yIhX}0ZhbV zD#v^yb{vIeIBuTxQYvI3xrPF{6CIs`=B>MrWL6E*=+_EaLfv0bz9lZbRaez?h54DQ z5nN^C-Y}WypA;j=o>}NpzO5iKX#tu>5?`KmsBUU@_oZw9-rsmNJ^%p$m%tfhSl2gdQm`)(qc@8DlZ=KoB64pbI0!>5Aqa`45Vi zYzoaJ#s;0wuA$1cB#blCk`gPlxB*J;&r8LL?k_K3&xotMo29xa|KA|%%3rLejcgEw zEk`ZdlMpn%pr30^xxxGsD~CgolCo~tpx{vz?(-by(HMyx9s z<}G9>cKprDxEkpKx5iETC7OlsEzk(#Xr#n`3ennZ*6GlVT2t1bGuXmXbvPn28wZwd z-6!(O@@NLkv&N%1uS}jg@i`E?TooAewy2lVP0qD~m&212pk1iRhD*Z4_>oI!#tGN`H#sxf$r=+U49+c*#%Kj8h3PO7H&UU&QpRY^(6mN??< zo0)iIg-xu6w|-i;vJs(A-DmDLj?Z9X1!nIa1SMA|qIHteU`Mx8*XSY3;3e_o*_8W? zcTL5F2yBWU@0g$h`#cHw^dT;y7~O&hP7N$qE2&opaCkIo5Jh)3xgs5xzh@$rX%fV1 zpMa=DH_2_Xi9j8cFofT`iM?IyJv)6GzB_l66E{q(4rQUjjx*9CuqoIYWk2emHv-+l zQz^AtlqFlf^J}vuK>%|~R>0aFq!z^xOJsJ-u7C1@EVdbpPC#w~1`Xygpos-m$AY-B zdCA)6Et*QJ@M=3_`>W!x3+A-J+jWEJus(D;2cP(fhr`7REp;xLZI$u@=^u{OU5EbL4PV0s@#}X{FoQV;>pRxfo8o zvyyWNT-%)1tojCfEtEkg#ej`X#tq`J(*{!fCHzK#Yjs)X;LZ`fLniipi8}Z%1lfu8td;b02`3Zvbu*lr&Vg!dvy*F_AnQngfp_h}~Ih8QmkQ2P6q~r#5 zg^s3en{zs*LOcVup*9k)YP|nxP|ceX{2ateEhuK7pav1z<<+cm9BLsZ6llI;JaeVsjQJX+R`lye8%rqiilD$q_$U z0=HH-x08vmJ?j#*Ru&ki0kniP1*?3glu8>8)%R-OjxT$u(ZA9Xh_R7)gk>%#6bLKP z7LLg)%q#CwiQopr81I|$vRfbdhbHSih{|)5MMgfAnb;2qgM;Px8{6T*moC;R87z`Y z_@+c6KHh);9}8Pb(2#?G#8pDh)qt6=rbRj19!T2SR(S)oCmqOMuw|c}IX#l#w*lQH+q6y#c%8rf343x^8^&7c7R*?r6OP~_(cza8M-Zl`Q{sSR z7=oBVSv40(gombT3w}G0^(7!y>trJf0sCxvV#q}}Vk<(F3loVDc^;ZP2yhq<78CF3 zFn;4t&l7KLKz7;j3QAK=Z*jm9(bcp29vFd+q>T9UipEeO{ndYXvz0VR8ykA{0sv|5 ze^iAdsf!K$1}hDlg1M+vXFr?dNFiy66VTSYik3fz9wun9#-B%;U&Mgm#P@1=X~?&3 zFff<$}KEPxyR0#q46WuT+;)9QD;5J-e4di%kI8d|iSIW|+MsLL?VQ0ny}W43n$ zb{(`Lax0=4L#(_s*v8I3%HE@V=w+i2aULN*!UKRSat$4=kgTfZb!>3lL?;OS{ep9M z234m}DDGEmI5v4lp2$I-xM=sAW8zrDeS$|@d?I1tl&_k&4&*E(pTot%JPYAPVr_MQ zzVc0d+#JOCFHEZ&oHZcp$_@l+@$osfnnv&>r>Cb~yvQJA-yaUvuvjEU3*UkP#Wb9F zTH`?nW5S}1bT~HxcLWZ{`?kOF^{aG|*`QZ3O7oY+dgguuHq@X3B~@5P4QpOd9&mw& zm+|AnyX@ba7d>9m+0Vk0;foZi6lYiNSqK2;R)OT2-r|aQY$o#ksf^LQbBr8Au5+bK z#36LXGB78WK%}XilU5mQ+IV8VoCG=~qvQ^YPP5wg16jRL#P4VO43FNHGgItTz_e5j zAoC#)Ki@Yu4ey-B1_oQO=wj|}-ku7bRT{1k^&K{$@N>Ii5?O%LC6DX{o%h}0!}C+0 zDjDrMLm+V+41t6eNy6%S{R zif2+nv7LSZzm87egrI`o)8c|rwO3PXF6^kxrbHW5jSD9y1&@VFPJtz{)rIV+fZ3v> zOA!8?*BbEoBv&eS2Bg)oOE;oB5;-=iZA1xMYrL?{bY4cy8Dof=L9pPMK5}c5=Gc~q z>SdqOM$5{0zgco`xx^$QrU2hFub!3USo)AkVO&j=#S$k-&;_O2eWqxTCP4hDmn!ax zrCVpr6?Ds3-MLJJ?yE{Y9Gd?*kxk2?n`Hp9Afh5XP?-)Q`zT8p5+>q zhaiL$s_tp0AHpmv{|U$dZXhR;BSixn@CBgp$+g*jL%TjWPu-QXP#O=7wc6p-4?>HL zXZs1GqaV}&

s!SOc7+5FcpeKCY8xc4`o}xcEr`@y^k=4I~Pzq%F|^L#>(H`6jPP z>6mktB%u^ch>c0}T;LaQAq;s#xO91MrwV8$f8RcJpb!BSNpKi!J5Y)<6@zYequgh# z8mIG66UEw5RS~{1_UcNT;ucLXU-1+J*ikU&(hpXdPT~}(p0^cHzK(prM;%@j+AdI7 z=6`<6nPK=i&KF5{Xrt1-^lZ|~Ft?JNmy3@Ngw8wysHq8ZjFpjYT-f?8g7pAtt54fVdi1fKpT?$KrWg>^5ReU<}AsISR{e&`A!1;zkm} zb<;n}C?y{7W*EG%1V=R*(~EI6n~seC@%8)vfHiH z=Skk>0BC|1t>s)e3wCG>s7M$8o@WY$Y11?8Z{Td**h8B+n|2pRtaA%`gp zAZ_4G$qUiZ3~_HR~kU{DcA^uADTx(5<&wzfUlFxJ}*KG*(7gVP8;4yDc5` zk(QbBg=<4+rnJI{2b_cprRH#qUafPf2cmJ01n#!A{>2*O;MKP33JCTIMoUD8a>I(= zEuLmZm6U98+=9VW0`$U|eR}(U;!dum(l?G4!p^Hk9vMUWr~ZGbvF~kE6R;@i=`hJe|lgPfw4d?JRmKedh@%4Y#&&?&R~7 zvShjlA9gT%>6%O`H~-+&B2l7E z)-k*J1&sP0TnMtp3{gd^vBz}OkxUZ})|eN>P*TY`eQfT=@VXNa2i$Wm&n%bEo>k*a zuepyUCT~B|fP`~rX?_bvalAKreN2mh3kW%vG3xor+66$aJ>BCvgx;O2zs_fTsIhTd z4-PCm(3-|CWlODS6Ak=7nq(qc>5p9mi;KK`(lFX0fmp&KA2wLF8 zCEW|7cE9n{e6N7AwX%04CrkDO<7{)uWpz%_d(vdjusKzVK!E2bmJjGSjiDAz%nYWk zC0#s+`q6B(FfAa@==OSxl5p-iY8_&ihp+K~7A)d+^AdUu`$*_@NJ*_KfGd%eGCxq% zlQKCy)5L1>X$-T-_o~F_#cTwoEKsStb-zmiK*IhSHOk44^WgqQ0zR*W$D0JAV5R^q z#+V**nFpx|606`VO?Uw#HTVrlYFnuFGU$bDIJ-sI&k2 zjFWso*&*dZPnbrVVxJQvFe69-7cIH`njjxdV-75^wjdw@k~`_H-OAhS-etWo$GKv` zUnxY>wJ7YNfh9Ykkf6RBMy~I5X@^b^6avtH6V_>Ae& z;1`RcskBD`HF9j(n8K zGaaq<8mQWzbJh?We1tz!46QJx9Gs&>ik^Z$xK0z9eNf@h(J3`i%E_tH+?L4Z7;7u`{@w-4-Z#|D^t z`3;Wp02>Al!Y}$j6Bbc@>;V!enR|K3du<jKI!iK=BGe9ATKofx$AS>P=E1 ztbri`!VwmQB|2@r6qCY(*WHx(m;rozY_aJUvW2SY4ffzg`kCAA=Qq|B%p->1Cjtk) z1|w~BR%T%rTMw=>DQlNu#3NW5))EF~5j)1l=d<(RK5A%{LE~aV2SMFc#D6a#scC88 z8hS&u`y#HfzI%yL)aL_`kY}U&!Wa_ah)1E81d2SE4DTEogofhoKon%&IxvU{#E9M; z;j$_mcY_8FNB)e~D5+GacHUzlpbG=sElaXz{=ETMa%Cp-G+2ML^=A@4h5Wbd3g{!D zsnK%o6~hsOEJ=i|7QY|}!b%$WP$mx4!jdZ@V3ZufL5`TBP%(ssh?W5g7Mh%W8sIOV zQ#G}Nv3LAJK9(I4eS5tYllScoNb^)78$v21o!5PFCNB(XWZHe=(7}R-R{z;^>BW~G z0f#j)pifgZ?wF7LiiO9lj7G?22G1i(px_3A!>%21i3#HkNIC>w7YiJ9RRic*YyPr0 za)4Y3<7^S{HMIsRRqDp&lu&B2Eo-3aZ*xHKgTV+>5dB#+KxP<5Y-5O3!IEjT5TX=I znR23|XNK+PRB zBK1*_CyNBYaqSrrho7)9tN zQC-_w(_1jt<`{&ALJO8+mGGBPsf1!@_EiTkciMTX+E;ZH92gQyB?M{@9V)d#Ov5nC zpo{LMDsEbn(3QT_SpYoU1dyT4t><^%h--MA=6m5OzgU2M|?#O!Jy}7!G2_4`soOKX@5!WuB=A6yEpKN7B!Iw4+`E> zlU8}{_=CC3o?n?NxyAE$774BGPURG*qstBzdnWRBPNd;DC_}k32OY2iL>rDO4C#Xz z^DJe@X_di@)vwZn8e<&P6%YmcGZ3|@<5f5WvltNU@X~J;OgAQ2jZ(iT=r%yi$^_$% zzYJRYD3g?r$T^0n;t;!*mq)#==+@X2^Nczduxida8mI_3vzQIcFBG+RFu3_ zF#@^x0k=Ry;HY8+YCf+g?SY<-l66Zw7fgo)a|@V*0flnwF1GhQ78nX39HikY)Ok~L z)j{J%*bPCW;IHvg?#Dh4rl>is&>_+0XbwlDKTeFz)n>RcPG^A|j%Xw)x9q+)NDOtX z0a_Du0ZTXufad%?2vq3=1Gvq1443{n&H%Gl$be<36f6Q~u%Fb!A1Dt0&56@!B;S_X zxqIMdT9w<-p~D(3$#(Hd&8I}~@elO%LGGy%RS=xGxlSNmbrkv^ctX{j$00KS+?Xm)155#m;|n7>o952u zYNaN~jb~)0Ar+l$FYOo=W3K#*BdCf*a1%%O@9j^K&@ti^ENXIA`EM~~?KPyVdK~l< zY@wM;rgBMk(KcDbn%v+2V(do^b<%TV_Y9njN2v(vYGbmpK6IA_^VcL8wEr)7cg_)?k3ON)Uj5$?RtI z6Z%mBX6f8Vg;hBGE=CO~gcW#lM1OV{pRnJA6*DIa#(wlhOy59bVl&BqUWig{n9o>4 zU|PW#M)gi;+X2Y$gUuuj0?##d19%L`?9qSK2jNLwCJ!W;9GYHW_Kc1kz{czE5As8go)Hx8AlINJ+=g1=2q!tRMy^IbtH z6c8nehl&Q2DJiN{d&7c;%0Z0rMUtYveUF^DRXzofjEBV~omb~p6W2;V&_3`LXQaod zuXq=&gRB6M!sXgXxq&1wZ7+{PX75_Z%z!bC|L3l1k$U33t^ObxAD89~KtL>p*9|I!H%iwEWz_U5vt>u>Neml;<_2U8m zuAUvXR&QYGo~?L(kVYpk)niZtRY^#80qE2me(wR5G{j(8cIyG+aLY*Mo-i_CRh0AlP9jYfRq@lvBZ zBHuKlP)$h$*;4E3EbVq1Y(3} z1RDfT1o8w=1U&@4gsBBi1!n~l1&D+|1dIf~3y%re2JZ(z1^}gq5zIg!KvL0QmxCG) z;NTP@=riEJg5(QGJ3x#<0RkTc{0X2Ea3ElM!S@6X4qzj2Mu3(9)+mUgAYDOz4ZIcL zGO$xYU<#NautWf;fr5dX0b~O32WSj{0j&#C^b&x|0yqXJ4&Vzg3_vqLjeyhykQbmf zfv5%88(<6oWPrQ?-~dzh-+ccM_eadX3j9^@x5uA3d`IwC)1OlPdHQ$EUxIzF^;gK> zOZ>(9U(p{R{Tty&r(PQQvEg5!{Pgf^>gT6EhiIVWOh87QDZmaFpeY5W}{n+i=>})PZjHn#cbBoN(CS(_c z7Ox_NfQbi_;5H^mB)%NMzF`BnD%g4hl02c_`lQ|roug7f6g2D%0B#l>i-yBZX(T%Z zwKzzkpwVVe>CojCv4(yrBalVJaf4q2NFvKC}EE z8mk%P(E}&wkVRainrlRG+06k~Ac7mU@2(V)5N6z{rU9%Gb(xGi`puPCPY!?iY+wI} zFBRYh3o!#hMj|hz${c|Pv9%r)fY)-7@@6L^|14l%hyg>(_(s|!rWO@{Frn<9nwT`P zY=Yma_EK=Ld!Q1FD6QKs*u1+ANGctFn0f0YREUJ=*C-9V9+*S(|873oho2AOeXphw zt$~GJ`b~lk(Fj%%C1D}upp3i|-(bJWY-)Ix5U1ePfJYR8|F_Q&Jp7%=ADVt`tX{Lp z;%n!KP@QOk4GBqk3Fv>PbZ-Fc*?9m775B0=18YU(>{h#lAgtX@N zk~J$og{ZwZRi4Z$ZLTz0o?2>sg17J<0Jro=ODu&n0O z7|16&1mXxBI&b@fq*R&6-)C|G79*Uj4zllfL)os&{Dh`fS%ZkGPJC=!a`K34q!fb( z)q;@}spjUN$0-6E^hYTIK{^0X7hSr5n@4ryJ}Dl~BIHtAoB@(U4b2c3B&1GpU{I;h zWC=N5%1LJHs^pH#u;~(CgzqZi#|h4}xE~}uHvXg1bV9=-N_hU3tlR30FBs@m@>Ll` zfuKbmizY>nVdw->87CB6T{K*9)fNtvUt)9VQ?!{7Zn}w4k>NlfX}QP1CCI)2(=Yfq zL*a~y5!s-@$vAt_k%4^jPDulLXsIQDFqKwPiMFTPD-yQaZ27Ggd>0eIFpffW#FW5} z<)0n&%*%wodL=SRLoDx+AJ26Y#Y zOHHbooE$BK@Ml68N*4p^UIv!9M2hZ`LEuc@91P5*u17=H>CMWlkB#JKDa*)&SOv&d z`x`^*(?MgIx}%Zgch~wihzi#&0^OT%K@~&t#ieB<8=UNXdHP5;I>4lGt8QK|DX{oE zDw1YLUt->-ksPW?J^I3sKr{KKY@l zKCu5HrZEKbA(9c$@qf@MMhMHWK>^hLJk|d1)x5XD-(IeHDEYs7;G#PgWk@J$S`a z+_B6fcXEzo(HNI1U2zRH&m0fD@{bLRZ{Vw>mI(EE z6Ze(cAfZ%Ua6$mW2sjDEyhN2PfOCQTNKk4JX9G2WpGp1}{{D<{w#89zuvgStN_?!V zfPlEaEm*k7G<&TqgGTE_;6h*+HGYT_)Q5B?r{98HkGSN_CIx?#96;Z$8Ly zxe%EPg%^3)tfik|>CmwLwGm}nc5W8}VTCsL2}I7_4wC|y!+B4`B_mg{oG~7aKkK$Q z8CHgL8yg^^zoE#t3%qe{LAFc`=#E)M(c z1<0@-)LGDP%1`Z(3F+uj@#_YW!D;XmtSN;Qp{dJH96(kYxXrw!1yh;E6vrs8ZCHJa zp})bJ>iXvWT|nVMsnQz7l7RwK@5l=~Hy?06Nm1|a30Uj5GE+67P{!NZL+j+3z__Sd zwyGN(ME;KfWS%WFm<3C2ixWX`4akTkh;u&C&)Zau#~9o`9cd(GFq(&AlhVWm!VHe% z^GT5=7oZBtZK5hHoa3;Bi<5-4JgA1J9x;-t8!xkZxfGSfT(K!0bwY{Bg@~B{n~#IU z56s|eJ5~Vy9@+u#hE0ejoSYdC&0t{+?J#6LQJUt`0};;#TN??st4L0pqX(!a3$@0{ zYqtlR5E69sevQKP6BKAw71%qwLEojF49S+7VcBP;>i2xAurdeM(SXyABBO?Oy9xF2lBgA3d!i@dTEdMcF9jXE% z7ie9NdMzWMK^Eapm>HB)>U4LExC@fji`ZpwVRf|xWZANGLRO<1R@gAH3;VKmX>V^O zs*t(@iDd*NP4`AKm<$}y+&dYEhr8nB@Z<|MZ(Z{=A9!s^yK>zV=Zl5NOu;Kyh<@)Q zabA$<6c?y{tB!8w_%Z-95Ol{BD$sUznhl;sG&Q7bUagogU05@Z6qGYucL24}_x1QX z4}uW*l&LqFe@lMMX&fO*p4%qzy>~j~&Far~6K>r*F%5Zy01NQFuHIhKpCw;sAT5q! z%JeOJu(hs2(zpvk*ewDSB+FDj*qY%Pt3qkqX;827&V+h4{*B+EScESjl~p1Rm?2c? zLVje{Sk%q|CiV^8eKbkS7LgiQ94r;p19NiTuC=5Az;9Yz6_BLD2ELw-!2tg~5Sp1K z3bPi9uOYG#ZTVS)W~WmPgix4LQe*6m$oir>5kyEL_u*j_95AFBd^-g{K+$1M#Dy^q z5I8WTpn{Nq3N%faIadEaU<^LL&+oGIx5M%8VFTKmw&B$GfVN#u*mMhF#4Seiw7Bs_ zJV92?BRYoLq}hXNrNU~#viRFSHr#8X8K8>|q`ePYnQ#N3TbQskgw&^{yPi{?lsryY zL1+%8>#WlEgq)dJgR2wLyzZ?fs$5cn3HEAzs+(nnj*kQ#QtZ+j(wBE<4d_dovWD~} z&Dg_w66WEtDbCVqvfc&|)d}4)N=vwxEnr^_PPEdcoD1Qp(#{3&)aZItmXC23SitR= zi)o_D_!8t%C0q$^Xmg4bJqF?gr+`a`ooOIS7zfB6$`}N=In#0EkauwIPQWF>&a+PB z>;haI$u|Ih2QqFsk_~PcNtgj;m)V7uRQ;6AzzSvw{15(_fIEdU;bfVE9C>AsR|d>O zcvB>t0h}pQVN{S+aH>bZ7s8beDv|I7aHUB20(erUl9?E$;XI3jCkUFunrig%lGbv- zi-yw!1SbAJ%PAa;B$0!L()tDj|D{)iRwwcztNBC*6Z@4gkw~^#+eN_$cP0P;00000 F002TuuHFCu literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.svg b/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..6fd19ab --- /dev/null +++ b/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.svg @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.ttf b/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d7994e13086b1ac1a216bd754c93e1bccd65f237 GIT binary patch literal 138204 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 literal 0 HcmV?d00001 diff --git a/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.woff b/user/plugins/admin/themes/grav/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..6fd4ede0f30f170eecb4156beb7235bf01fff00b GIT binary patch literal 81284 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äY>7uxS6S37IVP_>DW-kg%dn+sFHLnFhvXTU%&ox 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 ZUtABnb?tu62nVk>KX+wfW(Hek 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 o-IM%8o*ehr=#Iq=Q0BvwUBdJ3D -1; + +var keepAlive = function keepAlive() { + $.post(GravAdmin.config.base_url_relative + '/task' + GravAdmin.config.param_sep + 'keepAlive'); +}; + +$(function () { + jQuery.substitute = function(str, sub) { + return str.replace(/\{(.+?)\}/g, function($0, $1) { + return $1 in sub ? sub[$1] : $0; + }); + }; + + // // selectize + // $('select.fancy:not(.create)').selectize({ + // createOnBlur: true, + // }); + + // // selectize with create + // $('select.fancy.create').selectize({ + // createOnBlur: true, + // persist: false, + // create: function (input) { + // return { + // value: input, + // text: input + // } + // } + // }); + + // $('input.fancy').selectize({ + // delimiter: ',', + // persist: false, + // create: function (input) { + // return { + // value: input, + // text: input + // } + // } + // }); + + // Set Toastr defaults + toastr.options = { + "positionClass": "toast-top-right" + } + + // dashboard + var chart = $('.updates-chart'), UpdatesChart; + if (chart.length) { + var data = { + series: [100, 0] + }; + + var options = { + donut: true, + donutWidth: 10, + startAngle: 0, + total: 100, + showLabel: false, + height: 150, + chartPadding: !isFirefox ? 5 : 10 + }; + + UpdatesChart = Chartist.Pie('.updates-chart .ct-chart', data, options); + UpdatesChart.on('draw', function(data){ + if (data.index) { return; } + chart.find('.numeric span').text(Math.round(data.value) + '%'); + + var text = translations.PLUGIN_ADMIN.UPDATES_AVAILABLE; + if (data.value == 100) { + text = translations.PLUGIN_ADMIN.FULLY_UPDATED; + } + $('.js__updates-available-description').html(text) + $('.updates-chart .hidden').removeClass('hidden'); + }); + } + + // Cache Clear + $('[data-clear-cache]').on('click', function(e) { + + $(this).attr('disabled','disabled').find('> .fa').removeClass('fa-trash').addClass('fa-refresh fa-spin'); + var url = $(this).data('clearCache'); + + GravAjax({ + dataType: "json", + url: url, + toastErrors: true, + success: function(result, status) { + toastr.success(result.message); + } + }).always(function() { + $('[data-clear-cache]').removeAttr('disabled').find('> .fa').removeClass('fa-refresh fa-spin').addClass('fa-trash'); + }); + }); + + // Plugins list details sliders + $('.gpm-name, .gpm-actions').on('click', function(e){ + var target = $(e.target); + + if (target.prop('tagName') == 'A' || target.parent('a').length) { return true; } + + var wrapper = $(this).siblings('.gpm-details').find('.table-wrapper'); + wrapper.slideToggle({ + duration: 350, + complete: function(){ + var isVisible = wrapper.is(':visible'); + wrapper + .closest('tr') + .find('.gpm-details-expand i') + .removeClass('fa-chevron-' + (isVisible ? 'down' : 'up')) + .addClass('fa-chevron-' + (isVisible ? 'up' : 'down')); + } + }); + }); + + // Update plugins/themes + $(document).on('click', '[data-maintenance-update]', function(e) { + + $(this).attr('disabled','disabled').find('> .fa').removeClass('fa-cloud-download').addClass('fa-refresh fa-spin'); + var url = $(this).data('maintenanceUpdate'); + var task = 'task' + GravAdmin.config.param_sep; + + GravAjax({ + dataType: "json", + url: url, + toastErrors: true, + success: function(result, status) { + if (url.indexOf(task + 'updategrav') !== -1) { + if (result.status == 'success') { + $('[data-gpm-grav]').remove(); + toastr.success(result.message + window.grav_available_version); + $('#footer .grav-version').html(window.grav_available_version); + + /*// hide the update button after successfull update and update the badges + $('[data-maintenance-update]').fadeOut(); + $('.badges.with-updates').removeClass('with-updates').find('.badge.updates').remove();*/ + } else { + toastr.success(result.message); + } + } else { + toastr.success(result.message); + } + } + }).always(function() { + GPMRefresh(); + $('[data-maintenance-update]').removeAttr('disabled').find('> .fa').removeClass('fa-refresh fa-spin').addClass('fa-cloud-download'); + }); + }); + + // Update plugins/themes + $('[data-ajax]').on('click', function(e) { + + var button = $(this), + icon = button.find('> .fa'), + url = button.data('ajax'); + + var iconClasses = [], + helperClasses = [ 'fa-lg', 'fa-2x', 'fa-3x', 'fa-4x', 'fa-5x', + 'fa-fw', 'fa-ul', 'fa-li', 'fa-border', + 'fa-rotate-90', 'fa-rotate-180', 'fa-rotate-270', + 'fa-flip-horizontal', 'fa-flip-vertical' ]; + + // Disable button + button.attr('disabled','disabled'); + + // Swap fontawesome icon to loader + $.each(icon.attr('class').split(/\s+/), function (i, classname) { + if (classname.indexOf('fa-') === 0 && $.inArray(classname, helperClasses) === -1) { + iconClasses.push(classname); + icon.removeClass(classname); + } + }); + icon.addClass('fa-refresh fa-spin'); + + GravAjax({ + dataType: "json", + url: url, + toastErrors: true, + success: function(result, status) { + var task = 'task' + GravAdmin.config.param_sep; + + var toastrBackup = {}; + if (result.toastr) { + for (var setting in result.toastr) { if (result.toastr.hasOwnProperty(setting)) { + toastrBackup[setting] = toastr.options[setting]; + toastr.options[setting] = result.toastr[setting]; + } + } + } + + toastr.success(result.message || translations.PLUGIN_ADMIN.TASK_COMPLETED); + + for (var setting in toastrBackup) { if (toastrBackup.hasOwnProperty(setting)) { + toastr.options[setting] = toastrBackup[setting]; + } + } + + if (url.indexOf(task + 'backup') !== -1) { + //Reset backup days count + $('.backups-chart .numeric').html("0 " + translations.PLUGIN_ADMIN.DAYS + ""); + + var data = { + series: [0,100] + }; + + var options = { + donut: true, + donutWidth: 10, + startAngle: 0, + total: 100, + showLabel: false, + height: 150 + }; + + Chartist.Pie('.backups-chart .ct-chart', data, options); + } + } + }).always(function() { + // Restore button + button.removeAttr('disabled'); + icon.removeClass('fa-refresh fa-spin').addClass(iconClasses.join(' ')); + }); + }); + + $('[data-gpm-checkupdates]').on('click', function(){ + var element = $(this); + element.find('i').addClass('fa-spin'); + GPMRefresh({ + flush: true, + callback: function(response) { + var payload = response.status == 'success' ? response.payload : false; + element.find('i').removeClass('fa-spin'); + + if (payload) { + if (!payload.grav.isUpdatable && !payload.resources.total) { + toastr.success(translations.PLUGIN_ADMIN.EVERYTHING_UP_TO_DATE); + } else { + var grav = payload.grav.isUpdatable ? 'Grav v' + payload.grav.available : ''; + var resources = payload.resources.total ? payload.resources.total + ' ' + translations.PLUGIN_ADMIN.UPDATES_ARE_AVAILABLE: ''; + + if (!resources) { grav += ' ' + translations.PLUGIN_ADMIN.IS_AVAILABLE_FOR_UPDATE } + toastr.info(grav + (grav && resources ? ' ' + translations.PLUGIN_ADMIN.AND + ' ' : '') + resources); + } + } + } + }); + }); + + var GPMRefresh = function (options) { + options = options || {}; + + var data = { + task: 'GPM', + action: 'getUpdates' + }; + + if (options.flush) { data.flush = true; } + + GravAjax({ + dataType: "JSON", + url: window.location.href, + method: "POST", + data: data, + toastErrors: true, + success: function (response) { + var grav = response.payload.grav, + installed = response.payload.installed, + resources = response.payload.resources, + task = 'task' + GravAdmin.config.param_sep; + + // grav updatable + if (grav.isUpdatable) { + var icon = ' '; + content = 'Grav v{available} ' + translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE + '! (' + translations.PLUGIN_ADMIN.CURRENT + ': v{version}) ', + button = ''; + + if (grav.isSymlink) { + button = ''; + } + + content = jQuery.substitute(content, {available: grav.available, version: grav.version}); + $('[data-gpm-grav]').addClass('grav').html('

' + icon + content + button + '

'); + window.grav_available_version = grav.available; + } + + $('#grav-update-button').on('click', function() { + $(this).html(translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT + ' ' + bytesToSize(grav.assets['grav-update'].size) + '..'); + }); + + // dashboard + if ($('.updates-chart').length) { + var missing = (resources.total + (grav.isUpdatable ? 1 : 0)) * 100 / (installed + (grav.isUpdatable ? 1 : 0)), + updated = 100 - missing; + UpdatesChart.update({series: [updated, missing]}); + if (resources.total) { + $('#updates [data-maintenance-update]').fadeIn(); + } + } + + if (!resources.total) { + $('#updates [data-maintenance-update]').fadeOut(); + $('.badges.with-updates').removeClass('with-updates').find('.badge.updates').remove(); + } else { + var length, + icon = '', + content = '{updates} ' + translations.PLUGIN_ADMIN.OF_YOUR + ' {type} ' + translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE, + button = '' + translations.PLUGIN_ADMIN.UPDATE + ' {Type}', + plugins = $('.grav-update.plugins'), + themes = $('.grav-update.themes'), + sidebar = {plugins: $('#admin-menu a[href$="/plugins"]'), themes: $('#admin-menu a[href$="/themes"]')}; + + // sidebar + if (sidebar.plugins.length || sidebar.themes.length) { + var length, badges; + if (sidebar.plugins.length && (length = Object.keys(resources.plugins).length)) { + badges = sidebar.plugins.find('.badges'); + badges.addClass('with-updates'); + badges.find('.badge.updates').text(length); + } + + if (sidebar.themes.length && (length = Object.keys(resources.themes).length)) { + badges = sidebar.themes.find('.badges'); + badges.addClass('with-updates'); + badges.find('.badge.updates').text(length); + } + } + + // list page + if (plugins[0] && (length = Object.keys(resources.plugins).length)) { + content = jQuery.substitute(content, {updates: length, type: 'plugins'}); + button = jQuery.substitute(button, {Type: 'All Plugins', location: GravAdmin.config.base_url_relative + '/plugins'}); + plugins.html('

' + icon + content + button + '

'); + + var plugin, url; + $.each(resources.plugins, function (key, value) { + plugin = $('[data-gpm-plugin="' + key + '"] .gpm-name'); + url = plugin.find('a'); + if (!plugin.find('.badge.update').length) { + plugin.append('' + translations.PLUGIN_ADMIN.UPDATE_AVAILABLE + '!'); + } + + }); + } + + if (themes[0] && (length = Object.keys(resources.themes).length)) { + content = jQuery.substitute(content, {updates: length, type: 'themes'}); + button = jQuery.substitute(button, {Type: 'All Themes', location: GravAdmin.config.base_url_relative + '/themes'}); + themes.html('

' + icon + content + button + '

'); + + var theme, url; + $.each(resources.themes, function (key, value) { + theme = $('[data-gpm-theme="' + key + '"]'); + url = theme.find('.gpm-name a'); + theme.append(''); + }); + } + + // details page + var type = 'plugin', + details = $('.grav-update.plugin')[0]; + + if (!details) { + details = $('.grav-update.theme')[0]; + type = 'theme'; + } + + if (details){ + var slug = $('[data-gpm-' + type + ']').data('gpm-' + type), + Type = type.charAt(0).toUpperCase() + type.substring(1), + resource = resources[type + 's'][slug]; + + if (resource) { + content = 'v{available} ' + translations.PLUGIN_ADMIN.OF_THIS + ' ' + type + ' ' + translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE + '!'; + content = jQuery.substitute(content, { available: resource.available }); + button = jQuery.substitute(button, { + Type: Type, + location: GravAdmin.config.base_url_relative + '/' + type + 's/' + slug + }); + $(details).html('

' + icon + content + button + '

'); + } + } + } + + if (options.callback && typeof options.callback == 'function') options.callback(response); + } + }); + }; + + if (GravAdmin.config.enable_auto_updates_check === '1') { + GPMRefresh(); + } + + function reIndex (collection) { + var holder = collection.find('[data-collection-holder]'), + addBtn = collection.find('[data-action="add"]'), + prefix = holder.data('collection-holder'), + index = 0; + + holder.find('[data-collection-item]').each(function () { + var item = $(this), + currentIndex = item.attr('data-collection-key'); + + if (index != currentIndex) { + var r = new RegExp('^' + prefix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + '[\.\[]' + currentIndex); + + item.attr('data-collection-item', item.attr('data-collection-item').replace(r, prefix + '.' + index)); + item.attr('data-collection-key', index); + item.find('[name]').each(function () { + $(this).attr('name', $(this).attr('name').replace(r, prefix + '[' + index)); + }); + } + + index++; + }); + + addBtn.data('key-index', index); + } + + // Collections + $('[data-type="collection"]').each(function () { + var el = $(this), + holder = el.find('[data-collection-holder]'), + config = el.find('[data-collection-config]'), + isArray = config.data('collection-array'), + template = el.find('[data-collection-template="new"]').html(); + + // make sortable + new Sortable(holder[0], { + filter: '.form-input-wrapper', + onUpdate: function () { + if (isArray) + reIndex(el); + } + }); + + // hook up delete + el.on('click', '[data-action="delete"]', function (e) { + $(this).closest('[data-collection-item]').remove(); + if (isArray) + reIndex(el); + }); + + // hook up add + el.find('[data-action="add"]').on('click', function (e) { + var button = $(this), + key = button.data('key-index'), + newItem = $(template); + + newItem.attr('data-collection-item', newItem.attr('data-collection-item').replace('*', key)); + newItem.attr('data-collection-key', key); + newItem.find('[name]').each(function () { + $(this).attr('name', $(this).attr('name').replace('*', key)); + }); + + holder.append(newItem); + button.data('key-index', ++key); + }); + }); + + // enable the toggleable checkbox when typing in the corresponding textarea/input element + jQuery(document).on('input propertychange click', '.form-data textarea, .form-data input, .form-data label, .form-data .selectize-input', function() { + var item = this; + + var checkbox = $(item).parents('.form-field').find('.toggleable input[type="checkbox"]'); + + if (checkbox.length > 0) { + checkbox.prop('checked', true); + } + + $(this).css('opacity', 1); + $(this).parents('.form-data').css('opacity', 1); + checkbox.css('opacity', 1); + checkbox.prop('checked', true); + checkbox.prop('value', 1); + checkbox.siblings('label').css('opacity', 1); + checkbox.parent().siblings('label').css('opacity', 1); + }); + + // when clicking the label, click the corresponding checkbox automatically + jQuery(document).on('click', 'label.toggleable', function() { + var input = $(this).siblings('.checkboxes.toggleable').find('input'); + var on = !input.is(':checked'); + + input.prop('checked', on); + input.prop('value', on ? 1 : 0); + $(this).css('opacity', on ? 1 : 0.7); + input.siblings('label').css('opacity', on ? 1 : 0.7); + $(this).parents('.form-label').siblings('.form-data').css('opacity', on ? 1 : 0.7); + + }); + + // Themes Switcher Warning + $(document).on('mousedown', '[data-remodal-target="theme-switch-warn"]', function(e){ + var name = $(e.target).closest('[data-gpm-theme]').find('.gpm-name a').text(), + remodal = $('.remodal.theme-switcher'); + + remodal.find('strong').text(name); + remodal.find('.button.continue').attr('href', $(e.target).attr('href')); + }); + + // Setup keep-alive on pages that have at least one element with data-grav-keepalive="true" set + if ($(document).find('[data-grav-keepalive="true"]').length > 0) { + setInterval(function() { + keepAlive(); + }, (GravAdmin.config.admin_timeout/2)*1000); + } +}); diff --git a/user/plugins/admin/themes/grav/js/ajax.js b/user/plugins/admin/themes/grav/js/ajax.js new file mode 100644 index 0000000..50c6bd3 --- /dev/null +++ b/user/plugins/admin/themes/grav/js/ajax.js @@ -0,0 +1,96 @@ +$(function(){ + var root = window || {}; + + root.GravAjax = function (url, settings) { + settings = typeof settings === 'undefined' ? typeof url === 'string' ? {} : url : settings; + settings.url = typeof settings.url === 'undefined' && typeof url === 'string' ? url : settings.url; + + var callbacks = { + success: typeof settings.success !== 'undefined' ? typeof settings.success === 'function' ? [ settings.success ] : settings.success : [], + error: typeof settings.error !== 'undefined' ? typeof settings.error === 'function' ? [ settings.error ] : settings.error : [] + }; + + if (settings.toastErrors) { + callbacks.error.push(root.GravAjax.toastErrorHandler); + delete settings.toastErrors; + } + + delete settings.success; + delete settings.error; + + var deferred = $.Deferred(), + jqxhr = $.ajax(settings); + + jqxhr.done(function (response, status, xhr) { + var responseObject = { + response: response, + status: status, + xhr: xhr + }; + + switch (response.status) { + case "unauthenticated": + document.location.href = GravAdmin.config.base_url_relative; + throw "Logged out"; + break; + case "unauthorized": + responseObject.response.message = responseObject.response.message || "Unauthorized."; + root.GravAjax.errorHandler(deferred, callbacks, responseObject); + break; + case "error": + responseObject.response.message = responseObject.response.message || "Unknown error."; + root.GravAjax.errorHandler(deferred, callbacks, responseObject); + break; + case "success": + root.GravAjax.successHandler(deferred, callbacks, responseObject); + break; + default: + responseObject.response.message = responseObject.response.message || "Invalid AJAX response."; + root.GravAjax.errorHandler(deferred, callbacks, responseObject); + break; + } + }); + + jqxhr.fail(function (xhr, status, error) { + var response = { + status: 'error', + message: error + }; + + root.GravAjax.errorHandler(deferred, callbacks, { xhr: xhr, status: status, response: response}); + }); + + root.GravAjax.jqxhr = jqxhr; + + return deferred; + + }; + + root.GravAjax.successHandler = function (promise, callbacks, response) { + callbacks = callbacks.success; + for (var i = 0; i < callbacks.length; i++) { + if (typeof callbacks[i] === 'function') { + callbacks[i](response.response, response.status, response.xhr); + } + } + + promise.resolve(response.response, response.status, response.xhr); + }; + + root.GravAjax.errorHandler = function (promise, callbacks, response) { + callbacks = callbacks.error; + for (var i = 0; i < callbacks.length; i++) { + if (typeof callbacks[i] === 'function') { + callbacks[i](response.xhr, response.status, response.response.message); + } + } + + promise.reject(response.xhr, response.status, response.response.message); + }; + + root.GravAjax.toastErrorHandler = function (xhr, status, error) { + if (status !== 'abort') { + toastr.error(error); + } + }; +}); diff --git a/user/plugins/admin/themes/grav/js/chartist.min.js b/user/plugins/admin/themes/grav/js/chartist.min.js new file mode 100644 index 0000000..b69e484 --- /dev/null +++ b/user/plugins/admin/themes/grav/js/chartist.min.js @@ -0,0 +1,9 @@ +/* Chartist.js 0.9.4 + * Copyright © 2015 Gion Kunz + * Free to use under the WTFPL license. + * http://www.wtfpl.net/ + */ + +!function(a,b){"function"==typeof define&&define.amd?define([],function(){return a.Chartist=b()}):"object"==typeof exports?module.exports=b():a.Chartist=b()}(this,function(){var a={version:"0.9.4"};return function(a,b,c){"use strict";c.noop=function(a){return a},c.alphaNumerate=function(a){return String.fromCharCode(97+a%26)},c.extend=function(a){a=a||{};var b=Array.prototype.slice.call(arguments,1);return b.forEach(function(b){for(var d in b)"object"!=typeof b[d]||null===b[d]||b[d]instanceof Array?a[d]=b[d]:a[d]=c.extend({},a[d],b[d])}),a},c.replaceAll=function(a,b,c){return a.replace(new RegExp(b,"g"),c)},c.stripUnit=function(a){return"string"==typeof a&&(a=a.replace(/[^0-9\+-\.]/g,"")),+a},c.ensureUnit=function(a,b){return"number"==typeof a&&(a+=b),a},c.querySelector=function(a){return a instanceof Node?a:b.querySelector(a)},c.times=function(a){return Array.apply(null,new Array(a))},c.sum=function(a,b){return a+(b?b:0)},c.mapMultiply=function(a){return function(b){return b*a}},c.mapAdd=function(a){return function(b){return b+a}},c.serialMap=function(a,b){var d=[],e=Math.max.apply(null,a.map(function(a){return a.length}));return c.times(e).forEach(function(c,e){var f=a.map(function(a){return a[e]});d[e]=b.apply(null,f)}),d},c.roundWithPrecision=function(a,b){var d=Math.pow(10,b||c.precision);return Math.round(a*d)/d},c.precision=8,c.escapingMap={"&":"&","<":"<",">":">",'"':""","'":"'"},c.serialize=function(a){return null===a||void 0===a?a:("number"==typeof a?a=""+a:"object"==typeof a&&(a=JSON.stringify({data:a})),Object.keys(c.escapingMap).reduce(function(a,b){return c.replaceAll(a,b,c.escapingMap[b])},a))},c.deserialize=function(a){if("string"!=typeof a)return a;a=Object.keys(c.escapingMap).reduce(function(a,b){return c.replaceAll(a,c.escapingMap[b],b)},a);try{a=JSON.parse(a),a=void 0!==a.data?a.data:a}catch(b){}return a},c.createSvg=function(a,b,d,e){var f;return b=b||"100%",d=d||"100%",Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS("http://www.w3.org/2000/xmlns/",c.xmlNs.prefix)}).forEach(function(b){a.removeChild(b)}),f=new c.Svg("svg").attr({width:b,height:d}).addClass(e).attr({style:"width: "+b+"; height: "+d+";"}),a.appendChild(f._node),f},c.reverseData=function(a){a.labels.reverse(),a.series.reverse();for(var b=0;bf.high&&(f.high=c),h&&ck,m=e?c.rho(j.range):0;if(e&&c.projectLength(a,1,j)>=d)j.step=1;else if(e&&m=d)j.step=m;else for(;;){if(l&&c.projectLength(a,j.step,j)<=d)j.step*=2;else{if(l||!(c.projectLength(a,j.step/2,j)>=d))break;if(j.step/=2,e&&j.step%1!==0){j.step*=2;break}}if(i++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}for(g=j.min,h=j.max;g+j.step<=j.low;)g+=j.step;for(;h-j.step>=j.high;)h-=j.step;for(j.min=g,j.max=h,j.range=j.max-j.min,j.values=[],f=j.min;f<=j.max;f+=j.step)j.values.push(c.roundWithPrecision(f));return j},c.polarToCartesian=function(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}},c.createChartRect=function(a,b,d){var e=!(!b.axisX&&!b.axisY),f=e?b.axisY.offset:0,g=e?b.axisX.offset:0,h=a.width()||c.stripUnit(b.width)||0,i=a.height()||c.stripUnit(b.height)||0,j=c.normalizePadding(b.chartPadding,d);h=Math.max(h,f+j.left+j.right),i=Math.max(i,g+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return e?("start"===b.axisX.position?(k.y2=j.top+g,k.y1=Math.max(i-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(i-j.bottom-g,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+f,k.x2=Math.max(h-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(h-j.right-f,k.x1+1))):(k.x1=j.left,k.x2=Math.max(h-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(i-j.bottom,k.y2+1)),k},c.createGrid=function(a,b,d,e,f,g,h,i){var j={};j[d.units.pos+"1"]=a,j[d.units.pos+"2"]=a,j[d.counterUnits.pos+"1"]=e,j[d.counterUnits.pos+"2"]=e+f;var k=g.elem("line",j,h.join(" "));i.emit("draw",c.extend({type:"grid",axis:d,index:b,group:g,element:k},j))},c.createLabel=function(a,b,d,e,f,g,h,i,j,k,l){var m,n={};if(n[f.units.pos]=a+h[f.units.pos],n[f.counterUnits.pos]=h[f.counterUnits.pos],n[f.units.len]=b,n[f.counterUnits.len]=g-10,k){var o=''+e[d]+"";m=i.foreignObject(o,c.extend({style:"overflow: visible;"},n))}else m=i.elem("text",n,j.join(" ")).text(e[d]);l.emit("draw",c.extend({type:"label",axis:f,index:d,group:i,element:m,text:e[d]},n))},c.getSeriesOption=function(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]},c.optionsProvider=function(b,d,e){function f(b){var f=h;if(h=c.extend({},j),d)for(i=0;i1){var i=[];return h.forEach(function(a){i.push(g(a.pathCoordinates,a.valueData))}),c.Svg.Path.join(i)}if(a=h[0].pathCoordinates,d=h[0].valueData,a.length<=4)return c.Interpolation.none()(a,d);for(var j,k=(new c.Svg.Path).move(a[0],a[1],!1,d[0]),l=0,m=a.length;m-2*!j>l;l+=2){var n=[{x:+a[l-2],y:+a[l-1]},{x:+a[l],y:+a[l+1]},{x:+a[l+2],y:+a[l+3]},{x:+a[l+4],y:+a[l+5]}];j?l?m-4===l?n[3]={x:+a[0],y:+a[1]}:m-2===l&&(n[2]={x:+a[0],y:+a[1]},n[3]={x:+a[2],y:+a[3]}):n[0]={x:+a[m-2],y:+a[m-1]}:m-4===l?n[3]=n[2]:l||(n[0]={x:+a[l],y:+a[l+1]}),k.curve(e*(-n[0].x+6*n[1].x+n[2].x)/6+f*n[2].x,e*(-n[0].y+6*n[1].y+n[2].y)/6+f*n[2].y,e*(n[1].x+6*n[2].x-n[3].x)/6+f*n[2].x,e*(n[1].y+6*n[2].y-n[3].y)/6+f*n[2].y,n[2].x,n[2].y,!1,d[(l+2)/2])}return k}},c.Interpolation.step=function(a){var b={postpone:!0};return a=c.extend({},b,a),function(b,d){for(var e=new c.Svg.Path,f=!0,g=2;g1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,r).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,r)}).forEach(function(h){var k=i.elem("path",{d:h.stringify()},a.classNames.area,!0).attr({values:b.normalized[g]},c.xmlNs.uri);this.eventEmitter.emit("draw",{type:"area",values:b.normalized[g],path:h.clone(),series:f,seriesIndex:g,axisX:d,axisY:e,chartRect:j,index:g,group:i,element:k})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:e.bounds,chartRect:j,axisX:d,axisY:e,svg:this.svg,options:a})}function e(a,b,d,e){c.Line["super"].constructor.call(this,a,b,f,c.extend({},f,d),e)}var f={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,type:void 0},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,type:void 0,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,showLine:!0,showPoint:!0,showArea:!1,areaBase:0,lineSmooth:!0,low:void 0,high:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},fullWidth:!1,reverseData:!1,classNames:{chart:"ct-chart-line",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",line:"ct-line",point:"ct-point",area:"ct-area",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};c.Line=c.Base.extend({constructor:e,createChart:d})}(window,document,a),function(a,b,c){"use strict";function d(a){var b,d={raw:this.data,normalized:a.distributeSeries?c.getDataArray(this.data,a.reverseData,a.horizontalBars?"x":"y").map(function(a){return[a]}):c.getDataArray(this.data,a.reverseData,a.horizontalBars?"x":"y")};this.svg=c.createSvg(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var e=this.svg.elem("g").addClass(a.classNames.gridGroup),g=this.svg.elem("g"),h=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars){var i=c.serialMap(d.normalized,function(){return Array.prototype.slice.call(arguments).map(function(a){return a}).reduce(function(a,b){return{x:a.x+b.x||0,y:a.y+b.y||0}},{x:0,y:0})});b=c.getHighLow([i],c.extend({},a,{referenceValue:0}),a.horizontalBars?"x":"y")}else b=c.getHighLow(d.normalized,c.extend({},a,{referenceValue:0}),a.horizontalBars?"x":"y");b.high=+a.high||(0===a.high?0:b.high),b.low=+a.low||(0===a.low?0:b.low);var j,k,l,m,n,o=c.createChartRect(this.svg,a,f.padding);k=a.distributeSeries&&a.stackBars?d.raw.labels.slice(0,1):d.raw.labels,a.horizontalBars?(j=m=void 0===a.axisX.type?new c.AutoScaleAxis(c.Axis.units.x,d,o,c.extend({},a.axisX,{highLow:b,referenceValue:0})):a.axisX.type.call(c,c.Axis.units.x,d,o,c.extend({},a.axisX,{highLow:b,referenceValue:0})),l=n=void 0===a.axisY.type?new c.StepAxis(c.Axis.units.y,d,o,{ticks:k}):a.axisY.type.call(c,c.Axis.units.y,d,o,a.axisY)):(l=m=void 0===a.axisX.type?new c.StepAxis(c.Axis.units.x,d,o,{ticks:k}):a.axisX.type.call(c,c.Axis.units.x,d,o,a.axisX),j=n=void 0===a.axisY.type?new c.AutoScaleAxis(c.Axis.units.y,d,o,c.extend({},a.axisY,{highLow:b,referenceValue:0})):a.axisY.type.call(c,c.Axis.units.y,d,o,c.extend({},a.axisY,{highLow:b,referenceValue:0})));var p=a.horizontalBars?o.x1+j.projectValue(0):o.y1-j.projectValue(0),q=[];l.createGridAndLabels(e,h,this.supportsForeignObject,a,this.eventEmitter),j.createGridAndLabels(e,h,this.supportsForeignObject,a,this.eventEmitter),d.raw.series.forEach(function(b,e){var f,h,i=e-(d.raw.series.length-1)/2;f=a.distributeSeries&&!a.stackBars?l.axisLength/d.normalized.length/2:a.distributeSeries&&a.stackBars?l.axisLength/2:l.axisLength/d.normalized[e].length/2,h=g.elem("g"),h.attr({"series-name":b.name,meta:c.serialize(b.meta)},c.xmlNs.uri),h.addClass([a.classNames.series,b.className||a.classNames.series+"-"+c.alphaNumerate(e)].join(" ")),d.normalized[e].forEach(function(g,k){var r,s,t,u;if(u=a.distributeSeries&&!a.stackBars?e:a.distributeSeries&&a.stackBars?0:k,r=a.horizontalBars?{x:o.x1+j.projectValue(g&&g.x?g.x:0,k,d.normalized[e]),y:o.y1-l.projectValue(g&&g.y?g.y:0,u,d.normalized[e])}:{x:o.x1+l.projectValue(g&&g.x?g.x:0,u,d.normalized[e]),y:o.y1-j.projectValue(g&&g.y?g.y:0,k,d.normalized[e])},l instanceof c.StepAxis&&(l.options.stretch||(r[l.units.pos]+=f*(a.horizontalBars?-1:1)),r[l.units.pos]+=a.stackBars||a.distributeSeries?0:i*a.seriesBarDistance*(a.horizontalBars?-1:1)),t=q[k]||p,q[k]=t-(p-r[l.counterUnits.pos]),void 0!==g){var v={};v[l.units.pos+"1"]=r[l.units.pos],v[l.units.pos+"2"]=r[l.units.pos],v[l.counterUnits.pos+"1"]=a.stackBars?t:p,v[l.counterUnits.pos+"2"]=a.stackBars?q[k]:r[l.counterUnits.pos],v.x1=Math.min(Math.max(v.x1,o.x1),o.x2),v.x2=Math.min(Math.max(v.x2,o.x1),o.x2),v.y1=Math.min(Math.max(v.y1,o.y2),o.y1),v.y2=Math.min(Math.max(v.y2,o.y2),o.y1),s=h.elem("line",v,a.classNames.bar).attr({value:[g.x,g.y].filter(function(a){return a}).join(","),meta:c.getMetaData(b,k)},c.xmlNs.uri), +this.eventEmitter.emit("draw",c.extend({type:"bar",value:g,index:k,meta:c.getMetaData(b,k),series:b,seriesIndex:e,axisX:m,axisY:n,chartRect:o,group:h,element:s},v))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:j.bounds,chartRect:o,axisX:m,axisY:n,svg:this.svg,options:a})}function e(a,b,d,e){c.Bar["super"].constructor.call(this,a,b,f,c.extend({},f,d),e)}var f={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,onlyInteger:!1,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,horizontalBars:!1,distributeSeries:!1,reverseData:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};c.Bar=c.Base.extend({constructor:e,createChart:d})}(window,document,a),function(a,b,c){"use strict";function d(a,b,c){var d=b.x>a.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}function e(a){var b,e,f,h,i,j=[],k=a.startAngle,l=c.getDataArray(this.data,a.reverseData);this.svg=c.createSvg(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie),e=c.createChartRect(this.svg,a,g.padding),f=Math.min(e.width()/2,e.height()/2),i=a.total||l.reduce(function(a,b){return a+b},0),f-=a.donut?a.donutWidth/2:0,h="outside"===a.labelPosition||a.donut?f:"center"===a.labelPosition?0:f/2,h+=a.labelOffset;var m={x:e.x1+e.width()/2,y:e.y2+e.height()/2},n=1===this.data.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;a.showLabel&&(b=this.svg.elem("g",null,null,!0));for(var o=0;o180,0,r.x,r.y);a.donut||t.line(m.x,m.y);var u=j[o].elem("path",{d:t.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(u.attr({value:l[o],meta:c.serialize(p.meta)},c.xmlNs.uri),a.donut&&u.attr({style:"stroke-width: "+ +a.donutWidth+"px"}),this.eventEmitter.emit("draw",{type:"slice",value:l[o],totalDataSum:i,index:o,meta:p.meta,series:p,group:j[o],element:u,path:t.clone(),center:m,radius:f,startAngle:k,endAngle:q}),a.showLabel){var v=c.polarToCartesian(m.x,m.y,h,k+(q-k)/2),w=a.labelInterpolationFnc(this.data.labels?this.data.labels[o]:l[o],o);if(w||0===w){var x=b.elem("text",{dx:v.x,dy:v.y,"text-anchor":d(m,v,a.labelDirection)},a.classNames.label).text(""+w);this.eventEmitter.emit("draw",{type:"label",index:o,group:b,element:x,text:""+w,x:v.x,y:v.y})}}k=q}this.eventEmitter.emit("created",{chartRect:e,svg:this.svg,options:a})}function f(a,b,d,e){c.Pie["super"].constructor.call(this,a,b,g,c.extend({},g,d),e)}var g={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:c.noop,labelDirection:"neutral",reverseData:!1};c.Pie=c.Base.extend({constructor:f,createChart:e,determineAnchorPosition:d})}(window,document,a),a}); +//# sourceMappingURL=chartist.min.js.map \ No newline at end of file diff --git a/user/plugins/admin/themes/grav/js/codemirror-compressed.js b/user/plugins/admin/themes/grav/js/codemirror-compressed.js new file mode 100644 index 0000000..32f42a7 --- /dev/null +++ b/user/plugins/admin/themes/grav/js/codemirror-compressed.js @@ -0,0 +1,23 @@ +/* CodeMirror - Minified & Bundled + Generated on 7/30/2015 with http://codemirror.net/doc/compress.html + Version: 5.5 + + CodeMirror Library: + - codemirror.js + Modes: + - css.js + - gfm.js + - htmlmixed.js + - javascript.js + - markdown.js + - php.js + - sass.js + - twig.js + - xml.js + - yaml.js + Add-ons: + - continuelist.js + - overlay.js + */ + +(function(a){if(typeof exports=="object"&&typeof module=="object"){module.exports=a()}else{if(typeof define=="function"&&define.amd){return define([],a)}else{this.CodeMirror=a()}}})(function(){var co=/gecko\/\d/i.test(navigator.userAgent);var eK=/MSIE \d/.test(navigator.userAgent);var bJ=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);var dK=eK||bJ;var k=dK&&(eK?document.documentMode||6:bJ[1]);var c0=/WebKit\//.test(navigator.userAgent);var dN=c0&&/Qt\/\d+\.\d+/.test(navigator.userAgent);var dc=/Chrome\//.test(navigator.userAgent);var d3=/Opera\//.test(navigator.userAgent);var aC=/Apple Computer/.test(navigator.vendor);var c7=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);var fu=/PhantomJS/.test(navigator.userAgent);var e1=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent);var eg=e1||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);var b7=e1||/Mac/.test(navigator.platform);var aP=/win/i.test(navigator.platform);var aZ=d3&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);if(aZ){aZ=Number(aZ[1])}if(aZ&&aZ>=15){d3=false;c0=true}var bQ=b7&&(dN||d3&&(aZ==null||aZ<12.11));var ga=co||(dK&&k>=9);var gd=false,a7=false;function H(gj,gl){if(!(this instanceof H)){return new H(gj,gl)}this.options=gl=gl?aN(gl):{};aN(e3,gl,false);ce(gl);var gp=gl.value;if(typeof gp=="string"){gp=new at(gp,gl.mode,null,gl.lineSeparator)}this.doc=gp;var gk=new H.inputStyles[gl.inputStyle](this);var go=this.display=new eI(gj,gp,gk);go.wrapper.CodeMirror=this;ec(this);cO(this);if(gl.lineWrapping){this.display.wrapper.className+=" CodeMirror-wrap"}if(gl.autofocus&&!eg){go.input.focus()}aD(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:false,delayingBlurEvent:false,focused:false,suppressEdits:false,pasteIncoming:false,cutIncoming:false,draggingText:false,highlight:new gh(),keySeq:null,specialChars:null};var gi=this;if(dK&&k<11){setTimeout(function(){gi.display.input.reset(true)},20)}fQ(this);bj();cI(this);this.curOp.forceUpdate=true;eb(this,gp);if((gl.autofocus&&!eg)||gi.hasFocus()){setTimeout(cv(cB,this),20)}else{aV(this)}for(var gn in bf){if(bf.hasOwnProperty(gn)){bf[gn](this,gl[gn],cc)}}d5(this);if(gl.finishInit){gl.finishInit(this)}for(var gm=0;gmgk.maxLineLength){gk.maxLineLength=gl;gk.maxLine=gm}})}function ce(gi){var gj=dh(gi.gutters,"CodeMirror-linenumbers");if(gj==-1&&gi.lineNumbers){gi.gutters=gi.gutters.concat(["CodeMirror-linenumbers"])}else{if(gj>-1&&!gi.lineNumbers){gi.gutters=gi.gutters.slice(0);gi.gutters.splice(gj,1)}}}function dA(gi){var gl=gi.display,gk=gl.gutters.offsetWidth;var gj=Math.round(gi.doc.height+bI(gi.display));return{clientHeight:gl.scroller.clientHeight,viewHeight:gl.wrapper.clientHeight,scrollWidth:gl.scroller.scrollWidth,clientWidth:gl.scroller.clientWidth,viewWidth:gl.wrapper.clientWidth,barLeft:gi.options.fixedGutter?gk:0,docHeight:gj,scrollHeight:gj+cT(gi)+gl.barHeight,nativeBarWidth:gl.nativeBarWidth,gutterWidth:gk}}function dk(gk,gj,gi){this.cm=gi;var gl=this.vert=f3("div",[f3("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar");var gm=this.horiz=f3("div",[f3("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");gk(gl);gk(gm);bX(gl,"scroll",function(){if(gl.clientHeight){gj(gl.scrollTop,"vertical")}});bX(gm,"scroll",function(){if(gm.clientWidth){gj(gm.scrollLeft,"horizontal")}});this.checkedOverlay=false;if(dK&&k<8){this.horiz.style.minHeight=this.vert.style.minWidth="18px"}}dk.prototype=aN({update:function(gl){var gm=gl.scrollWidth>gl.clientWidth+1;var gk=gl.scrollHeight>gl.clientHeight+1;var gn=gl.nativeBarWidth;if(gk){this.vert.style.display="block";this.vert.style.bottom=gm?gn+"px":"0";var gj=gl.viewHeight-(gm?gn:0);this.vert.firstChild.style.height=Math.max(0,gl.scrollHeight-gl.clientHeight+gj)+"px"}else{this.vert.style.display="";this.vert.firstChild.style.height="0"}if(gm){this.horiz.style.display="block";this.horiz.style.right=gk?gn+"px":"0";this.horiz.style.left=gl.barLeft+"px";var gi=gl.viewWidth-gl.barLeft-(gk?gn:0);this.horiz.firstChild.style.width=(gl.scrollWidth-gl.clientWidth+gi)+"px"}else{this.horiz.style.display="";this.horiz.firstChild.style.width="0"}if(!this.checkedOverlay&&gl.clientHeight>0){if(gn==0){this.overlayHack()}this.checkedOverlay=true}return{right:gk?gn:0,bottom:gm?gn:0}},setScrollLeft:function(gi){if(this.horiz.scrollLeft!=gi){this.horiz.scrollLeft=gi}},setScrollTop:function(gi){if(this.vert.scrollTop!=gi){this.vert.scrollTop=gi}},overlayHack:function(){var gi=b7&&!c7?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=gi;var gj=this;var gk=function(gl){if(L(gl)!=gj.vert&&L(gl)!=gj.horiz){c2(gj.cm,eu)(gl)}};bX(this.vert,"mousedown",gk);bX(this.horiz,"mousedown",gk)},clear:function(){var gi=this.horiz.parentNode;gi.removeChild(this.horiz);gi.removeChild(this.vert)}},dk.prototype);function e4(){}e4.prototype=aN({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},e4.prototype);H.scrollbarModel={"native":dk,"null":e4};function aD(gi){if(gi.display.scrollbars){gi.display.scrollbars.clear();if(gi.display.scrollbars.addClass){f(gi.display.wrapper,gi.display.scrollbars.addClass)}}gi.display.scrollbars=new H.scrollbarModel[gi.options.scrollbarStyle](function(gj){gi.display.wrapper.insertBefore(gj,gi.display.scrollbarFiller);bX(gj,"mousedown",function(){if(gi.state.focused){setTimeout(function(){gi.display.input.focus()},0)}});gj.setAttribute("cm-not-content","true")},function(gk,gj){if(gj=="horizontal"){bE(gi,gk)}else{N(gi,gk)}},gi);if(gi.display.scrollbars.addClass){fA(gi.display.wrapper,gi.display.scrollbars.addClass)}}function eY(gk,gm){if(!gm){gm=dA(gk)}var gj=gk.display.barWidth,gi=gk.display.barHeight;aU(gk,gm);for(var gl=0;gl<4&&gj!=gk.display.barWidth||gi!=gk.display.barHeight;gl++){if(gj!=gk.display.barWidth&&gk.options.lineWrapping){a9(gk)}aU(gk,dA(gk));gj=gk.display.barWidth;gi=gk.display.barHeight}}function aU(gi,gj){var gl=gi.display;var gk=gl.scrollbars.update(gj);gl.sizer.style.paddingRight=(gl.barWidth=gk.right)+"px";gl.sizer.style.paddingBottom=(gl.barHeight=gk.bottom)+"px";if(gk.right&&gk.bottom){gl.scrollbarFiller.style.display="block";gl.scrollbarFiller.style.height=gk.bottom+"px";gl.scrollbarFiller.style.width=gk.right+"px"}else{gl.scrollbarFiller.style.display=""}if(gk.bottom&&gi.options.coverGutterNextToScrollbar&&gi.options.fixedGutter){gl.gutterFiller.style.display="block";gl.gutterFiller.style.height=gk.bottom+"px";gl.gutterFiller.style.width=gj.gutterWidth+"px"}else{gl.gutterFiller.style.display=""}}function b6(gl,gp,gk){var gm=gk&&gk.top!=null?Math.max(0,gk.top):gl.scroller.scrollTop;gm=Math.floor(gm-e8(gl));var gi=gk&&gk.bottom!=null?gk.bottom:gm+gl.wrapper.clientHeight;var gn=bG(gp,gm),go=bG(gp,gi);if(gk&&gk.ensure){var gj=gk.ensure.from.line,gq=gk.ensure.to.line;if(gj=go){gn=bG(gp,bM(ff(gp,gq))-gl.wrapper.clientHeight);go=gq}}}return{from:gn,to:Math.max(go,gn+1)}}function eE(gq){var go=gq.display,gp=go.view;if(!go.alignWidgets&&(!go.gutters.firstChild||!gq.options.fixedGutter)){return}var gm=dX(go)-go.scroller.scrollLeft+gq.doc.scrollLeft;var gi=go.gutters.offsetWidth,gj=gm+"px";for(var gl=0;gl=gm.viewFrom&&gl.visible.to<=gm.viewTo&&(gm.updateLineNumbers==null||gm.updateLineNumbers>=gm.viewTo)&&gm.renderedView==gm.view&&db(gr)==0){return false}if(d5(gr)){ex(gr);gl.dims=fd(gr)}var gk=gq.first+gq.size;var go=Math.max(gl.visible.from-gr.options.viewportMargin,gq.first);var gp=Math.min(gk,gl.visible.to+gr.options.viewportMargin);if(gm.viewFromgp&&gm.viewTo-gp<20){gp=Math.min(gk,gm.viewTo)}if(a7){go=aW(gr.doc,go);gp=d2(gr.doc,gp)}var gj=go!=gm.viewFrom||gp!=gm.viewTo||gm.lastWrapHeight!=gl.wrapperHeight||gm.lastWrapWidth!=gl.wrapperWidth;cR(gr,go,gp);gm.viewOffset=bM(ff(gr.doc,gm.viewFrom));gr.display.mover.style.top=gm.viewOffset+"px";var gi=db(gr);if(!gj&&gi==0&&!gl.force&&gm.renderedView==gm.view&&(gm.updateLineNumbers==null||gm.updateLineNumbers>=gm.viewTo)){return false}var gn=dO();if(gi>4){gm.lineDiv.style.display="none"}cm(gr,gm.updateLineNumbers,gl.dims);if(gi>4){gm.lineDiv.style.display=""}gm.renderedView=gm.view;if(gn&&dO()!=gn&&gn.offsetHeight){gn.focus()}d1(gm.cursorDiv);d1(gm.selectionDiv);gm.gutters.style.height=gm.sizer.style.minHeight=0;if(gj){gm.lastWrapHeight=gl.wrapperHeight;gm.lastWrapWidth=gl.wrapperWidth;ef(gr,400)}gm.updateLineNumbers=null;return true}function cj(gj,gm){var gi=gm.viewport;for(var gl=true;;gl=false){if(!gl||!gj.options.lineWrapping||gm.oldDisplayWidth==dl(gj)){if(gi&&gi.top!=null){gi={top:Math.min(gj.doc.height+bI(gj.display)-cV(gj),gi.top)}}gm.visible=b6(gj.display,gj.doc,gi);if(gm.visible.from>=gj.display.viewFrom&&gm.visible.to<=gj.display.viewTo){break}}if(!B(gj,gm)){break}a9(gj);var gk=dA(gj);bC(gj);dz(gj,gk);eY(gj,gk)}gm.signal(gj,"update",gj);if(gj.display.viewFrom!=gj.display.reportedViewFrom||gj.display.viewTo!=gj.display.reportedViewTo){gm.signal(gj,"viewportChange",gj,gj.display.viewFrom,gj.display.viewTo);gj.display.reportedViewFrom=gj.display.viewFrom;gj.display.reportedViewTo=gj.display.viewTo}}function dT(gj,gi){var gl=new aI(gj,gi);if(B(gj,gl)){a9(gj);cj(gj,gl);var gk=dA(gj);bC(gj);dz(gj,gk);eY(gj,gk);gl.finish()}}function dz(gi,gj){gi.display.sizer.style.minHeight=gj.docHeight+"px";var gk=gj.docHeight+gi.display.barHeight;gi.display.heightForcer.style.top=gk+"px";gi.display.gutters.style.height=Math.max(gk+cT(gi),gj.clientHeight)+"px"}function a9(gp){var gn=gp.display;var gj=gn.lineDiv.offsetTop;for(var gk=0;gk0.001||go<-0.001){f6(gq.line,gr);cb(gq.line);if(gq.rest){for(var gi=0;gi-1){gr=false}ab(gt,gm,gn,gs)}if(gr){d1(gm.lineNumber);gm.lineNumber.appendChild(document.createTextNode(es(gt.options,gn)))}gu=gm.node.nextSibling}}gn+=gm.size}while(gu){gu=go(gu)}}function ab(gi,gk,gm,gn){for(var gj=0;gj1){if(bm&&bm.join("\n")==gm){if(gj.ranges.length%bm.length==0){gi=[];for(var gn=0;gn=0;gn--){var go=gj.ranges[gn];var gt=go.from(),gs=go.to();if(go.empty()){if(gk&&gk>0){gt=W(gt.line,gt.ch-gk)}else{if(gw.state.overwrite&&!gl){gs=W(gs.line,Math.min(ff(gu,gs.line).text.length,gs.ch+fG(gp).length))}}}var gq=gw.curOp.updateInput;var gr={from:gt,to:gs,text:gi?gi[gn%gi.length]:gp,origin:gv||(gl?"paste":gw.state.cutIncoming?"cut":"+input")};bg(gw.doc,gr);ae(gw,"inputRead",gw,gr)}if(gm&&!gl){fW(gw,gm)}fF(gw);gw.curOp.updateInput=gq;gw.curOp.typing=true;gw.state.pasteIncoming=gw.state.cutIncoming=false}function ba(gk,gi){var gj=gk.clipboardData&&gk.clipboardData.getData("text/plain");if(gj){gk.preventDefault();cM(gi,function(){fZ(gi,gj,0,null,"paste")});return true}}function fW(gi,gm){if(!gi.options.electricChars||!gi.options.smartIndent){return}var gn=gi.doc.sel;for(var gl=gn.ranges.length-1;gl>=0;gl--){var gj=gn.ranges[gl];if(gj.head.ch>100||(gl&&gn.ranges[gl-1].head.line==gj.head.line)){continue}var go=gi.getModeAt(gj.head);var gp=false;if(go.electricChars){for(var gk=0;gk-1){gp=ad(gi,gj.head.line,"smart");break}}}else{if(go.electricInput){if(go.electricInput.test(ff(gi.doc,gj.head.line).text.slice(0,gj.head.ch))){gp=ad(gi,gj.head.line,"smart")}}}if(gp){ae(gi,"electricInput",gi,gj.head.line)}}}function dj(gi){var gn=[],gk=[];for(var gl=0;gl=9&&gj.hasSelection){gj.hasSelection=null}gj.poll()});bX(gl,"paste",function(go){if(ba(go,gi)){return true}gi.state.pasteIncoming=true;gj.fastPoll()});function gm(gp){if(gi.somethingSelected()){bm=gi.getSelections();if(gj.inaccurateSelection){gj.prevInput="";gj.inaccurateSelection=false;gl.value=bm.join("\n");dL(gl)}}else{if(!gi.options.lineWiseCopyCut){return}else{var go=dj(gi);bm=go.text;if(gp.type=="cut"){gi.setSelections(go.ranges,null,Z)}else{gj.prevInput="";gl.value=go.text.join("\n");dL(gl)}}}if(gp.type=="cut"){gi.state.cutIncoming=true}}bX(gl,"cut",gm);bX(gl,"copy",gm);bX(gk.scroller,"paste",function(go){if(bb(gk,go)){return}gi.state.pasteIncoming=true;gj.focus()});bX(gk.lineSpace,"selectstart",function(go){if(!bb(gk,go)){cG(go)}});bX(gl,"compositionstart",function(){var go=gi.getCursor("from");gj.composing={start:go,range:gi.markText(go,gi.getCursor("to"),{className:"CodeMirror-composing"})}});bX(gl,"compositionend",function(){if(gj.composing){gj.poll();gj.composing.range.clear();gj.composing=null}})},prepareSelection:function(){var gj=this.cm,gn=gj.display,gm=gj.doc;var gi=fI(gj);if(gj.options.moveInputWithCursor){var go=dU(gj,gm.sel.primary().head,"div");var gk=gn.wrapper.getBoundingClientRect(),gl=gn.lineDiv.getBoundingClientRect();gi.teTop=Math.max(0,Math.min(gn.wrapper.clientHeight-10,go.top+gl.top-gk.top));gi.teLeft=Math.max(0,Math.min(gn.wrapper.clientWidth-10,go.left+gl.left-gk.left))}return gi},showSelection:function(gk){var gi=this.cm,gj=gi.display;bR(gj.cursorDiv,gk.cursors);bR(gj.selectionDiv,gk.selection);if(gk.teTop!=null){this.wrapper.style.top=gk.teTop+"px";this.wrapper.style.left=gk.teLeft+"px"}},reset:function(gm){if(this.contextMenuPending){return}var gj,gl,gi=this.cm,go=gi.doc;if(gi.somethingSelected()){this.prevInput="";var gk=go.sel.primary();gj=da&&(gk.to().line-gk.from().line>100||(gl=gi.getSelection()).length>1000);var gn=gj?"-":gl||gi.getSelection();this.textarea.value=gn;if(gi.state.focused){dL(this.textarea)}if(dK&&k>=9){this.hasSelection=gn}}else{if(!gm){this.prevInput=this.textarea.value="";if(dK&&k>=9){this.hasSelection=null}}}this.inaccurateSelection=gj},getField:function(){return this.textarea},supportsTouch:function(){return false},focus:function(){if(this.cm.options.readOnly!="nocursor"&&(!eg||dO()!=this.textarea)){try{this.textarea.focus()}catch(gi){}}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var gi=this;if(gi.pollingFast){return}gi.polling.set(this.cm.options.pollInterval,function(){gi.poll();if(gi.cm.state.focused){gi.slowPoll()}})},fastPoll:function(){var gj=false,gi=this;gi.pollingFast=true;function gk(){var gl=gi.poll();if(!gl&&!gj){gj=true;gi.polling.set(60,gk)}else{gi.pollingFast=false;gi.slowPoll()}}gi.polling.set(20,gk)},poll:function(){var gi=this.cm,gl=this.textarea,gm=this.prevInput;if(this.contextMenuPending||!gi.state.focused||(bs(gl)&&!gm&&!this.composing)||aj(gi)||gi.options.disableInput||gi.state.keySeq){return false}var go=gl.value;if(go==gm&&!gi.somethingSelected()){return false}if(dK&&k>=9&&this.hasSelection===go||b7&&/[\uf700-\uf7ff]/.test(go)){gi.display.input.reset();return false}if(gi.doc.sel==gi.display.selForContextMenu){var gn=go.charCodeAt(0);if(gn==8203&&!gm){gm="\u200b"}if(gn==8666){this.reset();return this.cm.execCommand("undo")}}var gp=0,gj=Math.min(gm.length,go.length);while(gp1000||go.indexOf("\n")>-1){gl.value=gk.prevInput=""}else{gk.prevInput=go}if(gk.composing){gk.composing.range.clear();gk.composing.range=gi.markText(gk.composing.start,gi.getCursor("to"),{className:"CodeMirror-composing"})}});return true},ensurePolled:function(){if(this.pollingFast&&this.poll()){this.pollingFast=false}},onKeyPress:function(){if(dK&&k>=9){this.hasSelection=null}this.fastPoll()},onContextMenu:function(gn){var gs=this,gt=gs.cm,gp=gt.display,gj=gs.textarea;var gr=cn(gt,gn),gi=gp.scroller.scrollTop;if(!gr||d3){return}var gm=gt.options.resetSelectionOnContextMenu;if(gm&>.doc.sel.contains(gr)==-1){c2(gt,bU)(gt.doc,eS(gr),Z)}var go=gj.style.cssText;gs.wrapper.style.position="absolute";gj.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(gn.clientY-5)+"px; left: "+(gn.clientX-5)+"px; z-index: 1000; background: "+(dK?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";if(c0){var gu=window.scrollY}gp.input.focus();if(c0){window.scrollTo(null,gu)}gp.input.reset();if(!gt.somethingSelected()){gj.value=gs.prevInput=" "}gs.contextMenuPending=true;gp.selForContextMenu=gt.doc.sel;clearTimeout(gp.detectingSelectAll);function gl(){if(gj.selectionStart!=null){var gv=gt.somethingSelected();var gw="\u200b"+(gv?gj.value:"");gj.value="\u21da";gj.value=gw;gs.prevInput=gv?"":"\u200b";gj.selectionStart=1;gj.selectionEnd=gw.length;gp.selForContextMenu=gt.doc.sel}}function gq(){gs.contextMenuPending=false;gs.wrapper.style.position="relative";gj.style.cssText=go;if(dK&&k<9){gp.scrollbars.setScrollTop(gp.scroller.scrollTop=gi)}if(gj.selectionStart!=null){if(!dK||(dK&&k<9)){gl()}var gv=0,gw=function(){if(gp.selForContextMenu==gt.doc.sel&&gj.selectionStart==0&&gj.selectionEnd>0&&gs.prevInput=="\u200b"){c2(gt,eD.selectAll)(gt)}else{if(gv++<10){gp.detectingSelectAll=setTimeout(gw,500)}else{gp.input.reset()}}};gp.detectingSelectAll=setTimeout(gw,200)}}if(dK&&k>=9){gl()}if(ga){er(gn);var gk=function(){ed(window,"mouseup",gk);setTimeout(gq,20)};bX(window,"mouseup",gk)}else{setTimeout(gq,50)}},setUneditable:fV,needsContentAttribute:false},Y.prototype);function dv(gi){this.cm=gi;this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null;this.polling=new gh();this.gracePeriod=false}dv.prototype=aN({init:function(gl){var gk=this,gi=gk.cm;var gm=gk.div=gl.lineDiv;gm.contentEditable="true";fP(gm);bX(gm,"paste",function(gn){ba(gn,gi)});bX(gm,"compositionstart",function(gr){var gq=gr.data;gk.composing={sel:gi.doc.sel,data:gq,startData:gq};if(!gq){return}var go=gi.doc.sel.primary();var gn=gi.getLine(go.head.line);var gp=gn.indexOf(gq,Math.max(0,go.head.ch-gq.length));if(gp>-1&&gp<=go.head.ch){gk.composing.sel=eS(W(go.head.line,gp),W(go.head.line,gp+gq.length))}});bX(gm,"compositionupdate",function(gn){gk.composing.data=gn.data});bX(gm,"compositionend",function(go){var gn=gk.composing;if(!gn){return}if(go.data!=gn.startData&&!/\u200b/.test(go.data)){gn.data=go.data}setTimeout(function(){if(!gn.handled){gk.applyComposition(gn)}if(gk.composing==gn){gk.composing=null}},50)});bX(gm,"touchstart",function(){gk.forceCompositionEnd()});bX(gm,"input",function(){if(gk.composing){return}if(!gk.pollContent()){cM(gk.cm,function(){ah(gi)})}});function gj(gq){if(gi.somethingSelected()){bm=gi.getSelections();if(gq.type=="cut"){gi.replaceSelection("",null,"cut")}}else{if(!gi.options.lineWiseCopyCut){return}else{var go=dj(gi);bm=go.text;if(gq.type=="cut"){gi.operation(function(){gi.setSelections(go.ranges,0,Z);gi.replaceSelection("",null,"cut")})}}}if(gq.clipboardData&&!e1){gq.preventDefault();gq.clipboardData.clearData();gq.clipboardData.setData("text/plain",bm.join("\n"))}else{var gp=aX(),gr=gp.firstChild;gi.display.lineSpace.insertBefore(gp,gi.display.lineSpace.firstChild);gr.value=bm.join("\n");var gn=document.activeElement;dL(gr);setTimeout(function(){gi.display.lineSpace.removeChild(gp);gn.focus()},50)}}bX(gm,"copy",gj);bX(gm,"cut",gj)},prepareSelection:function(){var gi=fI(this.cm,false);gi.focus=this.cm.state.focused;return gi},showSelection:function(gi){if(!gi||!this.cm.display.view.length){return}if(gi.focus){this.showPrimarySelection()}this.showMultipleSelections(gi)},showPrimarySelection:function(){var gm=window.getSelection(),gp=this.cm.doc.sel.primary();var gn=az(this.cm,gm.anchorNode,gm.anchorOffset);var gr=az(this.cm,gm.focusNode,gm.focusOffset);if(gn&&!gn.bad&&gr&&!gr.bad&&cf(ar(gn,gr),gp.from())==0&&cf(bx(gn,gr),gp.to())==0){return}var gl=cz(this.cm,gp.from());var gq=cz(this.cm,gp.to());if(!gl&&!gq){return}var gt=this.cm.display.view;var go=gm.rangeCount&&gm.getRangeAt(0);if(!gl){gl={node:gt[0].measure.map[2],offset:0}}else{if(!gq){var gk=gt[gt.length-1].measure;var gj=gk.maps?gk.maps[gk.maps.length-1]:gk.map;gq={node:gj[gj.length-1],offset:gj[gj.length-2]-gj[gj.length-3]}}}try{var gi=cl(gl.node,gl.offset,gq.offset,gq.node)}catch(gs){}if(gi){gm.removeAllRanges();gm.addRange(gi);if(go&&gm.anchorNode==null){gm.addRange(go)}else{if(co){this.startGracePeriod()}}}this.rememberSelection()},startGracePeriod:function(){var gi=this;clearTimeout(this.gracePeriod);this.gracePeriod=setTimeout(function(){gi.gracePeriod=false;if(gi.selectionChanged()){gi.cm.operation(function(){gi.cm.curOp.selectionChanged=true})}},20)},showMultipleSelections:function(gi){bR(this.cm.display.cursorDiv,gi.cursors);bR(this.cm.display.selectionDiv,gi.selection)},rememberSelection:function(){var gi=window.getSelection();this.lastAnchorNode=gi.anchorNode;this.lastAnchorOffset=gi.anchorOffset;this.lastFocusNode=gi.focusNode;this.lastFocusOffset=gi.focusOffset},selectionInEditor:function(){var gj=window.getSelection();if(!gj.rangeCount){return false}var gi=gj.getRangeAt(0).commonAncestorContainer;return gb(this.div,gi)},focus:function(){if(this.cm.options.readOnly!="nocursor"){this.div.focus()}},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return true},receivedFocus:function(){var gi=this;if(this.selectionInEditor()){this.pollSelection()}else{cM(this.cm,function(){gi.cm.curOp.selectionChanged=true})}function gj(){if(gi.cm.state.focused){gi.pollSelection();gi.polling.set(gi.cm.options.pollInterval,gj)}}this.polling.set(this.cm.options.pollInterval,gj)},selectionChanged:function(){var gi=window.getSelection();return gi.anchorNode!=this.lastAnchorNode||gi.anchorOffset!=this.lastAnchorOffset||gi.focusNode!=this.lastFocusNode||gi.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var gl=window.getSelection(),gi=this.cm;this.rememberSelection();var gj=az(gi,gl.anchorNode,gl.anchorOffset);var gk=az(gi,gl.focusNode,gl.focusOffset);if(gj&&gk){cM(gi,function(){bU(gi.doc,eS(gj,gk),Z);if(gj.bad||gk.bad){gi.curOp.selectionChanged=true}})}}},pollContent:function(){var gs=this.cm,gC=gs.display,gA=gs.doc.sel.primary();var gB=gA.from(),gm=gA.to();if(gB.linegC.viewTo-1){return false}var gp;if(gB.line==gC.viewFrom||(gp=dr(gs,gB.line))==0){var gn=bN(gC.view[0].line);var gr=gC.view[0].node}else{var gn=bN(gC.view[gp].line);var gr=gC.view[gp-1].node.nextSibling}var gz=dr(gs,gm.line);if(gz==gC.view.length-1){var gu=gC.viewTo-1;var gx=gC.lineDiv.lastChild}else{var gu=bN(gC.view[gz+1].line)-1;var gx=gC.view[gz+1].node.previousSibling}var gD=gs.doc.splitLines(f0(gs,gr,gx,gn,gu));var gw=f5(gs.doc,W(gn,0),W(gu,ff(gs.doc,gu).text.length));while(gD.length>1&&gw.length>1){if(fG(gD)==fG(gw)){gD.pop();gw.pop();gu--}else{if(gD[0]==gw[0]){gD.shift();gw.shift();gn++}else{break}}}var gy=0,gk=0;var gt=gD[0],gj=gw[0],gi=Math.min(gt.length,gj.length);while(gy1||gD[0]||cf(go,gv)){a1(gs.doc,gD,go,gv,"+input");return true}},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){if(!this.composing||this.composing.handled){return}this.applyComposition(this.composing);this.composing.handled=true;this.div.blur();this.div.focus()},applyComposition:function(gi){if(gi.data&&gi.data!=gi.startData){c2(this.cm,fZ)(this.cm,gi.data,0,gi.sel)}},setUneditable:function(gi){gi.setAttribute("contenteditable","false")},onKeyPress:function(gi){gi.preventDefault();c2(this.cm,fZ)(this.cm,String.fromCharCode(gi.charCode==null?gi.keyCode:gi.charCode),0)},onContextMenu:fV,resetPosition:fV,needsContentAttribute:true},dv.prototype);function cz(go,gm){var gn=fb(go,gm.line);if(!gn||gn.hidden){return null}var gq=ff(go.doc,gm.line);var gj=ct(gn,gq,gm.line);var gk=a(gq),gl="left";if(gk){var gi=aG(gk,gm.ch);gl=gi%2?"right":"left"}var gp=aL(gj.map,gm.ch,gl);gp.offset=gp.collapse=="right"?gp.end:gp.start;return gp}function et(gj,gi){if(gi){gj.bad=true}return gj}function az(gi,gl,gn){var gm;if(gl==gi.display.lineDiv){gm=gi.display.lineDiv.childNodes[gn];if(!gm){return et(gi.clipPos(W(gi.display.viewTo-1)),true)}gl=null;gn=0}else{for(gm=gl;;gm=gm.parentNode){if(!gm||gm==gi.display.lineDiv){return null}if(gm.parentNode&&gm.parentNode==gi.display.lineDiv){break}}}for(var gk=0;gk=0&&cf(gl,gj.to())<=0){return gk}}return -1}};function dY(gi,gj){this.anchor=gi;this.head=gj}dY.prototype={from:function(){return ar(this.anchor,this.head)},to:function(){return bx(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};function cw(gi,gp){var gk=gi[gp];gi.sort(function(gs,gr){return cf(gs.from(),gr.from())});gp=dh(gi,gk);for(var gm=1;gm=0){var gn=ar(gj.from(),gq.from()),go=bx(gj.to(),gq.to());var gl=gj.empty()?gq.from()==gq.head:gj.from()==gj.head;if(gm<=gp){--gp}gi.splice(--gm,2,new dY(gl?go:gn,gl?gn:go))}}return new f4(gi,gp)}function eS(gi,gj){return new f4([new dY(gi,gj||gi)],0)}function c5(gi,gj){return Math.max(gi.first,Math.min(gj,gi.first+gi.size-1))}function fJ(gj,gk){if(gk.linegi){return W(gi,ff(gj,gi).text.length)}return fs(gk,ff(gj,gk.line).text.length)}function fs(gk,gj){var gi=gk.ch;if(gi==null||gi>gj){return W(gk.line,gj)}else{if(gi<0){return W(gk.line,0)}else{return gk}}}function b9(gj,gi){return gi>=gj.first&&gi=gk.ch:gi.to>gk.ch))){if(go){aE(gj,"beforeCursorEnter");if(gj.explicitlyCleared){if(!gt.markedSpans){break}else{--gm;continue}}}if(!gj.atomic){continue}var gp=gj.find(gl<0?-1:1);if(cf(gp,gk)==0){gp.ch+=gl;if(gp.ch<0){if(gp.line>gr.first){gp=fJ(gr,W(gp.line-1))}else{gp=null}}else{if(gp.ch>gt.text.length){if(gp.line3){gt(gN,gL.top,null,gL.bottom);gN=gl;if(gL.bottomgA.bottom||gM.bottom==gA.bottom&&gM.right>gA.right){gA=gM}if(gN0){gk.blinker=setInterval(function(){gk.cursorDiv.style.visibility=(gj=!gj)?"":"hidden"},gi.options.cursorBlinkRate)}else{if(gi.options.cursorBlinkRate<0){gk.cursorDiv.style.visibility="hidden"}}}function ef(gi,gj){if(gi.doc.mode.startState&&gi.doc.frontier=gi.display.viewTo){return}var gk=+new Date+gi.options.workTime;var gl=b3(gm.mode,dC(gi,gm.frontier));var gj=[];gm.iter(gm.frontier,Math.min(gm.first+gm.size,gi.display.viewTo+500),function(gn){if(gm.frontier>=gi.display.viewFrom){var gq=gn.styles;var gs=fz(gi,gn,gl,true);gn.styles=gs.styles;var gp=gn.styleClasses,gr=gs.classes;if(gr){gn.styleClasses=gr}else{if(gp){gn.styleClasses=null}}var gt=!gq||gq.length!=gn.styles.length||gp!=gr&&(!gp||!gr||gp.bgClass!=gr.bgClass||gp.textClass!=gr.textClass);for(var go=0;!gt&&gogk){ef(gi,gi.options.workDelay);return true}});if(gj.length){cM(gi,function(){for(var gn=0;gngk;--gr){if(gr<=gn.first){return gn.first}var gq=ff(gn,gr-1);if(gq.stateAfter&&(!gl||gr<=gn.frontier)){return gr}var gp=bT(gq.text,null,go.options.tabSize);if(gm==null||gj>gp){gm=gr-1;gj=gp}}return gm}function dC(gi,go,gj){var gm=gi.doc,gl=gi.display;if(!gm.mode.startState){return true}var gn=cy(gi,go,gj),gk=gn>gm.first&&ff(gm,gn-1).stateAfter;if(!gk){gk=b0(gm.mode)}else{gk=b3(gm.mode,gk)}gm.iter(gn,go,function(gp){dx(gi,gp.text,gk);var gq=gn==go-1||gn%5==0||gn>=gl.viewFrom&&gn2){gn.push((gq.bottom+gj.top)/2-go.top)}}}gn.push(go.bottom-go.top)}}function ct(gk,gi,gl){if(gk.line==gi){return{map:gk.measure.map,cache:gk.measure.cache}}for(var gj=0;gjgl){return{map:gk.measure.maps[gj],cache:gk.measure.caches[gj],before:true}}}}function c1(gi,gk){gk=y(gk);var gm=bN(gk);var gj=gi.display.externalMeasured=new bv(gi.doc,gk,gm);gj.lineN=gm;var gl=gj.built=eR(gi,gj);gj.text=gl.pre;bR(gi.display.lineMeasure,gl.pre);return gj}function eh(gi,gj,gl,gk){return C(gi,a4(gi,gj),gl,gk)}function fb(gi,gk){if(gk>=gi.display.viewFrom&&gk=gj.lineN&&gkgi){gn=gr-gm;gk=gn-1;if(gi>=gr){gq="right"}}}}if(gk!=null){gl=gj[go+2];if(gm==gr&&gp==(gl.insertLeft?"left":"right")){gq=gp}if(gp=="left"&&gk==0){while(go&&gj[go-2]==gj[go-3]&&gj[go-1].insertLeft){gl=gj[(go-=3)+2];gq="left"}}if(gp=="right"&&gk==gr-gm){while(go0){gi=gn="right"}var gk;if(gp.options.lineWrapping&&(gk=gx.getClientRects()).length>1){gj=gk[gn=="right"?gk.length-1:0]}else{gj=gx.getBoundingClientRect()}}if(dK&&k<9&&!gm&&(!gj||!gj.left&&!gj.right)){var go=gx.parentNode.getClientRects()[0];if(go){gj={left:go.left,right:go.left+dD(gp.display),top:go.top,bottom:go.bottom}}else{gj=eB}}var gv=gj.top-gz.rect.top,gt=gj.bottom-gz.rect.top;var gB=(gv+gt)/2;var gA=gz.view.measure.heights;for(var gy=0;gygv.from){return gm(gx-1)}return gm(gx,gw)}var gn=a(go),gi=gq.ch;if(!gn){return gm(gi)}var gj=aG(gn,gi);var gl=gs(gi,gj);if(e2!=null){gl.other=gs(gi,e2)}return gl}function dH(gi,gm){var gl=0,gm=fJ(gi.doc,gm);if(!gi.options.lineWrapping){gl=dD(gi.display)*gm.ch}var gj=ff(gi.doc,gm.line);var gk=bM(gj)+e8(gi.display);return{left:gl,right:gl,top:gk,bottom:gk+gj.height}}function f2(gi,gj,gk,gm){var gl=W(gi,gj);gl.xRel=gm;if(gk){gl.outside=true}return gl}function fO(gp,gm,gl){var go=gp.doc;gl+=gp.display.viewOffset;if(gl<0){return f2(go.first,0,true,-1)}var gk=bG(go,gl),gq=go.first+go.size-1;if(gk>gq){return f2(go.first+go.size-1,ff(go,gq).text.length,true,1)}if(gm<0){gm=0}var gj=ff(go,gk);for(;;){var gr=cZ(gp,gj,gk,gm,gl);var gn=ew(gj);var gi=gn&&gn.find(0,true);if(gn&&(gr.ch>gi.from.ch||gr.ch==gi.from.ch&&gr.xRel>0)){gk=bN(gj=gi.to.line)}else{return gr}}}function cZ(gs,gk,gv,gu,gt){var gr=gt-bM(gk);var go=false,gB=2*gs.display.wrapper.clientWidth;var gy=a4(gs,gk);function gF(gH){var gI=dU(gs,W(gv,gH),"line",gk,gy);go=true;if(gr>gI.bottom){return gI.left-gB}else{if(grgj){return f2(gv,gl,gn,1)}for(;;){if(gx?gl==gC||gl==u(gk,gC,1):gl-gC<=1){var gw=gu1?1:0);return gq}var gp=Math.ceil(gA/2),gG=gC+gp;if(gx){gG=gC;for(var gD=0;gDgu){gl=gG;gj=gm;if(gn=go){gj+=1000}gA=gp}else{gC=gG;gz=gm;gi=go;gA-=gp}}}var aH;function aY(gk){if(gk.cachedTextHeight!=null){return gk.cachedTextHeight}if(aH==null){aH=f3("pre");for(var gj=0;gj<49;++gj){aH.appendChild(document.createTextNode("x"));aH.appendChild(f3("br"))}aH.appendChild(document.createTextNode("x"))}bR(gk.measure,aH);var gi=aH.offsetHeight/50;if(gi>3){gk.cachedTextHeight=gi}d1(gk.measure);return gi||1}function dD(gm){if(gm.cachedCharWidth!=null){return gm.cachedCharWidth}var gi=f3("span","xxxxxxxxxx");var gl=f3("pre",[gi]);bR(gm.measure,gl);var gk=gi.getBoundingClientRect(),gj=(gk.right-gk.left)/10;if(gj>2){gm.cachedCharWidth=gj}return gj||10}var bp=null;var d8=0;function cI(gi){gi.curOp={cm:gi,viewChanged:false,startHeight:gi.doc.height,forceUpdate:false,updateInput:null,typing:false,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:false,updateMaxLine:false,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:false,id:++d8};if(bp){bp.ops.push(gi.curOp)}else{gi.curOp.ownsGroup=bp={ops:[gi.curOp],delayedCallbacks:[]}}}function cU(gl){var gk=gl.delayedCallbacks,gj=0;do{for(;gj=gj.viewTo)||gj.maxLineChanged&&gi.options.lineWrapping;gk.update=gk.mustUpdate&&new aI(gi,gk.mustUpdate&&{top:gk.scrollTop,ensure:gk.scrollToPos},gk.forceUpdate)}function aq(gi){gi.updatedDisplay=gi.mustUpdate&&B(gi.cm,gi.update)}function b2(gk){var gi=gk.cm,gj=gi.display;if(gk.updatedDisplay){a9(gi)}gk.barMeasure=dA(gi);if(gj.maxLineChanged&&!gi.options.lineWrapping){gk.adjustWidthTo=eh(gi,gj.maxLine,gj.maxLine.text.length).left+3;gi.display.sizerWidth=gk.adjustWidthTo;gk.barMeasure.scrollWidth=Math.max(gj.scroller.clientWidth,gj.sizer.offsetLeft+gk.adjustWidthTo+cT(gi)+gi.display.barWidth);gk.maxScrollLeft=Math.max(0,gj.sizer.offsetLeft+gk.adjustWidthTo-dl(gi))}if(gk.updatedDisplay||gk.selectionChanged){gk.preparedSelection=gj.input.prepareSelection()}}function ap(gj){var gi=gj.cm;if(gj.adjustWidthTo!=null){gi.display.sizer.style.minWidth=gj.adjustWidthTo+"px";if(gj.maxScrollLeftgn)){gk.updateLineNumbers=gn}gp.curOp.viewChanged=true;if(gn>=gk.viewTo){if(a7&&aW(gp.doc,gn)gk.viewFrom){ex(gp)}else{gk.viewFrom+=gq;gk.viewTo+=gq}}else{if(gn<=gk.viewFrom&&go>=gk.viewTo){ex(gp)}else{if(gn<=gk.viewFrom){var gm=de(gp,go,go+gq,1);if(gm){gk.view=gk.view.slice(gm.index);gk.viewFrom=gm.lineN;gk.viewTo+=gq}else{ex(gp)}}else{if(go>=gk.viewTo){var gm=de(gp,gn,gn,-1);if(gm){gk.view=gk.view.slice(0,gm.index);gk.viewTo=gm.lineN}else{ex(gp)}}else{var gl=de(gp,gn,gn,-1);var gj=de(gp,go,go+gq,1);if(gl&&gj){gk.view=gk.view.slice(0,gl.index).concat(eV(gp,gl.lineN,gj.lineN)).concat(gk.view.slice(gj.index));gk.viewTo+=gq}else{ex(gp)}}}}}}var gi=gk.externalMeasured;if(gi){if(go=gm.lineN&&gk=go.viewTo){return}var gl=go.view[dr(gj,gk)];if(gl.node==null){return}var gi=gl.changes||(gl.changes=[]);if(dh(gi,gn)==-1){gi.push(gn)}}function ex(gi){gi.display.viewFrom=gi.display.viewTo=gi.doc.first;gi.display.view=[];gi.display.viewOffset=0}function dr(gi,gl){if(gl>=gi.display.viewTo){return null}gl-=gi.display.viewFrom;if(gl<0){return null}var gj=gi.display.view;for(var gk=0;gk0){if(gn==go.length-1){return null}gp=(gi+go[gn].size)-gk;gn++}else{gp=gi-gk}gk+=gp;gm+=gp}while(aW(gq.doc,gm)!=gm){if(gn==(gj<0?0:go.length-1)){return null}gm+=gj*go[gn-(gj<0?1:0)].size;gn+=gj}return{index:gn,lineN:gm}}function cR(gi,gm,gl){var gk=gi.display,gj=gk.view;if(gj.length==0||gm>=gk.viewTo||gl<=gk.viewFrom){gk.view=eV(gi,gm,gl);gk.viewFrom=gm}else{if(gk.viewFrom>gm){gk.view=eV(gi,gm,gk.viewFrom).concat(gk.view)}else{if(gk.viewFromgl){gk.view=gk.view.slice(0,dr(gi,gl))}}}gk.viewTo=gl}function db(gi){var gj=gi.display.view,gm=0;for(var gl=0;gl20*20}bX(gn.scroller,"touchstart",function(gr){if(!gl(gr)){clearTimeout(gp);var gq=+new Date;gn.activeTouch={start:gq,moved:false,prev:gq-gi.end<=300?gi:null};if(gr.touches.length==1){gn.activeTouch.left=gr.touches[0].pageX;gn.activeTouch.top=gr.touches[0].pageY}}});bX(gn.scroller,"touchmove",function(){if(gn.activeTouch){gn.activeTouch.moved=true}});bX(gn.scroller,"touchend",function(gr){var gt=gn.activeTouch;if(gt&&!bb(gn,gr)&>.left!=null&&!gt.moved&&new Date-gt.start<300){var gs=gj.coordsChar(gn.activeTouch,"page"),gq;if(!gt.prev||gk(gt,gt.prev)){gq=new dY(gs,gs)}else{if(!gt.prev.prev||gk(gt,gt.prev.prev)){gq=gj.findWordAt(gs)}else{gq=new dY(W(gs.line,0),fJ(gj.doc,W(gs.line+1,0)))}}gj.setSelection(gq.anchor,gq.head);gj.focus();cG(gr)}go()});bX(gn.scroller,"touchcancel",go);bX(gn.scroller,"scroll",function(){if(gn.scroller.clientHeight){N(gj,gn.scroller.scrollTop);bE(gj,gn.scroller.scrollLeft,true);aE(gj,"scroll",gj)}});bX(gn.scroller,"mousewheel",function(gq){b(gj,gq)});bX(gn.scroller,"DOMMouseScroll",function(gq){b(gj,gq)});bX(gn.wrapper,"scroll",function(){gn.wrapper.scrollTop=gn.wrapper.scrollLeft=0});gn.dragFunctions={simple:function(gq){if(!aR(gj,gq)){er(gq)}},start:function(gq){Q(gj,gq)},drop:c2(gj,bk)};var gm=gn.input.getField();bX(gm,"keyup",function(gq){bi.call(gj,gq)});bX(gm,"keydown",c2(gj,p));bX(gm,"keypress",c2(gj,cx));bX(gm,"focus",cv(cB,gj));bX(gm,"blur",cv(aV,gj))}function f1(gj,gm,gk){var gn=gk&&gk!=H.Init;if(!gm!=!gn){var gl=gj.display.dragFunctions;var gi=gm?bX:ed;gi(gj.display.scroller,"dragstart",gl.start);gi(gj.display.scroller,"dragenter",gl.simple);gi(gj.display.scroller,"dragover",gl.simple);gi(gj.display.scroller,"drop",gl.drop)}}function aT(gi){var gj=gi.display;if(gj.lastWrapHeight==gj.wrapper.clientHeight&&gj.lastWrapWidth==gj.wrapper.clientWidth){return}gj.cachedCharWidth=gj.cachedTextHeight=gj.cachedPaddingH=null;gj.scrollbarsClipped=false;gi.setSize()}function bb(gj,gi){for(var gk=L(gi);gk!=gj.wrapper;gk=gk.parentNode){if(!gk||(gk.nodeType==1&&gk.getAttribute("cm-ignore-events")=="true")||(gk.parentNode==gj.sizer&&gk!=gj.mover)){return true}}}function cn(gr,gm,gj,gk){var gn=gr.display;if(!gj&&L(gm).getAttribute("cm-not-content")=="true"){return null}var gq,go,gi=gn.lineSpace.getBoundingClientRect();try{gq=gm.clientX-gi.left;go=gm.clientY-gi.top}catch(gm){return null}var gp=fO(gr,gq,go),gs;if(gk&&gp.xRel==1&&(gs=ff(gr.doc,gp.line).text).length==gp.ch){var gl=bT(gs,gs.length,gr.options.tabSize)-gs.length;gp=W(gp.line,Math.max(0,Math.round((gq-e5(gr.display).left)/dD(gr.display))-gl))}return gp}function eu(gk){var gi=this,gj=gi.display;if(gj.activeTouch&&gj.input.supportsTouch()||aR(gi,gk)){return}gj.shift=gk.shiftKey;if(bb(gj,gk)){if(!c0){gj.scroller.draggable=false;setTimeout(function(){gj.scroller.draggable=true},100)}return}if(l(gi,gk)){return}var gl=cn(gi,gk);window.focus();switch(fN(gk)){case 1:if(gl){ax(gi,gk,gl)}else{if(L(gk)==gj.scroller){cG(gk)}}break;case 2:if(c0){gi.state.lastMiddleDown=+new Date}if(gl){fX(gi.doc,gl)}setTimeout(function(){gj.input.focus()},20);cG(gk);break;case 3:if(ga){ay(gi,gk)}else{al(gi)}break}}var dn,dd;function ax(gj,go,gp){if(dK){setTimeout(cv(r,gj),0)}else{gj.curOp.focus=dO()}var gk=+new Date,gm;if(dd&&dd.time>gk-400&&cf(dd.pos,gp)==0){gm="triple"}else{if(dn&&dn.time>gk-400&&cf(dn.pos,gp)==0){gm="double";dd={time:gk,pos:gp}}else{gm="single";dn={time:gk,pos:gp}}}var gn=gj.doc.sel,gi=b7?go.metaKey:go.ctrlKey,gl;if(gj.options.dragDrop&&eL&&!aj(gj)&&gm=="single"&&(gl=gn.contains(gp))>-1&&(cf((gl=gn.ranges[gl]).from(),gp)<0||gp.xRel>0)&&(cf(gl.to(),gp)>0||gp.xRel<0)){a3(gj,go,gp,gi)}else{m(gj,go,gp,gm,gi)}}function a3(gk,gn,go,gj){var gm=gk.display,gl=+new Date;var gi=c2(gk,function(gp){if(c0){gm.scroller.draggable=false}gk.state.draggingText=false;ed(document,"mouseup",gi);ed(gm.scroller,"drop",gi);if(Math.abs(gn.clientX-gp.clientX)+Math.abs(gn.clientY-gp.clientY)<10){cG(gp);if(!gj&&+new Date-200-1){gk=gi[gB]}else{gk=new dY(gl,gl)}}else{gk=gC.sel.primary();gB=gC.sel.primIndex}if(gA.altKey){gj="rect";if(!go){gk=new dY(gl,gl)}gl=cn(gm,gA,true,true);gB=-1}else{if(gj=="double"){var gy=gm.findWordAt(gl);if(gm.display.shift||gC.extend){gk=fv(gC,gk,gy.anchor,gy.head)}else{gk=gy}}else{if(gj=="triple"){var gr=new dY(W(gl.line,0),fJ(gC,W(gl.line+1,0)));if(gm.display.shift||gC.extend){gk=fv(gC,gk,gr.anchor,gr.head)}else{gk=gr}}else{gk=fv(gC,gk,gl)}}}if(!go){gB=0;bU(gC,new f4([gk],0),M);gn=gC.sel}else{if(gB==-1){gB=gi.length;bU(gC,cw(gi.concat([gk]),gB),{scroll:false,origin:"*mouse"})}else{if(gi.length>1&&gi[gB].empty()&&gj=="single"&&!gA.shiftKey){bU(gC,cw(gi.slice(0,gB).concat(gi.slice(gB+1)),0));gn=gC.sel}else{e(gC,gB,gk,M)}}}var gw=gl;function gv(gN){if(cf(gw,gN)==0){return}gw=gN;if(gj=="rect"){var gE=[],gK=gm.options.tabSize;var gD=bT(ff(gC,gl.line).text,gl.ch,gK);var gQ=bT(ff(gC,gN.line).text,gN.ch,gK);var gF=Math.min(gD,gQ),gO=Math.max(gD,gQ);for(var gR=Math.min(gl.line,gN.line),gH=Math.min(gm.lastLine(),Math.max(gl.line,gN.line));gR<=gH;gR++){var gP=ff(gC,gR).text,gG=eq(gP,gF,gK);if(gF==gO){gE.push(new dY(W(gR,gG),W(gR,gG)))}else{if(gP.length>gG){gE.push(new dY(W(gR,gG),W(gR,eq(gP,gO,gK))))}}}if(!gE.length){gE.push(new dY(gl,gl))}bU(gC,cw(gn.ranges.slice(0,gB).concat(gE),gB),{origin:"*mouse",scroll:false});gm.scrollIntoView(gN)}else{var gL=gk;var gI=gL.anchor,gM=gN;if(gj!="single"){if(gj=="double"){var gJ=gm.findWordAt(gN)}else{var gJ=new dY(W(gN.line,0),fJ(gC,W(gN.line+1,0)))}if(cf(gJ.anchor,gI)>0){gM=gJ.head;gI=ar(gL.from(),gJ.anchor)}else{gM=gJ.anchor;gI=bx(gL.to(),gJ.head)}}var gE=gn.ranges.slice(0);gE[gB]=new dY(fJ(gC,gI),gM);bU(gC,cw(gE,gB),M)}}var gt=gx.wrapper.getBoundingClientRect();var gp=0;function gz(gF){var gD=++gp;var gH=cn(gm,gF,true,gj=="rect");if(!gH){return}if(cf(gH,gw)!=0){gm.curOp.focus=dO();gv(gH);var gG=b6(gx,gC);if(gH.line>=gG.to||gH.linegt.bottom?20:0;if(gE){setTimeout(c2(gm,function(){if(gp!=gD){return}gx.scroller.scrollTop+=gE;gz(gF)}),50)}}}function gs(gD){gp=Infinity;cG(gD);gx.input.focus();ed(document,"mousemove",gu);ed(document,"mouseup",gq);gC.history.lastSelOrigin=null}var gu=c2(gm,function(gD){if(!fN(gD)){gs(gD)}else{gz(gD)}});var gq=c2(gm,gs);bX(document,"mousemove",gu);bX(document,"mouseup",gq)}function gg(gt,gp,gr,gs,gl){try{var gj=gp.clientX,gi=gp.clientY}catch(gp){return false}if(gj>=Math.floor(gt.display.gutters.getBoundingClientRect().right)){return false}if(gs){cG(gp)}var gq=gt.display;var go=gq.lineDiv.getBoundingClientRect();if(gi>go.bottom||!fi(gt,gr)){return bL(gp)}gi-=go.top-gq.viewOffset;for(var gm=0;gm=gj){var gu=bG(gt.doc,gi);var gk=gt.options.gutters[gm];gl(gt,gr,gt,gu,gk,gp);return bL(gp)}}}function l(gi,gj){return gg(gi,gj,"gutterClick",true,ae)}var ag=0;function bk(go){var gq=this;if(aR(gq,go)||bb(gq.display,go)){return}cG(go);if(dK){ag=+new Date}var gp=cn(gq,go,true),gi=go.dataTransfer.files;if(!gp||aj(gq)){return}if(gi&&gi.length&&window.FileReader&&window.File){var gk=gi.length,gr=Array(gk),gj=0;var gm=function(gu,gt){var gs=new FileReader;gs.onload=c2(gq,function(){gr[gt]=gs.result;if(++gj==gk){gp=fJ(gq.doc,gp);var gv={from:gp,to:gp,text:gq.doc.splitLines(gr.join(gq.doc.lineSeparator())),origin:"paste"};bg(gq.doc,gv);e7(gq.doc,eS(gp,cX(gv)))}});gs.readAsText(gu)};for(var gn=0;gn-1){gq.state.draggingText(go);setTimeout(function(){gq.display.input.focus()},20);return}try{var gr=go.dataTransfer.getData("Text");if(gr){if(gq.state.draggingText&&!(b7?go.altKey:go.ctrlKey)){var gl=gq.listSelections()}ep(gq.doc,eS(gp,gp));if(gl){for(var gn=0;gngp.clientWidth||gt&&gp.scrollHeight>gp.clientHeight)){return}if(gt&&b7&&c0){outer:for(var gs=gk.target,go=gm.view;gs!=gp;gs=gs.parentNode){for(var gj=0;gj=0;--gi){K(gl,{from:gj[gi].from,to:gj[gi].to,text:gi?[""]:gm.text})}}else{K(gl,gm)}}function K(gk,gl){if(gl.text.length==1&&gl.text[0]==""&&cf(gl.from,gl.to)==0){return}var gj=fk(gk,gl);fM(gk,gl,gj,gk.cm?gk.cm.curOp.id:NaN);ee(gk,gl,gj,ek(gk,gl));var gi=[];d7(gk,function(gn,gm){if(!gm&&dh(gi,gn.history)==-1){dE(gn.history,gl);gi.push(gn.history)}ee(gn,gl,null,ek(gn,gl))})}function b8(gt,gr,gv){if(gt.cm&>.cm.state.suppressEdits){return}var gq=gt.history,gk,gm=gt.sel;var gi=gr=="undo"?gq.done:gq.undone,gu=gr=="undo"?gq.undone:gq.done;for(var gn=0;gn=0;--gn){var gs=gk.changes[gn];gs.origin=gr;if(gl&&!dR(gt,gs,false)){gi.length=0;return}gp.push(du(gt,gs));var gj=gn?fk(gt,gs):fG(gi);ee(gt,gs,gj,d9(gt,gs));if(!gn&>.cm){gt.cm.scrollIntoView({from:gs.from,to:cX(gs)})}var go=[];d7(gt,function(gx,gw){if(!gw&&dh(go,gx.history)==-1){dE(gx.history,gs);go.push(gx.history)}ee(gx,gs,null,d9(gx,gs))})}}function fn(gj,gl){if(gl==0){return}gj.first+=gl;gj.sel=new f4(bS(gj.sel.ranges,function(gm){return new dY(W(gm.anchor.line+gl,gm.anchor.ch),W(gm.head.line+gl,gm.head.ch))}),gj.sel.primIndex);if(gj.cm){ah(gj.cm,gj.first,gj.first-gl,gl);for(var gk=gj.cm.display,gi=gk.viewFrom;gigm.lastLine()){return}if(gn.from.linegk){gn={from:gn.from,to:W(gk,ff(gm,gk).text.length),text:[gn.text[0]],origin:gn.origin}}gn.removed=f5(gm,gn.from,gn.to);if(!gl){gl=fk(gm,gn)}if(gm.cm){aJ(gm.cm,gn,gj)}else{fy(gm,gn,gj)}ep(gm,gl,Z)}function aJ(gt,gp,gn){var gs=gt.doc,go=gt.display,gq=gp.from,gr=gp.to;var gi=false,gm=gq.line;if(!gt.options.lineWrapping){gm=bN(y(ff(gs,gq.line)));gs.iter(gm,gr.line+1,function(gv){if(gv==go.maxLine){gi=true;return true}})}if(gs.sel.contains(gp.from,gp.to)>-1){V(gt)}fy(gs,gp,gn,be(gt));if(!gt.options.lineWrapping){gs.iter(gm,gq.line+gp.text.length,function(gw){var gv=en(gw);if(gv>go.maxLineLength){go.maxLine=gw;go.maxLineLength=gv;go.maxLineChanged=true;gi=false}});if(gi){gt.curOp.updateMaxLine=true}}gs.frontier=Math.min(gs.frontier,gq.line);ef(gt,400);var gu=gp.text.length-(gr.line-gq.line)-1;if(gp.full){ah(gt)}else{if(gq.line==gr.line&&gp.text.length==1&&!dS(gt.doc,gp)){R(gt,gq.line,"text")}else{ah(gt,gq.line,gr.line+1,gu)}}var gk=fi(gt,"changes"),gl=fi(gt,"change");if(gl||gk){var gj={from:gq,to:gr,text:gp.text,removed:gp.removed,origin:gp.origin};if(gl){ae(gt,"change",gt,gj)}if(gk){(gt.curOp.changeObjs||(gt.curOp.changeObjs=[])).push(gj)}}gt.display.selForContextMenu=null}function a1(gl,gk,gn,gm,gi){if(!gm){gm=gn}if(cf(gm,gn)<0){var gj=gm;gm=gn;gn=gj}if(typeof gk=="string"){gk=gl.splitLines(gk)}bg(gl,{from:gn,to:gm,text:gk,origin:gi})}function d6(gj,gm){if(aR(gj,"scrollCursorIntoView")){return}var gn=gj.display,gk=gn.sizer.getBoundingClientRect(),gi=null;if(gm.top+gk.top<0){gi=true}else{if(gm.bottom+gk.top>(window.innerHeight||document.documentElement.clientHeight)){gi=false}}if(gi!=null&&!fu){var gl=f3("div","\u200b",null,"position: absolute; top: "+(gm.top-gn.viewOffset-e8(gj.display))+"px; height: "+(gm.bottom-gm.top+cT(gj)+gn.barHeight)+"px; left: "+gm.left+"px; width: 2px;");gj.display.lineSpace.appendChild(gl);gl.scrollIntoView(gi);gj.display.lineSpace.removeChild(gl)}}function D(gs,gq,gm,gl){if(gl==null){gl=0}for(var gn=0;gn<5;gn++){var go=false,gr=dU(gs,gq);var gi=!gm||gm==gq?gr:dU(gs,gm);var gk=G(gs,Math.min(gr.left,gi.left),Math.min(gr.top,gi.top)-gl,Math.max(gr.left,gi.left),Math.max(gr.bottom,gi.bottom)+gl);var gp=gs.doc.scrollTop,gj=gs.doc.scrollLeft;if(gk.scrollTop!=null){N(gs,gk.scrollTop);if(Math.abs(gs.doc.scrollTop-gp)>1){go=true}}if(gk.scrollLeft!=null){bE(gs,gk.scrollLeft);if(Math.abs(gs.doc.scrollLeft-gj)>1){go=true}}if(!go){break}}return gr}function E(gi,gk,gm,gj,gl){var gn=G(gi,gk,gm,gj,gl);if(gn.scrollTop!=null){N(gi,gn.scrollTop)}if(gn.scrollLeft!=null){bE(gi,gn.scrollLeft)}}function G(gu,gl,gt,gj,gs){var gq=gu.display,go=aY(gu.display);if(gt<0){gt=0}var gm=gu.curOp&&gu.curOp.scrollTop!=null?gu.curOp.scrollTop:gq.scroller.scrollTop;var gw=cV(gu),gy={};if(gs-gt>gw){gs=gt+gw}var gk=gu.doc.height+bI(gq);var gi=gtgk-go;if(gtgm+gw){var gr=Math.min(gt,(gp?gk:gs)-gw);if(gr!=gm){gy.scrollTop=gr}}}var gx=gu.curOp&&gu.curOp.scrollLeft!=null?gu.curOp.scrollLeft:gq.scroller.scrollLeft;var gv=dl(gu)-(gu.options.fixedGutter?gq.gutters.offsetWidth:0);var gn=gj-gl>gv;if(gn){gj=gl+gv}if(gl<10){gy.scrollLeft=0}else{if(glgv+gx-3){gy.scrollLeft=gj+(gn?0:10)-gv}}}return gy}function cL(gi,gk,gj){if(gk!=null||gj!=null){fC(gi)}if(gk!=null){gi.curOp.scrollLeft=(gi.curOp.scrollLeft==null?gi.doc.scrollLeft:gi.curOp.scrollLeft)+gk}if(gj!=null){gi.curOp.scrollTop=(gi.curOp.scrollTop==null?gi.doc.scrollTop:gi.curOp.scrollTop)+gj}}function fF(gi){fC(gi);var gj=gi.getCursor(),gl=gj,gk=gj;if(!gi.options.lineWrapping){gl=gj.ch?W(gj.line,gj.ch-1):gj;gk=W(gj.line,gj.ch+1)}gi.curOp.scrollToPos={from:gl,to:gk,margin:gi.options.cursorScrollMargin,isCursor:true}}function fC(gi){var gk=gi.curOp.scrollToPos;if(gk){gi.curOp.scrollToPos=null;var gm=dH(gi,gk.from),gl=dH(gi,gk.to);var gj=G(gi,Math.min(gm.left,gl.left),Math.min(gm.top,gl.top)-gk.margin,Math.max(gm.right,gl.right),Math.max(gm.bottom,gl.bottom)+gk.margin);gi.scrollTo(gj.scrollLeft,gj.scrollTop)}}function ad(gv,gl,gu,gk){var gt=gv.doc,gj;if(gu==null){gu="add"}if(gu=="smart"){if(!gt.mode.indent){gu="prev"}else{gj=dC(gv,gl)}}var gp=gv.options.tabSize;var gw=ff(gt,gl),go=bT(gw.text,null,gp);if(gw.stateAfter){gw.stateAfter=null}var gi=gw.text.match(/^\s*/)[0],gr;if(!gk&&!/\S/.test(gw.text)){gr=0;gu="not"}else{if(gu=="smart"){gr=gt.mode.indent(gj,gw.text.slice(gi.length),gw.text);if(gr==ca||gr>150){if(!gk){return}gu="prev"}}}if(gu=="prev"){if(gl>gt.first){gr=bT(ff(gt,gl-1).text,null,gp)}else{gr=0}}else{if(gu=="add"){gr=go+gv.options.indentUnit}else{if(gu=="subtract"){gr=go-gv.options.indentUnit}else{if(typeof gu=="number"){gr=go+gu}}}}gr=Math.max(0,gr);var gs="",gq=0;if(gv.options.indentWithTabs){for(var gm=Math.floor(gr/gp);gm;--gm){gq+=gp;gs+="\t"}}if(gq=0;gp--){a1(gi.doc,"",gm[gp].from,gm[gp].to,"+delete")}fF(gi)})}function bw(gA,gm,gu,gt,go){var gr=gm.line,gs=gm.ch,gz=gu;var gj=ff(gA,gr);var gx=true;function gy(){var gB=gr+gu;if(gB=gA.first+gA.size){return(gx=false)}gr=gB;return gj=ff(gA,gB)}function gw(gC){var gB=(go?u:ai)(gj,gs,gu,true);if(gB==null){if(!gC&&gy()){if(go){gs=(gu<0?cS:cE)(gj)}else{gs=gu<0?gj.text.length:0}}else{return(gx=false)}}else{gs=gB}return true}if(gt=="char"){gw()}else{if(gt=="column"){gw(true)}else{if(gt=="word"||gt=="group"){var gv=null,gp=gt=="group";var gi=gA.cm&&gA.cm.getHelper(gm,"wordChars");for(var gn=true;;gn=false){if(gu<0&&!gw(!gn)){break}var gk=gj.text.charAt(gs)||"\n";var gl=cA(gk,gi)?"w":gp&&gk=="\n"?"n":!gp||/\s/.test(gk)?null:"p";if(gp&&!gn&&!gl){gl="s"}if(gv&&gv!=gl){if(gu<0){gu=1;gw()}break}if(gl){gv=gl}if(gu>0&&!gw(!gn)){break}}}}}var gq=bV(gA,W(gr,gs),gz,true);if(!gx){gq.hitSide=true}return gq}function bq(gq,gl,gi,gp){var go=gq.doc,gn=gl.left,gm;if(gp=="page"){var gk=Math.min(gq.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);gm=gl.top+gi*(gk-(gi<0?1.5:0.5)*aY(gq.display))}else{if(gp=="line"){gm=gi>0?gl.bottom+3:gl.top-3}}for(;;){var gj=fO(gq,gn,gm);if(!gj.outside){break}if(gi<0?gm<=0:gm>=go.height){gj.hitSide=true;break}gm+=gi*5}return gj}H.prototype={constructor:H,focus:function(){window.focus();this.display.input.focus()},setOption:function(gk,gl){var gj=this.options,gi=gj[gk];if(gj[gk]==gl&&gk!="mode"){return}gj[gk]=gl;if(bf.hasOwnProperty(gk)){c2(this,bf[gk])(this,gl,gi)}},getOption:function(gi){return this.options[gi]},getDoc:function(){return this.doc},addKeyMap:function(gj,gi){this.state.keyMaps[gi?"push":"unshift"](fY(gj))},removeKeyMap:function(gj){var gk=this.state.keyMaps;for(var gi=0;gi0){e(this.doc,gn,new dY(gp,gk[gn].to()),Z)}}else{if(go.head.line>gl){ad(this,go.head.line,gr,true);gl=go.head.line;if(gn==this.doc.sel.primIndex){fF(this)}}}}}),getTokenAt:function(gj,gi){return cq(this,gj,gi)},getLineTokens:function(gj,gi){return cq(this,W(gj),gi,true)},getTokenTypeAt:function(gp){gp=fJ(this.doc,gp);var gl=c6(this,ff(this.doc,gp.line));var gn=0,go=(gl.length-1)/2,gk=gp.ch;var gj;if(gk==0){gj=gl[2]}else{for(;;){var gi=(gn+go)>>1;if((gi?gl[gi*2-1]:0)>=gk){go=gi}else{if(gl[gi*2+1]gl){gj=gl;gi=true}}gk=ff(this.doc,gj)}else{gk=gj}return eQ(this,gk,{top:0,left:0},gm||"page").top+(gi?this.doc.height-bM(gk):0)},defaultTextHeight:function(){return aY(this.display)},defaultCharWidth:function(){return dD(this.display)},setGutterMarker:c8(function(gi,gj,gk){return ez(this.doc,gi,"gutter",function(gl){var gm=gl.gutterMarkers||(gl.gutterMarkers={});gm[gj]=gk;if(!gk&&eU(gm)){gl.gutterMarkers=null}return true})}),clearGutter:c8(function(gk){var gi=this,gl=gi.doc,gj=gl.first;gl.iter(function(gm){if(gm.gutterMarkers&&gm.gutterMarkers[gk]){gm.gutterMarkers[gk]=null;R(gi,gj,"gutter");if(eU(gm.gutterMarkers)){gm.gutterMarkers=null}}++gj})}),lineInfo:function(gi){if(typeof gi=="number"){if(!b9(this.doc,gi)){return null}var gj=gi;gi=ff(this.doc,gi);if(!gi){return null}}else{var gj=bN(gi);if(gj==null){return null}}return{line:gj,handle:gi,text:gi.text,gutterMarkers:gi.gutterMarkers,textClass:gi.textClass,bgClass:gi.bgClass,wrapClass:gi.wrapClass,widgets:gi.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(gn,gk,gp,gl,gr){var gm=this.display;gn=dU(this,fJ(this.doc,gn));var go=gn.bottom,gj=gn.left;gk.style.position="absolute";gk.setAttribute("cm-ignore-events","true");this.display.input.setUneditable(gk);gm.sizer.appendChild(gk);if(gl=="over"){go=gn.top}else{if(gl=="above"||gl=="near"){var gi=Math.max(gm.wrapper.clientHeight,this.doc.height),gq=Math.max(gm.sizer.clientWidth,gm.lineSpace.clientWidth);if((gl=="above"||gn.bottom+gk.offsetHeight>gi)&&gn.top>gk.offsetHeight){go=gn.top-gk.offsetHeight}else{if(gn.bottom+gk.offsetHeight<=gi){go=gn.bottom}}if(gj+gk.offsetWidth>gq){gj=gq-gk.offsetWidth}}}gk.style.top=go+"px";gk.style.left=gk.style.right="";if(gr=="right"){gj=gm.sizer.clientWidth-gk.offsetWidth;gk.style.right="0px"}else{if(gr=="left"){gj=0}else{if(gr=="middle"){gj=(gm.sizer.clientWidth-gk.offsetWidth)/2}}gk.style.left=gj+"px"}if(gp){E(this,gj,go,gj+gk.offsetWidth,go+gk.offsetHeight)}},triggerOnKeyDown:c8(p),triggerOnKeyPress:c8(cx),triggerOnKeyUp:bi,execCommand:function(gi){if(eD.hasOwnProperty(gi)){return eD[gi](this)}},triggerElectric:c8(function(gi){fW(this,gi)}),findPosH:function(go,gl,gm,gj){var gi=1;if(gl<0){gi=-1;gl=-gl}for(var gk=0,gn=fJ(this.doc,go);gk0&&gi(gl.charAt(go-1))){--go}while(gk0.5){X(this)}aE(this,"refresh",this)}),swapDoc:c8(function(gj){var gi=this.doc;gi.cm=null;eb(this,gj);ak(this);this.display.input.reset();this.scrollTo(gj.scrollLeft,gj.scrollTop);this.curOp.forceScroll=true;ae(this,"swapDoc",this,gi);return gi}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};by(H);var e3=H.defaults={};var bf=H.optionHandlers={};function s(gi,gl,gk,gj){H.defaults[gi]=gl;if(gk){bf[gi]=gj?function(gm,go,gn){if(gn!=cc){gk(gm,go,gn)}}:gk}}var cc=H.Init={toString:function(){return"CodeMirror.Init"}};s("value","",function(gi,gj){gi.setValue(gj)},true);s("mode",null,function(gi,gj){gi.doc.modeOption=gj;br(gi)},true);s("indentUnit",2,br,true);s("indentWithTabs",false);s("smartIndent",true);s("tabSize",4,function(gi){el(gi);ak(gi);ah(gi)},true);s("lineSeparator",null,function(gi,gl){gi.doc.lineSep=gl;if(!gl){return}var gk=[],gm=gi.doc.first;gi.doc.iter(function(gn){for(var gp=0;;){var go=gn.text.indexOf(gl,gp);if(go==-1){break}gp=go+gl.length;gk.push(W(gm,go))}gm++});for(var gj=gk.length-1;gj>=0;gj--){a1(gi.doc,gl,gk[gj],W(gk[gj].line,gk[gj].ch+gl.length))}});s("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(gi,gk,gj){gi.state.specialChars=new RegExp(gk.source+(gk.test("\t")?"":"|\t"),"g");if(gj!=H.Init){gi.refresh()}});s("specialCharPlaceholder",fc,function(gi){gi.refresh()},true);s("electricChars",true);s("inputStyle",eg?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},true);s("rtlMoveVisually",!aP);s("wholeLineUpdateBefore",true);s("theme","default",function(gi){cO(gi);dw(gi)},true);s("keyMap","default",function(gi,gm,gj){var gk=fY(gm);var gl=gj!=H.Init&&fY(gj);if(gl&&gl.detach){gl.detach(gi,gk)}if(gk.attach){gk.attach(gi,gl||null)}});s("extraKeys",null);s("lineWrapping",false,eG,true);s("gutters",[],function(gi){ce(gi.options);dw(gi)},true);s("fixedGutter",true,function(gi,gj){gi.display.gutters.style.left=gj?dX(gi.display)+"px":"0";gi.refresh()},true);s("coverGutterNextToScrollbar",false,function(gi){eY(gi)},true);s("scrollbarStyle","native",function(gi){aD(gi);eY(gi);gi.display.scrollbars.setScrollTop(gi.doc.scrollTop);gi.display.scrollbars.setScrollLeft(gi.doc.scrollLeft)},true);s("lineNumbers",false,function(gi){ce(gi.options);dw(gi)},true);s("firstLineNumber",1,dw,true);s("lineNumberFormatter",function(gi){return gi},dw,true);s("showCursorWhenSelecting",false,bC,true);s("resetSelectionOnContextMenu",true);s("lineWiseCopyCut",true);s("readOnly",false,function(gi,gj){if(gj=="nocursor"){aV(gi);gi.display.input.blur();gi.display.disabled=true}else{gi.display.disabled=false;if(!gj){gi.display.input.reset()}}});s("disableInput",false,function(gi,gj){if(!gj){gi.display.input.reset()}},true);s("dragDrop",true,f1);s("cursorBlinkRate",530);s("cursorScrollMargin",0);s("cursorHeight",1,bC,true);s("singleCursorHeightPerLine",true,bC,true);s("workTime",100);s("workDelay",100);s("flattenSpans",true,el,true);s("addModeClass",false,el,true);s("pollInterval",100);s("undoDepth",200,function(gi,gj){gi.doc.history.undoDepth=gj});s("historyEventDelay",1250);s("viewportMargin",10,function(gi){gi.refresh()},true);s("maxHighlightLength",10000,el,true);s("moveInputWithCursor",true,function(gi,gj){if(!gj){gi.display.input.resetPosition()}});s("tabindex",null,function(gi,gj){gi.display.input.getField().tabIndex=gj||""});s("autofocus",null);var ds=H.modes={},aS=H.mimeModes={};H.defineMode=function(gi,gj){if(!H.defaults.mode&&gi!="null"){H.defaults.mode=gi}if(arguments.length>2){gj.dependencies=Array.prototype.slice.call(arguments,2)}ds[gi]=gj};H.defineMIME=function(gj,gi){aS[gj]=gi};H.resolveMode=function(gi){if(typeof gi=="string"&&aS.hasOwnProperty(gi)){gi=aS[gi]}else{if(gi&&typeof gi.name=="string"&&aS.hasOwnProperty(gi.name)){var gj=aS[gi.name];if(typeof gj=="string"){gj={name:gj}}gi=ck(gj,gi);gi.name=gj.name}else{if(typeof gi=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(gi)){return H.resolveMode("application/xml")}}}if(typeof gi=="string"){return{name:gi}}else{return gi||{name:"null"}}};H.getMode=function(gj,gi){var gi=H.resolveMode(gi);var gl=ds[gi.name];if(!gl){return H.getMode(gj,"text/plain")}var gm=gl(gj,gi);if(dp.hasOwnProperty(gi.name)){var gk=dp[gi.name];for(var gn in gk){if(!gk.hasOwnProperty(gn)){continue}if(gm.hasOwnProperty(gn)){gm["_"+gn]=gm[gn]}gm[gn]=gk[gn]}}gm.name=gi.name;if(gi.helperType){gm.helperType=gi.helperType}if(gi.modeProps){for(var gn in gi.modeProps){gm[gn]=gi.modeProps[gn]}}return gm};H.defineMode("null",function(){return{token:function(gi){gi.skipToEnd()}}});H.defineMIME("text/plain","null");var dp=H.modeExtensions={};H.extendMode=function(gk,gj){var gi=dp.hasOwnProperty(gk)?dp[gk]:(dp[gk]={});aN(gj,gi)};H.defineExtension=function(gi,gj){H.prototype[gi]=gj};H.defineDocExtension=function(gi,gj){at.prototype[gi]=gj};H.defineOption=s;var a8=[];H.defineInitHook=function(gi){a8.push(gi)};var fo=H.helpers={};H.registerHelper=function(gj,gi,gk){if(!fo.hasOwnProperty(gj)){fo[gj]=H[gj]={_global:[]}}fo[gj][gi]=gk};H.registerGlobalHelper=function(gk,gj,gi,gl){H.registerHelper(gk,gj,gl);fo[gk]._global.push({pred:gi,val:gl})};var b3=H.copyState=function(gl,gi){if(gi===true){return gi}if(gl.copyState){return gl.copyState(gi)}var gk={};for(var gm in gi){var gj=gi[gm];if(gj instanceof Array){gj=gj.concat([])}gk[gm]=gj}return gk};var b0=H.startState=function(gk,gj,gi){return gk.startState?gk.startState(gj,gi):true};H.innerMode=function(gk,gi){while(gk.innerMode){var gj=gk.innerMode(gi);if(!gj||gj.mode==gk){break}gi=gj.state;gk=gj.mode}return gj||{mode:gk,state:gi}};var eD=H.commands={selectAll:function(gi){gi.setSelection(W(gi.firstLine(),0),W(gi.lastLine()),Z)},singleSelection:function(gi){gi.setSelection(gi.getCursor("anchor"),gi.getCursor("head"),Z)},killLine:function(gi){eX(gi,function(gk){if(gk.empty()){var gj=ff(gi.doc,gk.head.line).text.length;if(gk.head.ch==gj&&gk.head.line0){go=new W(go.line,go.ch+1);gi.replaceRange(gj.charAt(go.ch-1)+gj.charAt(go.ch-2),W(go.line,go.ch-2),go,"+transpose")}else{if(go.line>gi.doc.first){var gn=ff(gi.doc,go.line-1).text;if(gn){gi.replaceRange(gj.charAt(0)+gi.doc.lineSeparator()+gn.charAt(gn.length-1),W(go.line-1,gn.length-1),W(go.line,1),"+transpose")}}}}gk.push(new dY(go,go))}gi.setSelections(gk)})},newlineAndIndent:function(gi){cM(gi,function(){var gj=gi.listSelections().length;for(var gl=0;gl=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||undefined},next:function(){if(this.posgj},eatSpace:function(){var gi=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos))){++this.pos}return this.pos>gi},skipToEnd:function(){this.pos=this.string.length},skipTo:function(gi){var gj=this.string.indexOf(gi,this.pos);if(gj>-1){this.pos=gj;return true}},backUp:function(gi){this.pos-=gi},column:function(){if(this.lastColumnPos0){return null}if(gk&&gj!==false){this.pos+=gk[0].length}return gk}},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(gj,gi){this.lineStart+=gj;try{return gi()}finally{this.lineStart-=gj}}};var a5=0;var P=H.TextMarker=function(gj,gi){this.lines=[];this.type=gi;this.doc=gj;this.id=++a5};by(P);P.prototype.clear=function(){if(this.explicitlyCleared){return}var gp=this.doc.cm,gj=gp&&!gp.curOp;if(gj){cI(gp)}if(fi(this,"clear")){var gq=this.find();if(gq){ae(this,"clear",gq.from,gq.to)}}var gk=null,gn=null;for(var gl=0;glgp.display.maxLineLength){gp.display.maxLine=gi;gp.display.maxLineLength=gm;gp.display.maxLineChanged=true}}}if(gk!=null&&gp&&this.collapsed){ah(gp,gk,gn+1)}this.lines.length=0;this.explicitlyCleared=true;if(this.atomic&&this.doc.cantEdit){this.doc.cantEdit=false;if(gp){ey(gp.doc)}}if(gp){ae(gp,"markerCleared",gp,this)}if(gj){am(gp)}if(this.parent){this.parent.clear()}};P.prototype.find=function(gl,gj){if(gl==null&&this.type=="bookmark"){gl=1}var go,gn;for(var gk=0;gk0||gr==0&&gl.clearWhenEmpty!==false){return gl}if(gl.replacedWith){gl.collapsed=true;gl.widgetNode=f3("span",[gl.replacedWith],"CodeMirror-widget");if(!gs.handleMouseEvents){gl.widgetNode.setAttribute("cm-ignore-events","true")}if(gs.insertLeft){gl.widgetNode.insertLeft=true}}if(gl.collapsed){if(z(gq,go.line,go,gp,gl)||go.line!=gp.line&&z(gq,gp.line,go,gp,gl)){throw new Error("Inserting collapsed marker partially overlapping an existing one")}a7=true}if(gl.addToHistory){fM(gq,{from:go,to:gp,origin:"markText"},gq.sel,NaN)}var gj=go.line,gn=gq.cm,gi;gq.iter(gj,gp.line+1,function(gt){if(gn&&gl.collapsed&&!gn.options.lineWrapping&&y(gt)==gn.display.maxLine){gi=true}if(gl.collapsed&&gj!=go.line){f6(gt,0)}cd(gt,new ei(gl,gj==go.line?go.ch:null,gj==gp.line?gp.ch:null));++gj});if(gl.collapsed){gq.iter(go.line,gp.line+1,function(gt){if(fw(gq,gt)){f6(gt,0)}})}if(gl.clearOnEnter){bX(gl,"beforeCursorEnter",function(){gl.clear()})}if(gl.readOnly){gd=true;if(gq.history.done.length||gq.history.undone.length){gq.clearHistory()}}if(gl.collapsed){gl.id=++a5;gl.atomic=true}if(gn){if(gi){gn.curOp.updateMaxLine=true}if(gl.collapsed){ah(gn,go.line,gp.line+1)}else{if(gl.className||gl.title||gl.startStyle||gl.endStyle||gl.css){for(var gk=go.line;gk<=gp.line;gk++){R(gn,gk,"text")}}}if(gl.atomic){ey(gn.doc)}ae(gn,"markerAdded",gn,gl)}return gl}var x=H.SharedTextMarker=function(gk,gj){this.markers=gk;this.primary=gj;for(var gi=0;gi=gk:gq.to>gk);(gp||(gp=[])).push(new ei(gn,gq.from,gl?null:gq.to))}}}return gp}function aB(gj,gl,go){if(gj){for(var gm=0,gp;gm=gl:gq.to>gl);if(gk||gq.from==gl&&gn.type=="bookmark"&&(!go||gq.marker.insertLeft)){var gi=gq.from==null||(gn.inclusiveLeft?gq.from<=gl:gq.from0&&go){for(var gl=0;gl0){continue}var gr=[gl,1],gi=cf(gj.from,gk.from),gq=cf(gj.to,gk.to);if(gi<0||!gp.inclusiveLeft&&!gi){gr.push({from:gj.from,to:gk.from})}if(gq>0||!gp.inclusiveRight&&!gq){gr.push({from:gk.to,to:gj.to})}gn.splice.apply(gn,gr);gl+=gr.length-1}}return gn}function f9(gi){var gk=gi.markedSpans;if(!gk){return}for(var gj=0;gj=0&&gn<=0||gr<=0&&gn>=0){continue}if(gr<=0&&(cf(gs.to,go)>0||(gj.marker.inclusiveRight&&gm.inclusiveLeft))||gr>=0&&(cf(gs.from,gp)<0||(gj.marker.inclusiveLeft&&gm.inclusiveRight))){return true}}}}function y(gj){var gi;while(gi=eO(gj)){gj=gi.find(-1,true).line}return gj}function g(gk){var gi,gj;while(gi=ew(gk)){gk=gi.find(1,true).line;(gj||(gj=[])).push(gk)}return gj}function aW(gl,gj){var gi=ff(gl,gj),gk=y(gi);if(gi==gk){return gj}return bN(gk)}function d2(gl,gk){if(gk>gl.lastLine()){return gk}var gj=ff(gl,gk),gi;if(!fw(gl,gj)){return gk}while(gi=ew(gj)){gj=gi.find(1,true).line}return bN(gj)+1}function fw(gm,gj){var gi=a7&&gj.markedSpans;if(gi){for(var gl,gk=0;gkgm.start){return gk}}throw new Error("Mode "+gn.name+" failed to advance stream.")}function cq(gr,gp,gm,gl){function gi(gu){return{start:gs.start,end:gs.pos,string:gs.current(),type:gk||null,state:gu?b3(gq.mode,gj):gj}}var gq=gr.doc,gn=gq.mode,gk;gp=fJ(gq,gp);var gt=ff(gq,gp.line),gj=dC(gr,gp.line,gm);var gs=new eT(gt.text,gr.options.tabSize),go;if(gl){go=[]}while((gl||gs.posgs.options.maxHighlightLength){gk=false;if(gm){dx(gs,gu,gj,gt.pos)}gt.pos=gu.length;gi=null}else{gi=di(eA(gn,gt,gj,gw),gl)}if(gw){var gv=gw[0].name;if(gv){gi="m-"+(gi?gv+" "+gi:gv)}}if(!gk||gp!=gi){while(gqgs){gq.splice(go,1,gs,gq[go+1],gt)}go+=2;gk=Math.min(gs,gt)}if(!gu){return}if(gn.opaque){gq.splice(gw,go-gw,gs,"cm-overlay "+gu);go=gw+2}else{for(;gwgl&&gm.from<=gl){break}}if(gm.to>=gn){return gj(gr,gt,gk,go,gu,gs,gq)}gj(gr,gt.slice(0,gm.to-gl),gk,go,null,gs,gq);go=null;gt=gt.slice(gm.to-gl);gl=gm.to}}}function ac(gj,gl,gi,gk){var gm=!gk&&gi.widgetNode;if(gm){gj.map.push(gj.pos,gj.pos+gl,gm)}if(!gk&&gj.cm.display.input.needsContentAttribute){if(!gm){gm=gj.content.appendChild(document.createElement("span"))}gm.setAttribute("cm-marker",gi.id)}if(gm){gj.cm.display.input.setUneditable(gm);gj.content.appendChild(gm)}gj.pos+=gl}function bo(gr,gy,gq){var gn=gr.markedSpans,gp=gr.text,gw=0;if(!gn){for(var gB=1;gBgm||gx.collapsed&&gA.to==gm&&gA.from==gm)){if(gA.to!=null&&gA.to!=gm&&gF>gA.to){gF=gA.to;gE=""}if(gx.className){gi+=" "+gx.className}if(gx.css){gs=gx.css}if(gx.startStyle&&gA.from==gm){gv+=" "+gx.startStyle}if(gx.endStyle&&gA.to==gF){gE+=" "+gx.endStyle}if(gx.title&&!gG){gG=gx.title}if(gx.collapsed&&(!gk||dQ(gk.marker,gx)<0)){gk=gA}}else{if(gA.from>gm&&gF>gA.from){gF=gA.from}}}}if(gk&&(gk.from||0)==gm){ac(gy,(gk.to==null?gC+1:gk.to)-gm,gk.marker,gk.from==null);if(gk.to==null){return}if(gk.to==gm){gk=false}}if(!gk&&go.length){for(var gz=0;gz=gC){break}var gt=Math.min(gC,gF);while(true){if(gu){var gj=gm+gu.length;if(!gk){var gl=gj>gt?gu.slice(0,gt-gm):gu;gy.addToken(gy,gl,gD?gD+gi:gi,gv,gm+gl.length==gF?gE:"",gG,gs)}if(gj>=gt){gu=gu.slice(gt-gm);gm=gt;break}gm=gj;gv=""}gu=gp.slice(gw,gw=gq[gB++]);gD=eW(gq[gB++],gy.cm.options)}}}function dS(gi,gj){return gj.from.ch==0&&gj.to.ch==0&&fG(gj.text)==""&&(!gi.cm||gi.cm.options.wholeLineUpdateBefore)}function fy(gv,gq,gj,gm){function gw(gy){return gj?gj[gy]:null}function gk(gy,gA,gz){em(gy,gA,gz,gm);ae(gy,"change",gy,gq)}function gi(gB,gz){for(var gA=gB,gy=[];gA1){gv.remove(gu.line+1,go-1)}gv.insert(gu.line+1,gn)}}}}ae(gv,"change",gv,gq)}function eZ(gj){this.lines=gj;this.parent=null;for(var gk=0,gi=0;gk1||!(this.children[0] instanceof eZ))){var gj=[];this.collapse(gj);this.children=[new eZ(gj)];this.children[0].parent=this}},collapse:function(gi){for(var gj=0;gj50){while(gp.lines.length>50){var gm=gp.lines.splice(gp.lines.length-25,25);var gl=new eZ(gm);gp.height-=gl.height;this.children.splice(gn+1,0,gl);gl.parent=this}this.maybeSpill()}break}gj-=go}},maybeSpill:function(){if(this.children.length<=10){return}var gl=this;do{var gj=gl.children.splice(gl.children.length-5,5);var gk=new fx(gj);if(!gl.parent){var gm=new fx(gl.children);gm.parent=gl;gl.children=[gm,gk];gl=gm}else{gl.size-=gk.size;gl.height-=gk.height;var gi=dh(gl.parent.children,gl);gl.parent.children.splice(gi+1,0,gk)}gk.parent=gl.parent}while(gl.children.length>10);gl.parent.maybeSpill()},iterN:function(gi,go,gn){for(var gj=0;gj=0;gl--){bg(this,gm[gl])}if(gi){e7(this,gi)}else{if(this.cm){fF(this.cm)}}}),undo:cD(function(){b8(this,"undo")}),redo:cD(function(){b8(this,"redo")}),undoSelection:cD(function(){b8(this,"undo",true)}),redoSelection:cD(function(){b8(this,"redo",true)}),setExtending:function(gi){this.extend=gi},getExtending:function(){return this.extend},historySize:function(){var gl=this.history,gi=0,gk=0;for(var gj=0;gj=gm.ch)){gl.push(gk.marker.parent||gk.marker)}}}return gl},findMarks:function(gm,gl,gi){gm=fJ(this,gm);gl=fJ(this,gl);var gj=[],gk=gm.line;this.iter(gm.line,gl.line+1,function(gn){var gp=gn.markedSpans;if(gp){for(var go=0;gogq.to||gq.from==null&&gk!=gm.line||gk==gl.line&&gq.from>gl.ch)&&(!gi||gi(gq.marker))){gj.push(gq.marker.parent||gq.marker)}}}++gk});return gj},getAllMarks:function(){var gi=[];this.iter(function(gk){var gj=gk.markedSpans;if(gj){for(var gl=0;glgj){gi=gj;return true}gj-=gm;++gk});return fJ(this,W(gk,gi))},indexFromPos:function(gj){gj=fJ(this,gj);var gi=gj.ch;if(gj.linegl){gl=gi.from}if(gi.to!=null&&gi.to=gl.size){throw new Error("There is no line "+(gn+gl.first)+" in the document.")}for(var gi=gl;!gi.lines;){for(var gj=0;;++gj){var gm=gi.children[gj],gk=gm.chunkSize();if(gn1&&!gj.done[gj.done.length-2].ranges){gj.done.pop();return fG(gj.done)}}}}function fM(go,gm,gi,gl){var gk=go.history;gk.undone.length=0;var gj=+new Date,gp;if((gk.lastOp==gl||gk.lastOrigin==gm.origin&&gm.origin&&((gm.origin.charAt(0)=="+"&&go.cm&&gk.lastModTime>gj-go.cm.options.historyEventDelay)||gm.origin.charAt(0)=="*"))&&(gp=eM(gk,gk.lastOp==gl))){var gq=fG(gp.changes);if(cf(gm.from,gm.to)==0&&cf(gm.from,gq.to)==0){gq.to=cX(gm)}else{gp.changes.push(du(go,gm))}}else{var gn=fG(gk.done);if(!gn||!gn.ranges){cN(go.sel,gk.done)}gp={changes:[du(go,gm)],generation:gk.generation};gk.done.push(gp);while(gk.done.length>gk.undoDepth){gk.done.shift();if(!gk.done[0].ranges){gk.done.shift()}}}gk.done.push(gi);gk.generation=++gk.maxGeneration;gk.lastModTime=gk.lastSelTime=gj;gk.lastOp=gk.lastSelOp=gl;gk.lastOrigin=gk.lastSelOrigin=gm.origin;if(!gq){aE(go,"historyAdded")}}function bA(gm,gi,gk,gl){var gj=gi.charAt(0);return gj=="*"||gj=="+"&&gk.ranges.length==gl.ranges.length&&gk.somethingSelected()==gl.somethingSelected()&&new Date-gm.history.lastSelTime<=(gm.cm?gm.cm.options.historyEventDelay:500)}function gc(gn,gl,gi,gk){var gm=gn.history,gj=gk&&gk.origin;if(gi==gm.lastSelOp||(gj&&gm.lastSelOrigin==gj&&(gm.lastModTime==gm.lastSelTime&&gm.lastOrigin==gj||bA(gn,gj,fG(gm.done),gl)))){gm.done[gm.done.length-1]=gl}else{cN(gl,gm.done)}gm.lastSelTime=+new Date;gm.lastSelOrigin=gj;gm.lastSelOp=gi;if(gk&&gk.clearRedo!==false){fB(gm.undone)}}function cN(gj,gi){var gk=fG(gi);if(!(gk&&gk.ranges&&gk.equals(gj))){gi.push(gj)}}function bY(gj,gn,gm,gl){var gi=gn["spans_"+gj.id],gk=0;gj.iter(Math.max(gj.first,gm),Math.min(gj.first+gj.size,gl),function(go){if(go.markedSpans){(gi||(gi=gn["spans_"+gj.id]={}))[gk]=go.markedSpans}++gk})}function bl(gk){if(!gk){return null}for(var gj=0,gi;gj-1){fG(gr)[gi]=gp[gi];delete gp[gi]}}}}}}return gj}function I(gl,gk,gj,gi){if(gj0}function by(gi){gi.prototype.on=function(gj,gk){bX(this,gj,gk)};gi.prototype.off=function(gj,gk){ed(this,gj,gk)}}var dJ=30;var ca=H.Pass={toString:function(){return"CodeMirror.Pass"}};var Z={scroll:false},M={origin:"*mouse"},cW={origin:"+move"};function gh(){this.id=null}gh.prototype.set=function(gi,gj){clearTimeout(this.id);this.id=setTimeout(gj,gi)};var bT=H.countColumn=function(gl,gj,gn,go,gk){if(gj==null){gj=gl.search(/[^\s\u00a0]/);if(gj==-1){gj=gl.length}}for(var gm=go||0,gp=gk||0;;){var gi=gl.indexOf("\t",gm);if(gi<0||gi>=gj){return gp+(gj-gm)}gp+=gi-gm;gp+=gn-(gp%gn);gm=gi+1}};function eq(gm,gl,gn){for(var go=0,gk=0;;){var gj=gm.indexOf("\t",go);if(gj==-1){gj=gm.length}var gi=gj-go;if(gj==gm.length||gk+gi>=gl){return go+Math.min(gi,gl-gk)}gk+=gj-go;gk+=gn-(gk%gn);go=gj+1;if(gk>=gl){return go}}}var a0=[""];function cp(gi){while(a0.length<=gi){a0.push(fG(a0)+" ")}return a0[gi]}function fG(gi){return gi[gi.length-1]}var dL=function(gi){gi.select()};if(e1){dL=function(gi){gi.selectionStart=0;gi.selectionEnd=gi.value.length}}else{if(dK){dL=function(gj){try{gj.select()}catch(gi){}}}}function dh(gk,gi){for(var gj=0;gj"\x80"&&(gi.toUpperCase()!=gi.toLowerCase()||bc.test(gi))};function cA(gi,gj){if(!gj){return fD(gi)}if(gj.source.indexOf("\\w")>-1&&fD(gi)){return true}return gj.test(gi)}function eU(gi){for(var gj in gi){if(gi.hasOwnProperty(gj)&&gi[gj]){return false}}return true}var eJ=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function fp(gi){return gi.charCodeAt(0)>=768&&eJ.test(gi)}function f3(gi,gm,gl,gk){var gn=document.createElement(gi);if(gl){gn.className=gl}if(gk){gn.style.cssText=gk}if(typeof gm=="string"){gn.appendChild(document.createTextNode(gm))}else{if(gm){for(var gj=0;gj0;--gi){gj.removeChild(gj.firstChild)}return gj}function bR(gi,gj){return d1(gi).appendChild(gj)}var gb=H.contains=function(gi,gj){if(gj.nodeType==3){gj=gj.parentNode}if(gi.contains){return gi.contains(gj)}do{if(gj.nodeType==11){gj=gj.host}if(gj==gi){return true}}while(gj=gj.parentNode)};function dO(){var gi=document.activeElement;while(gi&&gi.root&&gi.root.activeElement){gi=gi.root.activeElement}return gi}if(dK&&k<11){dO=function(){try{return document.activeElement}catch(gi){return document.body}}}function S(gi){return new RegExp("(^|\\s)"+gi+"(?:$|\\s)\\s*")}var f=H.rmClass=function(gk,gi){var gl=gk.className;var gj=S(gi).exec(gl);if(gj){var gm=gl.slice(gj.index+gj[0].length);gk.className=gl.slice(0,gj.index)+(gm?gj[1]+gm:"")}};var fA=H.addClass=function(gj,gi){var gk=gj.className;if(!S(gi).test(gk)){gj.className+=(gk?" ":"")+gi}};function fT(gk,gi){var gj=gk.split(" ");for(var gl=0;gl2&&!(dK&&k<8)}}var gj=fL?f3("span","\u200b"):f3("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px");gj.setAttribute("cm-text","");return gj}var fK;function bO(gl){if(fK!=null){return fK}var gi=bR(gl,document.createTextNode("A\u062eA"));var gk=cl(gi,0,1).getBoundingClientRect();if(!gk||gk.left==gk.right){return false}var gj=cl(gi,1,2).getBoundingClientRect();return fK=(gj.right-gk.right<3)}var fS=H.splitLines="\n\nb".split(/\n/).length!=3?function(gn){var go=0,gi=[],gm=gn.length;while(go<=gm){var gl=gn.indexOf("\n",go);if(gl==-1){gl=gn.length}var gk=gn.slice(go,gn.charAt(gl-1)=="\r"?gl-1:gl);var gj=gk.indexOf("\r");if(gj!=-1){gi.push(gk.slice(0,gj));go+=gj+1}else{gi.push(gk);go=gl+1}}return gi}:function(gi){return gi.split(/\r\n?|\n/)};var bs=window.getSelection?function(gj){try{return gj.selectionStart!=gj.selectionEnd}catch(gi){return false}}:function(gk){try{var gi=gk.ownerDocument.selection.createRange()}catch(gj){}if(!gi||gi.parentElement()!=gk){return false}return gi.compareEndPoints("StartToEnd",gi)!=0};var da=(function(){var gi=f3("div");if("oncopy" in gi){return true}gi.setAttribute("oncopy","return;");return typeof gi.oncopy=="function"})();var e6=null;function aK(gj){if(e6!=null){return e6}var gk=bR(gj,f3("span","x"));var gl=gk.getBoundingClientRect();var gi=cl(gk,0,1).getBoundingClientRect();return e6=Math.abs(gl.left-gi.left)>1}var fg={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};H.keyNames=fg;(function(){for(var gi=0;gi<10;gi++){fg[gi+48]=fg[gi+96]=String(gi)}for(var gi=65;gi<=90;gi++){fg[gi]=String.fromCharCode(gi)}for(var gi=1;gi<=12;gi++){fg[gi+111]=fg[gi+63235]="F"+gi}})();function d4(gi,go,gn,gm){if(!gi){return gm(go,gn,"ltr")}var gl=false;for(var gk=0;gkgo||go==gn&&gj.to==go){gm(Math.max(gj.from,go),Math.min(gj.to,gn),gj.level==1?"rtl":"ltr");gl=true}}if(!gl){gm(go,gn,"ltr")}}function dy(gi){return gi.level%2?gi.to:gi.from}function ge(gi){return gi.level%2?gi.from:gi.to}function cE(gj){var gi=a(gj);return gi?dy(gi[0]):0}function cS(gj){var gi=a(gj);if(!gi){return gj.text.length}return ge(fG(gi))}function bt(gj,gm){var gk=ff(gj.doc,gm);var gn=y(gk);if(gn!=gk){gm=bN(gn)}var gi=a(gn);var gl=!gi?0:gi[0].level%2?cS(gn):cE(gn);return W(gm,gl)}function dP(gk,gn){var gj,gl=ff(gk.doc,gn);while(gj=ew(gl)){gl=gj.find(1,true).line;gn=null}var gi=a(gl);var gm=!gi?gl.text.length:gi[0].level%2?cE(gl):cS(gl);return W(gn==null?bN(gl):gn,gm)}function dI(gj,go){var gn=bt(gj,go.line);var gk=ff(gj.doc,gn.line);var gi=a(gk);if(!gi||gi[0].level==0){var gm=Math.max(0,gk.text.search(/\S/));var gl=go.line==gn.line&&go.ch<=gm&&go.ch;return W(gn.line,gl?0:gm)}return gn}function an(gj,gk,gi){var gl=gj[0].level;if(gk==gl){return true}if(gi==gl){return false}return gkgm){return gj}if((gl.from==gm||gl.to==gm)){if(gk==null){gk=gj}else{if(an(gi,gl.level,gi[gk].level)){if(gl.from!=gl.to){e2=gk}return gj}else{if(gl.from!=gl.to){e2=gj}return gk}}}}return gk}function fe(gi,gl,gj,gk){if(!gk){return gl+gj}do{gl+=gj}while(gl>0&&fp(gi.text.charAt(gl)));return gl}function u(gi,gp,gk,gl){var gm=a(gi);if(!gm){return ai(gi,gp,gk,gl)}var go=aG(gm,gp),gj=gm[go];var gn=fe(gi,gp,gj.level%2?-gk:gk,gl);for(;;){if(gn>gj.from&&gn0)==gj.level%2?gj.to:gj.from}else{gj=gm[go+=gk];if(!gj){return null}if((gk>0)==gj.level%2){gn=fe(gi,gj.to,-1,gl)}else{gn=fe(gi,gj.from,1,gl)}}}}function ai(gi,gm,gj,gk){var gl=gm+gj;if(gk){while(gl>0&&fp(gi.text.charAt(gl))){gl+=gj}}return gl<0||gl>gi.text.length?null:gl}var bh=(function(){var go="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";var gm="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";function gl(gs){if(gs<=247){return go.charAt(gs)}else{if(1424<=gs&&gs<=1524){return"R"}else{if(1536<=gs&&gs<=1773){return gm.charAt(gs-1536)}else{if(1774<=gs&&gs<=2220){return"r"}else{if(8192<=gs&&gs<=8203){return"w"}else{if(gs==8204){return"b"}else{return"L"}}}}}}}var gi=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;var gr=/[stwN]/,gk=/[LRr]/,gj=/[Lb1n]/,gn=/[1n]/;var gq="L";function gp(gu,gt,gs){this.level=gu;this.from=gt;this.to=gs}return function(gC){if(!gi.test(gC)){return false}var gI=gC.length,gy=[];for(var gH=0,gu;gH*\/]/.test(Y)){return U(null,"select-op")}else{if(Y=="."&&aa.match(/^-?[_a-z][_a-z0-9-]*/i)){return U("qualifier","qualifier")}else{if(/[:;{}\[\]\(\)]/.test(Y)){return U(null,Y)}else{if((Y=="u"&&aa.match(/rl(-prefix)?\(/))||(Y=="d"&&aa.match("omain("))||(Y=="r"&&aa.match("egexp("))){aa.backUp(1);Z.tokenize=V;return U("property","word")}else{if(/[\w\\\-]/.test(Y)){aa.eatWhile(/[\w\\\-]/);return U("property","word")}else{return U(null,null)}}}}}}}}}}}}}function H(X){return function(ab,Z){var aa=false,Y;while((Y=ab.next())!=null){if(Y==X&&!aa){if(X==")"){ab.backUp(1)}break}aa=!aa&&Y=="\\"}if(Y==X||!aa&&X!=")"){Z.tokenize=null}return U("string","string")}}function V(Y,X){Y.next();if(!Y.match(/\s*[\"\')]/,false)){X.tokenize=H(")")}else{X.tokenize=null}return U(null,"(")}function N(Y,X,Z){this.type=Y;this.indent=X;this.prev=Z}function D(Y,Z,X){Y.context=new N(X,Z.indentation()+M,Y.context);return X}function P(X){X.context=X.context.prev;return X.context.type}function x(X,Z,Y){return C[Y.context.type](X,Z,Y)}function Q(Y,aa,Z,ab){for(var X=ab||1;X>0;X--){Z.context=Z.context.prev}return x(Y,aa,Z)}function E(Y){var X=Y.current().toLowerCase();if(O.hasOwnProperty(X)){K="atom"}else{if(L.hasOwnProperty(X)){K="keyword"}else{K="variable"}}}var C={};C.top=function(X,Z,Y){if(X=="{"){return D(Y,Z,"block")}else{if(X=="}"&&Y.context.prev){return P(Y)}else{if(/@(media|supports|(-moz-)?document)/.test(X)){return D(Y,Z,"atBlock")}else{if(/@(font-face|counter-style)/.test(X)){Y.stateArg=X;return"restricted_atBlock_before"}else{if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(X)){return"keyframes"}else{if(X&&X.charAt(0)=="@"){return D(Y,Z,"at")}else{if(X=="hash"){K="builtin"}else{if(X=="word"){K="tag"}else{if(X=="variable-definition"){return"maybeprop"}else{if(X=="interpolation"){return D(Y,Z,"interpolation")}else{if(X==":"){return"pseudo"}else{if(J&&X=="("){return D(Y,Z,"parens")}}}}}}}}}}}}return Y.context.type};C.block=function(X,aa,Y){if(X=="word"){var Z=aa.current().toLowerCase();if(F.hasOwnProperty(Z)){K="property";return"maybeprop"}else{if(z.hasOwnProperty(Z)){K="string-2";return"maybeprop"}else{if(J){K=aa.match(/^\s*:(?:\s|$)/,false)?"property":"tag";return"block"}else{K+=" error";return"maybeprop"}}}}else{if(X=="meta"){return"block"}else{if(!J&&(X=="hash"||X=="qualifier")){K="error";return"block"}else{return C.top(X,aa,Y)}}}};C.maybeprop=function(X,Z,Y){if(X==":"){return D(Y,Z,"prop")}return x(X,Z,Y)};C.prop=function(X,Z,Y){if(X==";"){return P(Y)}if(X=="{"&&J){return D(Y,Z,"propBlock")}if(X=="}"||X=="{"){return Q(X,Z,Y)}if(X=="("){return D(Y,Z,"parens")}if(X=="hash"&&!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(Z.current())){K+=" error"}else{if(X=="word"){E(Z)}else{if(X=="interpolation"){return D(Y,Z,"interpolation")}}}return"prop"};C.propBlock=function(Y,X,Z){if(Y=="}"){return P(Z)}if(Y=="word"){K="property";return"maybeprop"}return Z.context.type};C.parens=function(X,Z,Y){if(X=="{"||X=="}"){return Q(X,Z,Y)}if(X==")"){return P(Y)}if(X=="("){return D(Y,Z,"parens")}if(X=="interpolation"){return D(Y,Z,"interpolation")}if(X=="word"){E(Z)}return"parens"};C.pseudo=function(X,Z,Y){if(X=="word"){K="variable-3";return Y.context.type}return x(X,Z,Y)};C.atBlock=function(X,aa,Y){if(X=="("){return D(Y,aa,"atBlock_parens")}if(X=="}"){return Q(X,aa,Y)}if(X=="{"){return P(Y)&&D(Y,aa,J?"block":"top")}if(X=="word"){var Z=aa.current().toLowerCase();if(Z=="only"||Z=="not"||Z=="and"||Z=="or"){K="keyword"}else{if(w.hasOwnProperty(Z)){K="tag"}else{if(S.hasOwnProperty(Z)){K="attribute"}else{if(I.hasOwnProperty(Z)){K="property"}else{if(F.hasOwnProperty(Z)){K="property"}else{if(z.hasOwnProperty(Z)){K="string-2"}else{if(O.hasOwnProperty(Z)){K="atom"}else{if(L.hasOwnProperty(Z)){K="keyword"}else{K="error"}}}}}}}}}return Y.context.type};C.atBlock_parens=function(X,Z,Y){if(X==")"){return P(Y)}if(X=="{"||X=="}"){return Q(X,Z,Y,2)}return C.atBlock(X,Z,Y)};C.restricted_atBlock_before=function(X,Z,Y){if(X=="{"){return D(Y,Z,"restricted_atBlock")}if(X=="word"&&Y.stateArg=="@counter-style"){K="variable";return"restricted_atBlock_before"}return x(X,Z,Y)};C.restricted_atBlock=function(X,Z,Y){if(X=="}"){Y.stateArg=null;return P(Y)}if(X=="word"){if((Y.stateArg=="@font-face"&&!B.hasOwnProperty(Z.current().toLowerCase()))||(Y.stateArg=="@counter-style"&&!R.hasOwnProperty(Z.current().toLowerCase()))){K="error"}else{K="property"}return"maybeprop"}return"restricted_atBlock"};C.keyframes=function(X,Z,Y){if(X=="word"){K="variable";return"keyframes"}if(X=="{"){return D(Y,Z,"top")}return x(X,Z,Y)};C.at=function(X,Z,Y){if(X==";"){return P(Y)}if(X=="{"||X=="}"){return Q(X,Z,Y)}if(X=="word"){K="tag"}else{if(X=="hash"){K="builtin"}}return"at"};C.interpolation=function(X,Z,Y){if(X=="}"){return P(Y)}if(X=="{"||X==";"){return Q(X,Z,Y)}if(X=="word"){K="variable"}else{if(X!="variable"&&X!="("&&X!=")"){K="error"}}return"interpolation"};return{startState:function(X){return{tokenize:null,state:"top",stateArg:null,context:new N("top",X||0,null)}},token:function(Z,Y){if(!Y.tokenize&&Z.eatSpace()){return null}var X=(Y.tokenize||W)(Z,Y);if(X&&typeof X=="object"){A=X[1];X=X[0]}K=X;Y.state=C[Y.state](A,Z,Y);return K},indent:function(ab,Z){var Y=ab.context,aa=Z&&Z.charAt(0);var X=Y.indent;if(Y.type=="prop"&&(aa=="}"||aa==")")){Y=Y.prev}if(Y.prev&&(aa=="}"&&(Y.type=="block"||Y.type=="top"||Y.type=="interpolation"||Y.type=="restricted_atBlock")||aa==")"&&(Y.type=="parens"||Y.type=="atBlock_parens")||aa=="{"&&(Y.type=="at"||Y.type=="atBlock"))){X=Y.indent-M;Y=Y.prev}return X},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});function g(y){var x={};for(var w=0;w]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“â€â€˜â€™]))/i)&&k.string.slice(k.start-2,k.start)!="]("){j.combineTokens=true;return"link"}k.next();return null},blankLine:f};var e={underscoresBreakWords:false,taskLists:true,fencedCodeBlocks:true,strikethrough:true};for(var b in h){e[b]=h[b]}e.name="markdown";return a.overlayMode(a.getMode(d,e),g)},"markdown");a.defineMIME("text/x-gfm","gfm")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("htmlmixed",function(c,d){var b=a.getMode(c,{name:"xml",htmlMode:true,multilineTagIndentFactor:d.multilineTagIndentFactor,multilineTagIndentPastTag:d.multilineTagIndentPastTag});var n=a.getMode(c,"css");var l=[],k=d&&d.scriptTypes;l.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:a.getMode(c,"javascript")});if(k){for(var e=0;e"){var u=t.string.slice(Math.max(0,t.pos-100),t.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);u=u?u[1]:"";if(u&&/[\"\']/.test(u.charAt(0))){u=u.slice(1,u.length-1)}for(var o=0;o"){r.token=g;r.localMode=n;r.localState=n.startState(b.indent(r.htmlState,""))}}return q}function h(r,i,o){var q=r.current();var p=q.search(i);if(p>-1){r.backUp(q.length-p)}else{if(q.match(/<\/?$/)){r.backUp(q.length);if(!r.match(i,false)){r.match(q)}}}return o}function m(o,i){if(o.match(/^<\/\s*script\s*>/i,false)){i.token=f;i.localState=i.localMode=null;return null}return h(o,/<\/\s*script\s*>/,i.localMode.token(o,i.localState))}function g(o,i){if(o.match(/^<\/\s*style\s*>/i,false)){i.token=f;i.localState=i.localMode=null;return null}return h(o,/<\/\s*style\s*>/,n.token(o,i.localState))}return{startState:function(){var i=b.startState();return{token:f,localMode:null,localState:null,htmlState:i}},copyState:function(o){if(o.localState){var i=a.copyState(o.localMode,o.localState)}return{token:o.token,localMode:o.localMode,localState:i,htmlState:a.copyState(b,o.htmlState)}},token:function(o,i){return i.token(o,i)},indent:function(o,i){if(!o.localMode||/^\s*<\//.test(i)){return b.indent(o.htmlState,i)}else{if(o.localMode.indent){return o.localMode.indent(o.localState,i)}else{return a.Pass}}},innerMode:function(i){return{state:i.localState||i.htmlState,mode:i.localMode||b}}}},"xml","javascript","css");a.defineMIME("text/html","htmlmixed")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("javascript",function(Z,aj){var l=Z.indentUnit;var A=aj.statementIndent;var aB=aj.jsonld;var z=aj.json||aB;var g=aj.typescript;var au=aj.wordCharacters||/[\w$\xa1-\uffff]/;var ar=function(){function aR(aT){return{type:aT,style:"keyword"}}var aM=aR("keyword a"),aK=aR("keyword b"),aJ=aR("keyword c");var aL=aR("operator"),aP={type:"atom",style:"atom"};var aN={"if":aR("if"),"while":aM,"with":aM,"else":aK,"do":aK,"try":aK,"finally":aK,"return":aJ,"break":aJ,"continue":aJ,"new":aJ,"delete":aJ,"throw":aJ,"debugger":aJ,"var":aR("var"),"const":aR("var"),let:aR("var"),"function":aR("function"),"catch":aR("catch"),"for":aR("for"),"switch":aR("switch"),"case":aR("case"),"default":aR("default"),"in":aL,"typeof":aL,"instanceof":aL,"true":aP,"false":aP,"null":aP,"undefined":aP,"NaN":aP,"Infinity":aP,"this":aR("this"),module:aR("module"),"class":aR("class"),"super":aR("atom"),yield:aJ,"export":aR("export"),"import":aR("import"),"extends":aJ};if(g){var aS={type:"variable",style:"variable-3"};var aO={"interface":aR("interface"),"extends":aR("extends"),constructor:aR("constructor"),"public":aR("public"),"private":aR("private"),"protected":aR("protected"),"static":aR("static"),string:aS,number:aS,bool:aS,any:aS};for(var aQ in aO){aN[aQ]=aO[aQ]}}return aN}();var P=/[+\-*&%=<>!?|~^]/;var aq=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function F(aM){var aK=false,aJ,aL=false;while((aJ=aM.next())!=null){if(!aK){if(aJ=="/"&&!aL){return}if(aJ=="["){aL=true}else{if(aL&&aJ=="]"){aL=false}}}aK=!aK&&aJ=="\\"}}var S,G;function L(aL,aK,aJ){S=aL;G=aJ;return aK}function U(aN,aL){var aJ=aN.next();if(aJ=='"'||aJ=="'"){aL.tokenize=R(aJ);return aL.tokenize(aN,aL)}else{if(aJ=="."&&aN.match(/^\d+(?:[eE][+\-]?\d+)?/)){return L("number","number")}else{if(aJ=="."&&aN.match("..")){return L("spread","meta")}else{if(/[\[\]{}\(\),;\:\.]/.test(aJ)){return L(aJ)}else{if(aJ=="="&&aN.eat(">")){return L("=>","operator")}else{if(aJ=="0"&&aN.eat(/x/i)){aN.eatWhile(/[\da-f]/i);return L("number","number")}else{if(/\d/.test(aJ)){aN.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);return L("number","number")}else{if(aJ=="/"){if(aN.eat("*")){aL.tokenize=aA;return aA(aN,aL)}else{if(aN.eat("/")){aN.skipToEnd();return L("comment","comment")}else{if(aL.lastType=="operator"||aL.lastType=="keyword c"||aL.lastType=="sof"||/^[\[{}\(,;:]$/.test(aL.lastType)){F(aN);aN.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);return L("regexp","string-2")}else{aN.eatWhile(P);return L("operator","operator",aN.current())}}}}else{if(aJ=="`"){aL.tokenize=aC;return aC(aN,aL)}else{if(aJ=="#"){aN.skipToEnd();return L("error","error")}else{if(P.test(aJ)){aN.eatWhile(P);return L("operator","operator",aN.current())}else{if(au.test(aJ)){aN.eatWhile(au);var aM=aN.current(),aK=ar.propertyIsEnumerable(aM)&&ar[aM];return(aK&&aL.lastType!=".")?L(aK.type,aK.style,aM):L("variable","variable",aM)}}}}}}}}}}}}}function R(aJ){return function(aN,aL){var aM=false,aK;if(aB&&aN.peek()=="@"&&aN.match(aq)){aL.tokenize=U;return L("jsonld-keyword","meta")}while((aK=aN.next())!=null){if(aK==aJ&&!aM){break}aM=!aM&&aK=="\\"}if(!aM){aL.tokenize=U}return L("string","string")}}function aA(aM,aL){var aJ=false,aK;while(aK=aM.next()){if(aK=="/"&&aJ){aL.tokenize=U;break}aJ=(aK=="*")}return L("comment","comment")}function aC(aM,aK){var aL=false,aJ;while((aJ=aM.next())!=null){if(!aL&&(aJ=="`"||aJ=="$"&&aM.eat("{"))){aK.tokenize=U;break}aL=!aL&&aJ=="\\"}return L("quasi","string-2",aM.current())}var m="([{}])";function ax(aP,aM){if(aM.fatArrowAt){aM.fatArrowAt=null}var aL=aP.string.indexOf("=>",aP.start);if(aL<0){return}var aO=0,aK=false;for(var aQ=aL-1;aQ>=0;--aQ){var aJ=aP.string.charAt(aQ);var aN=m.indexOf(aJ);if(aN>=0&&aN<3){if(!aO){++aQ;break}if(--aO==0){break}}else{if(aN>=3&&aN<6){++aO}else{if(au.test(aJ)){aK=true}else{if(/["'\/]/.test(aJ)){return}else{if(aK&&!aO){++aQ;break}}}}}}if(aK&&!aO){aM.fatArrowAt=aQ}}var b={atom:true,number:true,variable:true,string:true,regexp:true,"this":true,"jsonld-keyword":true};function J(aO,aK,aJ,aN,aL,aM){this.indented=aO;this.column=aK;this.type=aJ;this.prev=aL;this.info=aM;if(aN!=null){this.align=aN}}function s(aM,aL){for(var aK=aM.localVars;aK;aK=aK.next){if(aK.name==aL){return true}}for(var aJ=aM.context;aJ;aJ=aJ.prev){for(var aK=aJ.vars;aK;aK=aK.next){if(aK.name==aL){return true}}}}function f(aN,aK,aJ,aM,aO){var aP=aN.cc;D.state=aN;D.stream=aO;D.marked=null,D.cc=aP;D.style=aK;if(!aN.lexical.hasOwnProperty("align")){aN.lexical.align=true}while(true){var aL=aP.length?aP.pop():z?an:aH;if(aL(aJ,aM)){while(aP.length&&aP[aP.length-1].lex){aP.pop()()}if(D.marked){return D.marked}if(aJ=="variable"&&s(aN,aM)){return"variable-2"}return aK}}}var D={state:null,column:null,marked:null,cc:null};function aa(){for(var aJ=arguments.length-1;aJ>=0;aJ--){D.cc.push(arguments[aJ])}}function ae(){aa.apply(null,arguments);return true}function aw(aK){function aJ(aN){for(var aM=aN;aM;aM=aM.next){if(aM.name==aK){return true}}return false}var aL=D.state;if(aL.context){D.marked="def";if(aJ(aL.localVars)){return}aL.localVars={name:aK,next:aL.localVars}}else{if(aJ(aL.globalVars)){return}if(aj.globalVars){aL.globalVars={name:aK,next:aL.globalVars}}}}var q={name:"this",next:{name:"arguments"}};function w(){D.state.context={prev:D.state.context,vars:D.state.localVars};D.state.localVars=q}function x(){D.state.localVars=D.state.context.vars;D.state.context=D.state.context.prev}function aF(aK,aL){var aJ=function(){var aO=D.state,aM=aO.indented;if(aO.lexical.type=="stat"){aM=aO.lexical.indented}else{for(var aN=aO.lexical;aN&&aN.type==")"&&aN.align;aN=aN.prev){aM=aN.indented}}aO.lexical=new J(aM,D.stream.column(),aK,null,aO.lexical,aL)};aJ.lex=true;return aJ}function h(){var aJ=D.state;if(aJ.lexical.prev){if(aJ.lexical.type==")"){aJ.indented=aJ.lexical.indented}aJ.lexical=aJ.lexical.prev}}h.lex=true;function r(aJ){function aK(aL){if(aL==aJ){return ae()}else{if(aJ==";"){return aa()}else{return ae(aK)}}}return aK}function aH(aJ,aK){if(aJ=="var"){return ae(aF("vardef",aK.length),d,r(";"),h)}if(aJ=="keyword a"){return ae(aF("form"),an,aH,h)}if(aJ=="keyword b"){return ae(aF("form"),aH,h)}if(aJ=="{"){return ae(aF("}"),y,h)}if(aJ==";"){return ae()}if(aJ=="if"){if(D.state.lexical.info=="else"&&D.state.cc[D.state.cc.length-1]==h){D.state.cc.pop()()}return ae(aF("form"),an,aH,h,e)}if(aJ=="function"){return ae(M)}if(aJ=="for"){return ae(aF("form"),u,aH,h)}if(aJ=="variable"){return ae(aF("stat"),aI)}if(aJ=="switch"){return ae(aF("form"),an,aF("}","switch"),r("{"),y,h,h)}if(aJ=="case"){return ae(an,r(":"))}if(aJ=="default"){return ae(r(":"))}if(aJ=="catch"){return ae(aF("form"),w,r("("),af,r(")"),aH,h,x)}if(aJ=="module"){return ae(aF("form"),w,H,x,h)}if(aJ=="class"){return ae(aF("form"),V,h)}if(aJ=="export"){return ae(aF("form"),aG,h)}if(aJ=="import"){return ae(aF("form"),ag,h)}return aa(aF("stat"),an,r(";"),h)}function an(aJ){return Y(aJ,false)}function aE(aJ){return Y(aJ,true)}function Y(aK,aM){if(D.state.fatArrowAt==D.stream.start){var aJ=aM?N:W;if(aK=="("){return ae(w,aF(")"),at(i,")"),h,r("=>"),aJ,x)}else{if(aK=="variable"){return aa(w,i,r("=>"),aJ,x)}}}var aL=aM?j:ab;if(b.hasOwnProperty(aK)){return ae(aL)}if(aK=="function"){return ae(M,aL)}if(aK=="keyword c"){return ae(aM?ak:ai)}if(aK=="("){return ae(aF(")"),ai,az,r(")"),h,aL)}if(aK=="operator"||aK=="spread"){return ae(aM?aE:an)}if(aK=="["){return ae(aF("]"),n,h,aL)}if(aK=="{"){return ay(t,"}",null,aL)}if(aK=="quasi"){return aa(Q,aL)}return ae()}function ai(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(an)}function ak(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(aE)}function ab(aJ,aK){if(aJ==","){return ae(an)}return j(aJ,aK,false)}function j(aJ,aL,aN){var aK=aN==false?ab:j;var aM=aN==false?an:aE;if(aJ=="=>"){return ae(w,aN?N:W,x)}if(aJ=="operator"){if(/\+\+|--/.test(aL)){return ae(aK)}if(aL=="?"){return ae(an,r(":"),aM)}return ae(aM)}if(aJ=="quasi"){return aa(Q,aK)}if(aJ==";"){return}if(aJ=="("){return ay(aE,")","call",aK)}if(aJ=="."){return ae(al,aK)}if(aJ=="["){return ae(aF("]"),ai,r("]"),h,aK)}}function Q(aJ,aK){if(aJ!="quasi"){return aa()}if(aK.slice(aK.length-2)!="${"){return ae(Q)}return ae(an,p)}function p(aJ){if(aJ=="}"){D.marked="string-2";D.state.tokenize=aC;return ae(Q)}}function W(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:an)}function N(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:aE)}function aI(aJ){if(aJ==":"){return ae(h,aH)}return aa(ab,r(";"),h)}function al(aJ){if(aJ=="variable"){D.marked="property";return ae()}}function t(aJ,aK){if(aJ=="variable"||D.style=="keyword"){D.marked="property";if(aK=="get"||aK=="set"){return ae(I)}return ae(K)}else{if(aJ=="number"||aJ=="string"){D.marked=aB?"property":(D.style+" property");return ae(K)}else{if(aJ=="jsonld-keyword"){return ae(K)}else{if(aJ=="["){return ae(an,r("]"),K)}}}}}function I(aJ){if(aJ!="variable"){return aa(K)}D.marked="property";return ae(M)}function K(aJ){if(aJ==":"){return ae(aE)}if(aJ=="("){return aa(M)}}function at(aL,aJ){function aK(aN){if(aN==","){var aM=D.state.lexical;if(aM.info=="call"){aM.pos=(aM.pos||0)+1}return ae(aL,aK)}if(aN==aJ){return ae()}return ae(r(aJ))}return function(aM){if(aM==aJ){return ae()}return aa(aL,aK)}}function ay(aM,aJ,aL){for(var aK=3;aK=0;--aL){var aQ=aP.cc[aL];if(aQ==h){aM=aM.prev}else{if(aQ!=e){break}}}}if(aM.type=="stat"&&aO=="}"){aM=aM.prev}if(A&&aM.type==")"&&aM.prev.type=="stat"){aM=aM.prev}var aN=aM.type,aK=aO==aN;if(aN=="vardef"){return aM.indented+(aP.lastType=="operator"||aP.lastType==","?aM.info+1:0)}else{if(aN=="form"&&aO=="{"){return aM.indented}else{if(aN=="form"){return aM.indented+l}else{if(aN=="stat"){return aM.indented+(ao(aP,aJ)?A||l:0)}else{if(aM.info=="switch"&&!aK&&aj.doubleIndentSwitch!=false){return aM.indented+(/^(?:case|default)\b/.test(aJ)?l:2*l)}else{if(aM.align){return aM.column+(aK?0:1)}else{return aM.indented+(aK?0:l)}}}}}}},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:z?null:"/*",blockCommentEnd:z?null:"*/",lineComment:z?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:z?"json":"javascript",jsonldMode:aB,jsonMode:z}});a.registerHelper("wordChars","javascript",/[\w$]/);a.defineMIME("text/javascript","javascript");a.defineMIME("text/ecmascript","javascript");a.defineMIME("application/javascript","javascript");a.defineMIME("application/x-javascript","javascript");a.defineMIME("application/ecmascript","javascript");a.defineMIME("application/json",{name:"javascript",json:true});a.defineMIME("application/x-json",{name:"javascript",json:true});a.defineMIME("application/ld+json",{name:"javascript",jsonld:true});a.defineMIME("text/typescript",{name:"javascript",typescript:true});a.defineMIME("application/typescript",{name:"javascript",typescript:true})});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../xml/xml"),require("../meta"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../xml/xml","../meta"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("markdown",function(y,z){var p=a.modes.hasOwnProperty("xml");var j=a.getMode(y,p?{name:"xml",htmlMode:true}:"text/plain");function F(X){if(a.findModeByName){var Y=a.findModeByName(X);if(Y){X=Y.mime||Y.mimes[0]}}var Z=a.getMode(y,X);return Z.name=="null"?null:Z}if(z.highlightFormatting===undefined){z.highlightFormatting=false}if(z.maxBlockquoteDepth===undefined){z.maxBlockquoteDepth=0}if(z.underscoresBreakWords===undefined){z.underscoresBreakWords=true}if(z.fencedCodeBlocks===undefined){z.fencedCodeBlocks=false}if(z.taskLists===undefined){z.taskLists=false}if(z.strikethrough===undefined){z.strikethrough=false}var k=0;var i="header",g="comment",r="quote",Q="variable-2",N="variable-3",M="keyword",P="hr",h="tag",u="formatting",q="link",m="link",G="link",E="string",R="em",A="strong",n="strikethrough";var b=/^([*\-_])(?:\s*\1){2,}\s*$/,e=/^[*\-+]\s+/,C=/^[0-9]+([.)])\s+/,t=/^\[(x| )\](?=\s)/,T=/^(#+)(?: |$)/,W=/^ *(?:\={1,}|-{1,})\s*$/,B=/^[^#!\[\]*_\\<>` "'(~]+/;function U(Z,Y,X){Y.f=Y.inline=X;return X(Z,Y)}function D(Z,Y,X){Y.f=Y.block=X;return X(Z,Y)}function c(X){X.linkTitle=false;X.em=false;X.strong=false;X.strikethrough=false;X.quote=0;X.indentedCode=false;if(!p&&X.f==s){X.f=S;X.block=J}X.trailingSpace=0;X.trailingSpaceNewLine=false;X.thisLineHasContent=false;return null}function J(ad,ac){var ab=ad.sol();var Z=ac.list!==false,X=ac.indentedCode;ac.indentedCode=false;if(Z){if(ac.indentationDiff>=0){if(ac.indentationDiff<4){ac.indentation-=ac.indentationDiff}ac.list=null}else{if(ac.indentation>0){ac.list=null;ac.listDepth=Math.floor(ac.indentation/4)}else{ac.list=false;ac.listDepth=0}}}var Y=null;if(ac.indentationDiff>=4){ad.skipToEnd();if(X||!ac.prevLineHasContent){ac.indentation-=4;ac.indentedCode=true;return g}else{return null}}else{if(ad.eatSpace()){return null}else{if((Y=ad.match(T))&&Y[1].length<=6){ac.header=Y[1].length;if(z.highlightFormatting){ac.formatting="header"}ac.f=ac.inline;return w(ac)}else{if(ac.prevLineHasContent&&!ac.quote&&!Z&&!X&&(Y=ad.match(W))){ac.header=Y[0].charAt(0)=="="?1:2;if(z.highlightFormatting){ac.formatting="header"}ac.f=ac.inline;return w(ac)}else{if(ad.eat(">")){ac.quote=ab?1:ac.quote+1;if(z.highlightFormatting){ac.formatting="quote"}ad.eatSpace();return w(ac)}else{if(ad.peek()==="["){return U(ad,ac,d)}else{if(ad.match(b,true)){ac.hr=true;return P}else{if((!ac.prevLineHasContent||Z)&&(ad.match(e,false)||ad.match(C,false))){var aa=null;if(ad.match(e,true)){aa="ul"}else{ad.match(C,true);aa="ol"}ac.indentation+=4;ac.list=true;ac.listDepth++;if(z.taskLists&&ad.match(t,false)){ac.taskList=true}ac.f=ac.inline;if(z.highlightFormatting){ac.formatting=["list","list-"+aa]}return w(ac)}else{if(z.fencedCodeBlocks&&ad.match(/^```[ \t]*([\w+#]*)/,true)){ac.localMode=F(RegExp.$1);if(ac.localMode){ac.localState=ac.localMode.startState()}ac.f=ac.block=I;if(z.highlightFormatting){ac.formatting="code-block"}ac.code=true;return w(ac)}}}}}}}}}return U(ad,ac,ac.inline)}function s(Z,Y){var X=j.token(Z,Y.htmlState);if((p&&Y.htmlState.tagStart===null&&(!Y.htmlState.context&&Y.htmlState.tokenize.isInText))||(Y.md_inside&&Z.current().indexOf(">")>-1)){Y.f=S;Y.block=J;Y.htmlState=null}return X}function I(Y,X){if(Y.sol()&&Y.match("```",false)){X.localMode=X.localState=null;X.f=X.block=O;return null}else{if(X.localMode){return X.localMode.token(Y,X.localState)}else{Y.skipToEnd();return g}}}function O(Z,Y){Z.match("```");Y.block=J;Y.f=S;if(z.highlightFormatting){Y.formatting="code-block"}Y.code=true;var X=w(Y);Y.code=false;return X}function w(aa){var Z=[];if(aa.formatting){Z.push(u);if(typeof aa.formatting==="string"){aa.formatting=[aa.formatting]}for(var X=0;X=aa.quote){Z.push(u+"-"+aa.formatting[X]+"-"+aa.quote)}else{Z.push("error")}}}}if(aa.taskOpen){Z.push("meta");return Z.length?Z.join(" "):null}if(aa.taskClosed){Z.push("property");return Z.length?Z.join(" "):null}if(aa.linkHref){Z.push(E,"url")}else{if(aa.strong){Z.push(A)}if(aa.em){Z.push(R)}if(aa.strikethrough){Z.push(n)}if(aa.linkText){Z.push(G)}if(aa.code){Z.push(g)}}if(aa.header){Z.push(i);Z.push(i+"-"+aa.header)}if(aa.quote){Z.push(r);if(!z.maxBlockquoteDepth||z.maxBlockquoteDepth>=aa.quote){Z.push(r+"-"+aa.quote)}else{Z.push(r+"-"+z.maxBlockquoteDepth)}}if(aa.list!==false){var Y=(aa.listDepth-1)%3;if(!Y){Z.push(Q)}else{if(Y===1){Z.push(N)}else{Z.push(M)}}}if(aa.trailingSpaceNewLine){Z.push("trailing-space-new-line")}else{if(aa.trailingSpace){Z.push("trailing-space-"+(aa.trailingSpace%2?"a":"b"))}}return Z.length?Z.join(" "):null}function o(Y,X){if(Y.match(B,true)){return w(X)}return undefined}function S(ac,ab){var am=ab.text(ac,ab);if(typeof am!=="undefined"){return am}if(ab.list){ab.list=null;return w(ab)}if(ab.taskList){var ai=ac.match(t,true)[1]!=="x";if(ai){ab.taskOpen=true}else{ab.taskClosed=true}if(z.highlightFormatting){ab.formatting="task"}ab.taskList=false;return w(ab)}ab.taskOpen=false;ab.taskClosed=false;if(ab.header&&ac.match(/^#+$/,true)){if(z.highlightFormatting){ab.formatting="header"}return w(ab)}var X=ac.sol();var af=ac.next();if(af==="\\"){ac.next();if(z.highlightFormatting){var Z=w(ab);return Z?Z+" formatting-escape":"formatting-escape"}}if(ab.linkTitle){ab.linkTitle=false;var al=af;if(af==="("){al=")"}al=(al+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");var Y="^\\s*(?:[^"+al+"\\\\]+|\\\\\\\\|\\\\.)"+al;if(ac.match(new RegExp(Y),true)){return E}}if(af==="`"){var ak=ab.formatting;if(z.highlightFormatting){ab.formatting="code"}var ag=w(ab);var ah=ac.pos;ac.eatWhile("`");var an=1+ac.pos-ah;if(!ab.code){k=an;ab.code=true;return w(ab)}else{if(an===k){ab.code=false;return ag}ab.formatting=ak;return w(ab)}}else{if(ab.code){return w(ab)}}if(af==="!"&&ac.match(/\[[^\]]*\] ?(?:\(|\[)/,false)){ac.match(/\[[^\]]*\]/);ab.inline=ab.f=x;return h}if(af==="["&&ac.match(/.*\](\(.*\)| ?\[.*\])/,false)){ab.linkText=true;if(z.highlightFormatting){ab.formatting="link"}return w(ab)}if(af==="]"&&ab.linkText&&ac.match(/\(.*\)| ?\[.*\]/,false)){if(z.highlightFormatting){ab.formatting="link"}var Z=w(ab);ab.linkText=false;ab.inline=ab.f=x;return Z}if(af==="<"&&ac.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,false)){ab.f=ab.inline=L;if(z.highlightFormatting){ab.formatting="link"}var Z=w(ab);if(Z){Z+=" "}else{Z=""}return Z+q}if(af==="<"&&ac.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,false)){ab.f=ab.inline=L;if(z.highlightFormatting){ab.formatting="link"}var Z=w(ab);if(Z){Z+=" "}else{Z=""}return Z+m}if(af==="<"&&ac.match(/^(!--|\w)/,false)){var aa=ac.string.indexOf(">",ac.pos);if(aa!=-1){var aj=ac.string.substring(ac.start,aa);if(/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(aj)){ab.md_inside=true}}ac.backUp(1);ab.htmlState=a.startState(j);return D(ac,ab,s)}if(af==="<"&&ac.match(/^\/\w*?>/)){ab.md_inside=false;return"tag"}var ae=false;if(!z.underscoresBreakWords){if(af==="_"&&ac.peek()!=="_"&&ac.match(/(\w)/,false)){var ad=ac.pos-2;if(ad>=0){var ao=ac.string.charAt(ad);if(ao!=="_"&&ao.match(/(\w)/,false)){ae=true}}}}if(af==="*"||(af==="_"&&!ae)){if(X&&ac.peek()===" "){}else{if(ab.strong===af&&ac.eat(af)){if(z.highlightFormatting){ab.formatting="strong"}var ag=w(ab);ab.strong=false;return ag}else{if(!ab.strong&&ac.eat(af)){ab.strong=af;if(z.highlightFormatting){ab.formatting="strong"}return w(ab)}else{if(ab.em===af){if(z.highlightFormatting){ab.formatting="em"}var ag=w(ab);ab.em=false;return ag}else{if(!ab.em){ab.em=af;if(z.highlightFormatting){ab.formatting="em"}return w(ab)}}}}}}else{if(af===" "){if(ac.eat("*")||ac.eat("_")){if(ac.peek()===" "){return w(ab)}else{ac.backUp(1)}}}}if(z.strikethrough){if(af==="~"&&ac.eatWhile(af)){if(ab.strikethrough){if(z.highlightFormatting){ab.formatting="strikethrough"}var ag=w(ab);ab.strikethrough=false;return ag}else{if(ac.match(/^[^\s]/,false)){ab.strikethrough=true;if(z.highlightFormatting){ab.formatting="strikethrough"}return w(ab)}}}else{if(af===" "){if(ac.match(/^~~/,true)){if(ac.peek()===" "){return w(ab)}else{ac.backUp(2)}}}}}if(af===" "){if(ac.match(/ +$/,false)){ab.trailingSpace++}else{if(ab.trailingSpace){ab.trailingSpaceNewLine=true}}}return w(ab)}function L(aa,Z){var Y=aa.next();if(Y===">"){Z.f=Z.inline=S;if(z.highlightFormatting){Z.formatting="link"}var X=w(Z);if(X){X+=" "}else{X=""}return X+q}aa.match(/^[^>]+/,true);return q}function x(Z,Y){if(Z.eatSpace()){return null}var X=Z.next();if(X==="("||X==="["){Y.f=Y.inline=K(X==="("?")":"]");if(z.highlightFormatting){Y.formatting="link-string"}Y.linkHref=true;return w(Y)}return"error"}function K(X){return function(ab,aa){var Z=ab.next();if(Z===X){aa.f=aa.inline=S;if(z.highlightFormatting){aa.formatting="link-string"}var Y=w(aa);aa.linkHref=false;return Y}if(ab.match(v(X),true)){ab.backUp(1)}aa.linkHref=true;return w(aa)}}function d(Y,X){if(Y.match(/^[^\]]*\]:/,false)){X.f=H;Y.next();if(z.highlightFormatting){X.formatting="link"}X.linkText=true;return w(X)}return U(Y,X,S)}function H(Z,Y){if(Z.match(/^\]:/,true)){Y.f=Y.inline=f;if(z.highlightFormatting){Y.formatting="link"}var X=w(Y);Y.linkText=false;return X}Z.match(/^[^\]]+/,true);return G}function f(Y,X){if(Y.eatSpace()){return null}Y.match(/^[^\s]+/,true);if(Y.peek()===undefined){X.linkTitle=true}else{Y.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/,true)}X.f=X.inline=S;return E+" url"}var V=[];function v(X){if(!V[X]){X=(X+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");V[X]=new RegExp("^(?:[^\\\\]|\\\\.)*?("+X+")")}return V[X]}var l={startState:function(){return{f:J,prevLineHasContent:false,thisLineHasContent:false,block:J,htmlState:null,indentation:0,inline:S,text:o,formatting:false,linkText:false,linkHref:false,linkTitle:false,em:false,strong:false,header:0,hr:false,taskList:false,list:false,listDepth:0,quote:0,trailingSpace:0,trailingSpaceNewLine:false,strikethrough:false}},copyState:function(X){return{f:X.f,prevLineHasContent:X.prevLineHasContent,thisLineHasContent:X.thisLineHasContent,block:X.block,htmlState:X.htmlState&&a.copyState(j,X.htmlState),indentation:X.indentation,localMode:X.localMode,localState:X.localMode?a.copyState(X.localMode,X.localState):null,inline:X.inline,text:X.text,formatting:false,linkTitle:X.linkTitle,em:X.em,strong:X.strong,strikethrough:X.strikethrough,header:X.header,hr:X.hr,taskList:X.taskList,list:X.list,listDepth:X.listDepth,quote:X.quote,indentedCode:X.indentedCode,trailingSpace:X.trailingSpace,trailingSpaceNewLine:X.trailingSpaceNewLine,md_inside:X.md_inside}},token:function(ab,aa){aa.formatting=false;if(ab.sol()){var X=!!aa.header||aa.hr;aa.header=0;aa.hr=false;if(ab.match(/^\s*$/,true)||X){aa.prevLineHasContent=false;c(aa);return X?this.token(ab,aa):null}else{aa.prevLineHasContent=aa.thisLineHasContent;aa.thisLineHasContent=true}aa.taskList=false;aa.code=false;aa.trailingSpace=0;aa.trailingSpaceNewLine=false;aa.f=aa.block;var Y=ab.match(/^\s*/,true)[0].replace(/\t/g," ").length;var ac=Math.floor((Y-aa.indentation)/4)*4;if(ac>4){ac=4}var Z=aa.indentation+ac;aa.indentationDiff=Z-aa.indentation;aa.indentation=Z;if(Y>0){return null}}return aa.f(ab,aa)},innerMode:function(X){if(X.block==s){return{state:X.htmlState,mode:j}}if(X.localState){return{state:X.localState,mode:X.localMode}}return{state:X,mode:l}},blankLine:c,getType:w,fold:"markdown"};return l},"xml");a.defineMIME("text/x-markdown","markdown")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../clike/clike"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../htmlmixed/htmlmixed","../clike/clike"],a)}else{a(CodeMirror)}}})(function(d){function f(m){var k={},l=m.split(" ");for(var j=0;j\w/,false)){l.tokenize=e([[["->",null]],[[/[\w]+/,"variable"]]],k,j)}return"variable-2"}var m=false;while(!n.eol()&&(m||j===false||(!n.match("{$",false)&&!n.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/,false)))){if(!m&&n.match(k)){l.tokenize=null;l.tokStack.pop();l.tokStack.pop();break}m=n.next()=="\\"&&!m}return"string"}var h="abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally";var i="true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__";var a="func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";d.registerHelper("hintWords","php",[h,i,a].join(" ").split(" "));d.registerHelper("wordChars","php",/[\w$]/);var g={name:"clike",helperType:"php",keywords:f(h),blockKeywords:f("catch do else elseif for foreach if switch try while finally"),defKeywords:f("class function interface namespace trait"),atoms:f(i),builtin:f(a),multiLineStrings:true,hooks:{"$":function(j){j.eatWhile(/[\w\$_]/);return"variable-2"},"<":function(m,k){if(m.match(/<",false)){j.next()}return"comment"},"/":function(j){if(j.eat("/")){while(!j.eol()&&!j.match("?>",false)){j.next()}return"comment"}return false},'"':function(j,k){(k.tokStack||(k.tokStack=[])).push('"',0);k.tokenize=b('"');return"string"},"{":function(j,k){if(k.tokStack&&k.tokStack.length){k.tokStack[k.tokStack.length-1]++}return false},"}":function(j,k){if(k.tokStack&&k.tokStack.length>0&&!--k.tokStack[k.tokStack.length-1]){k.tokenize=b(k.tokStack[k.tokStack.length-2])}return false}}};d.defineMode("php",function(l,m){var n=d.getMode(l,"text/html");var j=d.getMode(l,g);function k(u,s){var r=s.curMode==j;if(u.sol()&&s.pending&&s.pending!='"'&&s.pending!="'"){s.pending=null}if(!r){if(u.match(/^<\?\w*/)){s.curMode=j;s.curState=s.php;return"meta"}if(s.pending=='"'||s.pending=="'"){while(!u.eol()&&u.next()!=s.pending){}var q="string"}else{if(s.pending&&u.pos/.test(t)){s.pending=o[0]}else{s.pending={end:u.pos,style:q}}u.backUp(t.length-p)}return q}else{if(r&&s.php.tokenize==null&&u.match("?>")){s.curMode=n;s.curState=s.html;return"meta"}else{return j.token(u,s.curState)}}}return{startState:function(){var o=d.startState(n),p=d.startState(j);return{html:o,php:p,curMode:m.startOpen?j:n,curState:m.startOpen?p:o,pending:null}},copyState:function(r){var p=r.html,q=d.copyState(n,p),t=r.php,o=d.copyState(j,t),s;if(r.curMode==n){s=q}else{s=o}return{html:q,php:o,curMode:r.curMode,curState:s,pending:r.pending}},token:k,indent:function(p,o){if((p.curMode!=j&&/^\s*<\//.test(o))||(p.curMode==j&&/^\?>/.test(o))){return n.indent(p.html,o)}return p.curMode.indent(p.curState,o)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(o){return{state:o.curState,mode:o.curMode}}}},"htmlmixed","clike");d.defineMIME("application/x-httpd-php","php");d.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:true});d.defineMIME("text/x-php",g)});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("sass",function(f){function p(q){return new RegExp("^"+q.join("|"))}var k=["true","false","null","auto"];var b=new RegExp("^"+k.join("|"));var i=["\\(","\\)","=",">","<","==",">=","<=","\\+","-","\\!=","/","\\*","%","and","or","not",";","\\{","\\}",":"];var n=p(i);var o=/^::?[a-zA-Z_][\w\-]*/;function m(s,r){var q=s.peek();if(q===")"){s.next();r.tokenizer=g;return"operator"}else{if(q==="("){s.next();s.eatSpace();return"operator"}else{if(q==="'"||q==='"'){r.tokenizer=h(s.next());return"string"}else{r.tokenizer=h(")",false);return"string"}}}}function l(q,r){return function(t,s){if(t.sol()&&t.indentation()<=q){s.tokenizer=g;return g(t,s)}if(r&&t.skipTo("*/")){t.next();t.next();s.tokenizer=g}else{t.skipToEnd()}return"comment"}}function h(q,s){if(s==null){s=true}function r(x,u){var w=x.next();var t=x.peek();var y=x.string.charAt(x.pos-2);var v=((w!=="\\"&&t===q)||(w===q&&y!=="\\"));if(v){if(w!==q&&s){x.next()}u.tokenizer=g;return"string"}else{if(w==="#"&&t==="{"){u.tokenizer=d(r);x.next();return"operator"}else{return"string"}}}return r}function d(q){return function(s,r){if(s.peek()==="}"){s.next();r.tokenizer=q;return"operator"}else{return g(s,r)}}}function e(r){if(r.indentCount==0){r.indentCount++;var s=r.scopes[0].offset;var q=s+f.indentUnit;r.scopes.unshift({offset:q})}}function j(q){if(q.scopes.length==1){return}q.scopes.shift()}function g(s,r){var q=s.peek();if(s.match("/*")){r.tokenizer=l(s.indentation(),true);return r.tokenizer(s,r)}if(s.match("//")){r.tokenizer=l(s.indentation(),false);return r.tokenizer(s,r)}if(s.match("#{")){r.tokenizer=d(g);return"operator"}if(q==='"'||q==="'"){s.next();r.tokenizer=h(q);return"string"}if(!r.cursorHalf){if(q==="."){s.next();if(s.match(/^[\w-]+/)){e(r);return"atom"}else{if(s.peek()==="#"){e(r);return"atom"}}}if(q==="#"){s.next();if(s.match(/^[\w-]+/)){e(r);return"atom"}if(s.peek()==="#"){e(r);return"atom"}}if(q==="$"){s.next();s.eatWhile(/[\w-]/);return"variable-2"}if(s.match(/^-?[0-9\.]+/)){return"number"}if(s.match(/^(px|em|in)\b/)){return"unit"}if(s.match(b)){return"keyword"}if(s.match(/^url/)&&s.peek()==="("){r.tokenizer=m;return"atom"}if(q==="="){if(s.match(/^=[\w-]+/)){e(r);return"meta"}}if(q==="+"){if(s.match(/^\+[\w-]+/)){return"variable-3"}}if(q==="@"){if(s.match(/@extend/)){if(!s.match(/\s*[\w]/)){j(r)}}}if(s.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)){e(r);return"meta"}if(q==="@"){s.next();s.eatWhile(/[\w-]/);return"meta"}if(s.eatWhile(/[\w-]/)){if(s.match(/ *: *[\w-\+\$#!\("']/,false)){return"property"}else{if(s.match(/ *:/,false)){e(r);r.cursorHalf=1;return"atom"}else{if(s.match(/ *,/,false)){return"atom"}else{e(r);return"atom"}}}}if(q===":"){if(s.match(o)){return"keyword"}s.next();r.cursorHalf=1;return"operator"}}else{if(q==="#"){s.next();if(s.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){if(!s.peek()){r.cursorHalf=0}return"number"}}if(s.match(/^-?[0-9\.]+/)){if(!s.peek()){r.cursorHalf=0}return"number"}if(s.match(/^(px|em|in)\b/)){if(!s.peek()){r.cursorHalf=0}return"unit"}if(s.match(b)){if(!s.peek()){r.cursorHalf=0}return"keyword"}if(s.match(/^url/)&&s.peek()==="("){r.tokenizer=m;if(!s.peek()){r.cursorHalf=0}return"atom"}if(q==="$"){s.next();s.eatWhile(/[\w-]/);if(!s.peek()){r.cursorHalf=0}return"variable-3"}if(q==="!"){s.next();if(!s.peek()){r.cursorHalf=0}return s.match(/^[\w]+/)?"keyword":"operator"}if(s.match(n)){if(!s.peek()){r.cursorHalf=0}return"operator"}if(s.eatWhile(/[\w-]/)){if(!s.peek()){r.cursorHalf=0}return"attribute"}if(!s.peek()){r.cursorHalf=0;return null}}if(s.match(n)){return"operator"}s.next();return null}function c(x,r){if(x.sol()){r.indentCount=0}var s=r.tokenizer(x,r);var w=x.current();if(w==="@return"||w==="}"){j(r)}if(s!==null){var t=x.pos-w.length;var v=t+(f.indentUnit*r.indentCount);var q=[];for(var u=0;u!?|~^]/,b=/^[:\[\(\{]/,f=["true","false","null","empty","defined","divisibleby","divisible by","even","odd","iterable","sameas","same as"],e=/^(\d[+\-\*\/])?\d+(\.\d+)?/;d=new RegExp("(("+d.join(")|(")+"))\\b");f=new RegExp("(("+f.join(")|(")+"))\\b");function g(j,i){var h=j.peek();if(i.incomment){if(!j.skipTo("#}")){j.skipToEnd()}else{j.eatWhile(/\#|}/);i.incomment=false}return"comment"}else{if(i.intag){if(i.operator){i.operator=false;if(j.match(f)){return"atom"}if(j.match(e)){return"number"}}if(i.sign){i.sign=false;if(j.match(f)){return"atom"}if(j.match(e)){return"number"}}if(i.instring){if(h==i.instring){i.instring=false}j.next();return"string"}else{if(h=="'"||h=='"'){i.instring=h;j.next();return"string"}else{if(j.match(i.intag+"}")||j.eat("-")&&j.match(i.intag+"}")){i.intag=false;return"tag"}else{if(j.match(c)){i.operator=true;return"operator"}else{if(j.match(b)){i.sign=true}else{if(j.eat(" ")||j.sol()){if(j.match(d)){return"keyword"}if(j.match(f)){return"atom"}if(j.match(e)){return"number"}if(j.sol()){j.next()}}else{j.next()}}}}}}return"variable"}else{if(j.eat("{")){if(h=j.eat("#")){i.incomment=true;if(!j.skipTo("#}")){j.skipToEnd()}else{j.eatWhile(/\#|}/);i.incomment=false}return"comment"}else{if(h=j.eat(/\{|%/)){i.intag=h;if(h=="{"){i.intag="}"}j.eat("-");return"tag"}}}}}j.next()}return{startState:function(){return{}},token:function(i,h){return g(i,h)}}});a.defineMIME("text/x-twig","twig")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("xml",function(y,k){var p=y.indentUnit;var x=k.multilineTagIndentFactor||1;var d=k.multilineTagIndentPastTag;if(d==null){d=true}var w=k.htmlMode?{autoSelfClosers:{area:true,base:true,br:true,col:true,command:true,embed:true,frame:true,hr:true,img:true,input:true,keygen:true,link:true,meta:true,param:true,source:true,track:true,wbr:true,menuitem:true},implicitlyClosed:{dd:true,li:true,optgroup:true,option:true,p:true,rp:true,rt:true,tbody:true,td:true,tfoot:true,th:true,tr:true},contextGrabbers:{dd:{dd:true,dt:true},dt:{dd:true,dt:true},li:{li:true},option:{option:true,optgroup:true},optgroup:{optgroup:true},p:{address:true,article:true,aside:true,blockquote:true,dir:true,div:true,dl:true,fieldset:true,footer:true,form:true,h1:true,h2:true,h3:true,h4:true,h5:true,h6:true,header:true,hgroup:true,hr:true,menu:true,nav:true,ol:true,p:true,pre:true,section:true,table:true,ul:true},rp:{rp:true,rt:true},rt:{rp:true,rt:true},tbody:{tbody:true,tfoot:true},td:{td:true,th:true},tfoot:{tbody:true},th:{td:true,th:true},thead:{tbody:true,tfoot:true},tr:{tr:true}},doNotIndent:{pre:true},allowUnquoted:true,allowMissing:true,caseFold:true}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:false,allowMissing:false,caseFold:false};var c=k.alignCDATA;var f,g;function n(F,E){function C(G){E.tokenize=G;return G(F,E)}var D=F.next();if(D=="<"){if(F.eat("!")){if(F.eat("[")){if(F.match("CDATA[")){return C(v("atom","]]>"))}else{return null}}else{if(F.match("--")){return C(v("comment","-->"))}else{if(F.match("DOCTYPE",true,true)){F.eatWhile(/[\w\._\-]/);return C(z(1))}else{return null}}}}else{if(F.eat("?")){F.eatWhile(/[\w\._\-]/);E.tokenize=v("meta","?>");return"meta"}else{f=F.eat("/")?"closeTag":"openTag";E.tokenize=m;return"tag bracket"}}}else{if(D=="&"){var B;if(F.eat("#")){if(F.eat("x")){B=F.eatWhile(/[a-fA-F\d]/)&&F.eat(";")}else{B=F.eatWhile(/[\d]/)&&F.eat(";")}}else{B=F.eatWhile(/[\w\.\-:]/)&&F.eat(";")}return B?"atom":"error"}else{F.eatWhile(/[^&<]/);return null}}}n.isInText=true;function m(E,D){var C=E.next();if(C==">"||(C=="/"&&E.eat(">"))){D.tokenize=n;f=C==">"?"endTag":"selfcloseTag";return"tag bracket"}else{if(C=="="){f="equals";return null}else{if(C=="<"){D.tokenize=n;D.state=l;D.tagName=D.tagStart=null;var B=D.tokenize(E,D);return B?B+" tag error":"tag error"}else{if(/[\'\"]/.test(C)){D.tokenize=j(C);D.stringStartCol=E.column();return D.tokenize(E,D)}else{E.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);return"word"}}}}}function j(B){var C=function(E,D){while(!E.eol()){if(E.next()==B){D.tokenize=m;break}}return"string"};C.isInAttribute=true;return C}function v(C,B){return function(E,D){while(!E.eol()){if(E.match(B)){D.tokenize=n;break}E.next()}return C}}function z(B){return function(E,D){var C;while((C=E.next())!=null){if(C=="<"){D.tokenize=z(B+1);return D.tokenize(E,D)}else{if(C==">"){if(B==1){D.tokenize=n;break}else{D.tokenize=z(B-1);return D.tokenize(E,D)}}}}return"meta"}}function r(C,B,D){this.prev=C.context;this.tagName=B;this.indent=C.indented;this.startOfLine=D;if(w.doNotIndent.hasOwnProperty(B)||(C.context&&C.context.noIndent)){this.noIndent=true}}function u(B){if(B.context){B.context=B.context.prev}}function q(D,C){var B;while(true){if(!D.context){return}B=D.context.tagName;if(!w.contextGrabbers.hasOwnProperty(B)||!w.contextGrabbers[B].hasOwnProperty(C)){return}u(D)}}function l(B,D,C){if(B=="openTag"){C.tagStart=D.column();return b}else{if(B=="closeTag"){return t}else{return l}}}function b(B,D,C){if(B=="word"){C.tagName=D.current();g="tag";return e}else{g="error";return b}}function t(C,E,D){if(C=="word"){var B=E.current();if(D.context&&D.context.tagName!=B&&w.implicitlyClosed.hasOwnProperty(D.context.tagName)){u(D)}if(D.context&&D.context.tagName==B){g="tag";return s}else{g="tag error";return A}}else{g="error";return A}}function s(C,B,D){if(C!="endTag"){g="error";return s}u(D);return l}function A(B,D,C){g="error";return s(B,D,C)}function e(E,C,F){if(E=="word"){g="attribute";return i}else{if(E=="endTag"||E=="selfcloseTag"){var D=F.tagName,B=F.tagStart;F.tagName=F.tagStart=null;if(E=="selfcloseTag"||w.autoSelfClosers.hasOwnProperty(D)){q(F,D)}else{q(F,D);F.context=new r(F,D,B==F.indented)}return l}}g="error";return e}function i(B,D,C){if(B=="equals"){return o}if(!w.allowMissing){g="error"}return e(B,D,C)}function o(B,D,C){if(B=="string"){return h}if(B=="word"&&w.allowUnquoted){g="string";return e}g="error";return e(B,D,C)}function h(B,D,C){if(B=="string"){return h}return e(B,D,C)}return{startState:function(){return{tokenize:n,state:l,indented:0,tagName:null,tagStart:null,context:null}},token:function(D,C){if(!C.tagName&&D.sol()){C.indented=D.indentation()}if(D.eatSpace()){return null}f=null;var B=C.tokenize(D,C);if((B||f)&&B!="comment"){g=null;C.state=C.state(f||B,D,C);if(g){B=g=="error"?B+" error":g}}return B},indent:function(G,C,F){var E=G.context;if(G.tokenize.isInAttribute){if(G.tagStart==G.indented){return G.stringStartCol+1}else{return G.indented+p}}if(E&&E.noIndent){return a.Pass}if(G.tokenize!=m&&G.tokenize!=n){return F?F.match(/^(\s*)/)[0].length:0}if(G.tagName){if(d){return G.tagStart+G.tagName.length+2}else{return G.tagStart+p*x}}if(c&&/$/,blockCommentStart:"",configuration:k.htmlMode?"html":"xml",helperType:k.htmlMode?"html":"xml"}});a.defineMIME("text/xml","xml");a.defineMIME("application/xml","xml");if(!a.mimeModes.hasOwnProperty("text/html")){a.defineMIME("text/html",{name:"xml",htmlMode:true})}});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("yaml",function(){var b=["true","false","on","off","yes","no"];var c=new RegExp("\\b(("+b.join(")|(")+"))$","i");return{token:function(g,f){var e=g.peek();var d=f.escaped;f.escaped=false;if(e=="#"&&(g.pos==0||/\s/.test(g.string.charAt(g.pos-1)))){g.skipToEnd();return"comment"}if(g.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)){return"string"}if(f.literal&&g.indentation()>f.keyCol){g.skipToEnd();return"string"}else{if(f.literal){f.literal=false}}if(g.sol()){f.keyCol=0;f.pair=false;f.pairStart=false;if(g.match(/---/)){return"def"}if(g.match(/\.\.\./)){return"def"}if(g.match(/\s*-\s+/)){return"meta"}}if(g.match(/^(\{|\}|\[|\])/)){if(e=="{"){f.inlinePairs++}else{if(e=="}"){f.inlinePairs--}else{if(e=="["){f.inlineList++}else{f.inlineList--}}}return"meta"}if(f.inlineList>0&&!d&&e==","){g.next();return"meta"}if(f.inlinePairs>0&&!d&&e==","){f.keyCol=0;f.pair=false;f.pairStart=false;g.next();return"meta"}if(f.pairStart){if(g.match(/^\s*(\||\>)\s*/)){f.literal=true;return"meta"}if(g.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)){return"variable-2"}if(f.inlinePairs==0&&g.match(/^\s*-?[0-9\.\,]+\s?$/)){return"number"}if(f.inlinePairs>0&&g.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)){return"number"}if(g.match(c)){return"keyword"}}if(!f.pair&&g.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)){f.pair=true;f.keyCol=g.indentation();return"atom"}if(f.pair&&g.match(/^:\s*/)){f.pairStart=true;return"meta"}f.pairStart=false;f.escaped=(e=="\\");g.next();return null},startState:function(){return{pair:false,pairStart:false,keyCol:0,inlinePairs:0,inlineList:0,literal:false,escaped:false}}}});a.defineMIME("text/x-yaml","yaml")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(b){var d=/^(\s*)(>[> ]*|[*+-]\s|(\d+)([.)]))(\s*)/,c=/^(\s*)(>[> ]*|[*+-]|(\d+)[.)])(\s*)$/,a=/[*+-]\s/;b.commands.newlineAndIndentContinueMarkdownList=function(q){if(q.getOption("disableInput")){return b.Pass}var g=q.listSelections(),k=[];for(var m=0;m")>=0?n[2]:(parseInt(n[3],10)+1)+n[4];k[m]="\n"+j+e+f}}q.replaceSelections(k)}});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.overlayMode=function(c,b,d){return{startState:function(){return{base:a.startState(c),overlay:a.startState(b),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(e){return{base:a.copyState(c,e.base),overlay:a.copyState(b,e.overlay),basePos:e.basePos,baseCur:null,overlayPos:e.overlayPos,overlayCur:null}},token:function(f,e){if(f!=e.streamSeen||Math.min(e.basePos,e.overlayPos)").addClass("k-animation-container").css({width:o,height:s,marginLeft:r.left*(p?1:-1),paddingLeft:r.left,paddingRight:r.right,paddingBottom:r.bottom})),i&&t.css({width:"100%",height:"100%",boxSizing:"border-box",mozBoxSizing:"border-box",webkitBoxSizing:"border-box"})),f.msie&&kt.floor(f.version)<=7&&(t.css({zoom:1}),t.children(".k-menu").width(t.width())),t.parent()}function l(e){var t=1,n=arguments.length;for(t=1;n>t;t++)u(e,arguments[t]);return e}function u(e,t){var n,i,r,o,a,s=gt.data.ObservableArray,l=gt.data.LazyObservableArray,c=gt.data.DataSource,d=gt.data.HierarchicalDataSource;for(n in t)i=t[n],r=typeof i,o=r===At&&null!==i?i.constructor:null,o&&o!==Array&&o!==s&&o!==l&&o!==c&&o!==d?i instanceof Date?e[n]=new Date(i.getTime()):F(i.clone)?e[n]=i.clone():(a=e[n],e[n]=typeof a===At?a||{}:{},u(e[n],i)):r!==Pt&&(e[n]=i);return e}function c(e,t,i){for(var r in t)if(t.hasOwnProperty(r)&&t[r].test(e))return r;return i!==n?i:e}function d(e){return e.replace(/([a-z][A-Z])/g,function(e){return e.charAt(0)+"-"+e.charAt(1).toLowerCase()})}function f(e){return e.replace(/\-(\w)/g,function(e,t){return t.toUpperCase()})}function p(t,n){var i,r={};return document.defaultView&&document.defaultView.getComputedStyle?(i=document.defaultView.getComputedStyle(t,""),n&&e.each(n,function(e,t){r[t]=i.getPropertyValue(t)})):(i=t.currentStyle,n&&e.each(n,function(e,t){r[t]=i[f(t)]})),gt.size(r)||(r=i),r}function m(e){return"visible"!=p(e,["overflow"]).overflow}function h(e){var t,n=0;for(t in e)e.hasOwnProperty(t)&&"toJSON"!=t&&n++;return n}function g(e,n,i){n||(n="offset");var r=e[n]();return Tt.browser.msie&&(Tt.pointers||Tt.msPointers)&&!i&&(r.top-=t.pageYOffset-document.documentElement.scrollTop,r.left-=t.pageXOffset-document.documentElement.scrollLeft),r}function v(e){var t={};return _t("string"==typeof e?e.split(" "):e,function(e){t[e]=this}),t}function _(e){return new gt.effects.Element(e)}function y(e,t,n,i){return typeof e===zt&&(F(t)&&(i=t,t=400,n=!1),F(n)&&(i=n,n=!1),typeof t===Et&&(n=t,t=400),e={effects:e,duration:t,reverse:n,complete:i}),vt({effects:{},duration:400,reverse:!1,init:bt,teardown:bt,hide:!1},e,{completeCallback:e.complete,complete:bt})}function w(t,n,i,r,o){for(var a,s=0,l=t.length;l>s;s++)a=e(t[s]),a.queue(function(){L.promise(a,y(n,i,r,o))});return t}function b(e,t,n,i){return t&&(t=t.split(" "),_t(t,function(t,n){e.toggleClass(n,i)})),e}function k(e){return(""+e).replace(B,"&").replace($,"<").replace(J,">").replace(j,""").replace(q,"'")}function x(e,t){var i;return 0===t.indexOf("data")&&(t=t.substring(4),t=t.charAt(0).toLowerCase()+t.substring(1)),t=t.replace(it,"-$1"),i=e.getAttribute("data-"+gt.ns+t),null===i?i=n:"null"===i?i=null:"true"===i?i=!0:"false"===i?i=!1:Ct.test(i)?i=parseFloat(i):tt.test(i)&&!nt.test(i)&&(i=Function("return ("+i+")")()),i}function T(t,i){var r,o,a={};for(r in i)o=x(t,r),o!==n&&(et.test(r)&&(o=gt.template(e("#"+o).html())),a[r]=o);return a}function M(t,n){return e.contains(t,n)?-1:1}function D(){var t=e(this);return e.inArray(t.attr("data-"+gt.ns+"role"),["slider","rangeslider"])>-1||t.is(":visible")}function S(e,t){var n=e.nodeName.toLowerCase();return(/input|select|textarea|button|object/.test(n)?!e.disabled:"a"===n?e.href||t:t)&&C(e)}function C(t){return!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")||e.expr.filters.hidden(this)}).length}function O(e,t){return new O.fn.init(e,t)}var z,F,A,H,E,P,N,I,V,W,R,Y,U,L,B,$,j,q,J,G,K,Q,Z,X,et,tt,nt,it,rt,ot,at,st,lt,ut,ct,dt,ft,pt,mt,ht,gt=t.kendo=t.kendo||{cultures:{}},vt=e.extend,_t=e.each,yt=e.isArray,wt=e.proxy,bt=e.noop,kt=Math,xt=t.JSON||{},Tt={},Mt=/%/,Dt=/\{(\d+)(:[^\}]+)?\}/g,St=/(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+)?/i,Ct=/^(\+|-?)\d+(\.?)\d*$/,Ot="function",zt="string",Ft="number",At="object",Ht="null",Et="boolean",Pt="undefined",Nt={},It={},Vt=[].slice,Wt=t.Globalize;gt.version="$KENDO_VERSION",i.extend=function(e){var t,n,i=function(){},r=this,o=e&&e.init?e.init:function(){r.apply(this,arguments)};i.prototype=r.prototype,n=o.fn=o.prototype=new i;for(t in e)n[t]=null!=e[t]&&e[t].constructor===Object?vt(!0,{},i.prototype[t],e[t]):e[t];return n.constructor=o,o.extend=r.extend,o},i.prototype._initOptions=function(e){this.options=l({},this.options,e)},F=gt.isFunction=function(e){return"function"==typeof e},A=function(){this._defaultPrevented=!0},H=function(){return this._defaultPrevented===!0},E=i.extend({init:function(){this._events={}},bind:function(e,t,i){var r,o,a,s,l,u=this,c=typeof e===zt?[e]:e,d=typeof t===Ot;if(t===n){for(r in e)u.bind(r,e[r]);return u}for(r=0,o=c.length;o>r;r++)e=c[r],s=d?t:t[e],s&&(i&&(a=s,s=function(){u.unbind(e,s),a.apply(u,arguments)},s.original=a),l=u._events[e]=u._events[e]||[],l.push(s));return u},one:function(e,t){return this.bind(e,t,!0)},first:function(e,t){var n,i,r,o,a=this,s=typeof e===zt?[e]:e,l=typeof t===Ot;for(n=0,i=s.length;i>n;n++)e=s[n],r=l?t:t[e],r&&(o=a._events[e]=a._events[e]||[],o.unshift(r));return a},trigger:function(e,t){var n,i,r=this,o=r._events[e];if(o){for(t=t||{},t.sender=r,t._defaultPrevented=!1,t.preventDefault=A,t.isDefaultPrevented=H,o=o.slice(),n=0,i=o.length;i>n;n++)o[n].call(r,t);return t._defaultPrevented===!0}return!1},unbind:function(e,t){var i,r=this,o=r._events[e];if(e===n)r._events={};else if(o)if(t)for(i=o.length-1;i>=0;i--)(o[i]===t||o[i].original===t)&&o.splice(i,1);else r._events[e]=[];return r}}),P=/^\w+/,N=/\$\{([^}]*)\}/g,I=/\\\}/g,V=/__CURLY__/g,W=/\\#/g,R=/__SHARP__/g,Y=["","0","00","000","0000"],z={paramName:"data",useWithBlock:!0,render:function(e,t){var n,i,r="";for(n=0,i=t.length;i>n;n++)r+=e(t[n]);return r},compile:function(e,t){var n,i,o,a=vt({},this,t),s=a.paramName,l=s.match(P)[0],u=a.useWithBlock,c="var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;";if(F(e))return e;for(c+=u?"with("+s+"){":"",c+="$kendoOutput=",i=e.replace(I,"__CURLY__").replace(N,"#=$kendoHtmlEncode($1)#").replace(V,"}").replace(W,"__SHARP__").split("#"),o=0;i.length>o;o++)c+=r(i[o],o%2===0);c+=u?";}":";",c+="return $kendoOutput;",c=c.replace(R,"#");try{return n=Function(l,c),n._slotCount=Math.floor(i.length/2),n}catch(d){throw Error(gt.format("Invalid template:'{0}' Generated code:'{1}'",e,c))}}},function(){function e(e){return a.lastIndex=0,a.test(e)?'"'+e.replace(a,function(e){var t=s[e];return typeof t===zt?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function t(o,a){var s,u,c,d,f,p,m=n,h=a[o];if(h&&typeof h===At&&typeof h.toJSON===Ot&&(h=h.toJSON(o)),typeof r===Ot&&(h=r.call(a,o,h)),p=typeof h,p===zt)return e(h);if(p===Ft)return isFinite(h)?h+"":Ht;if(p===Et||p===Ht)return h+"";if(p===At){if(!h)return Ht;if(n+=i,f=[],"[object Array]"===l.apply(h)){for(d=h.length,s=0;d>s;s++)f[s]=t(s,h)||Ht;return c=0===f.length?"[]":n?"[\n"+n+f.join(",\n"+n)+"\n"+m+"]":"["+f.join(",")+"]",n=m,c}if(r&&typeof r===At)for(d=r.length,s=0;d>s;s++)typeof r[s]===zt&&(u=r[s],c=t(u,h),c&&f.push(e(u)+(n?": ":":")+c));else for(u in h)Object.hasOwnProperty.call(h,u)&&(c=t(u,h),c&&f.push(e(u)+(n?": ":":")+c));return c=0===f.length?"{}":n?"{\n"+n+f.join(",\n"+n)+"\n"+m+"}":"{"+f.join(",")+"}",n=m,c}}var n,i,r,a=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,s={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},l={}.toString;typeof Date.prototype.toJSON!==Ot&&(Date.prototype.toJSON=function(){var e=this;return isFinite(e.valueOf())?o(e.getUTCFullYear(),4)+"-"+o(e.getUTCMonth()+1)+"-"+o(e.getUTCDate())+"T"+o(e.getUTCHours())+":"+o(e.getUTCMinutes())+":"+o(e.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()}),typeof xt.stringify!==Ot&&(xt.stringify=function(e,o,a){var s;if(n="",i="",typeof a===Ft)for(s=0;a>s;s+=1)i+=" ";else typeof a===zt&&(i=a);if(r=o,o&&typeof o!==Ot&&(typeof o!==At||typeof o.length!==Ft))throw Error("JSON.stringify");return t("",{"":e})})}(),function(){function t(e){if(e){if(e.numberFormat)return e;if(typeof e===zt){var t=gt.cultures;return t[e]||t[e.split("-")[0]]||null}return null}return null}function i(e){return e&&(e=t(e)),e||gt.cultures.current}function r(e){e.groupSizes=e.groupSize,e.percent.groupSizes=e.percent.groupSize,e.currency.groupSizes=e.currency.groupSize}function a(e,t,r){r=i(r);var a=r.calendars.standard,s=a.days,l=a.months;return t=a.patterns[t]||t,t.replace(c,function(t){var i,r,u;return"d"===t?r=e.getDate():"dd"===t?r=o(e.getDate()):"ddd"===t?r=s.namesAbbr[e.getDay()]:"dddd"===t?r=s.names[e.getDay()]:"M"===t?r=e.getMonth()+1:"MM"===t?r=o(e.getMonth()+1):"MMM"===t?r=l.namesAbbr[e.getMonth()]:"MMMM"===t?r=l.names[e.getMonth()]:"yy"===t?r=o(e.getFullYear()%100):"yyyy"===t?r=o(e.getFullYear(),4):"h"===t?r=e.getHours()%12||12:"hh"===t?r=o(e.getHours()%12||12):"H"===t?r=e.getHours():"HH"===t?r=o(e.getHours()):"m"===t?r=e.getMinutes():"mm"===t?r=o(e.getMinutes()):"s"===t?r=e.getSeconds():"ss"===t?r=o(e.getSeconds()):"f"===t?r=kt.floor(e.getMilliseconds()/100):"ff"===t?(r=e.getMilliseconds(),r>99&&(r=kt.floor(r/10)),r=o(r)):"fff"===t?r=o(e.getMilliseconds(),3):"tt"===t?r=e.getHours()<12?a.AM[0]:a.PM[0]:"zzz"===t?(i=e.getTimezoneOffset(),u=0>i,r=(""+kt.abs(i/60)).split(".")[0],i=kt.abs(i)-60*r,r=(u?"+":"-")+o(r),r+=":"+o(i)):("zz"===t||"z"===t)&&(r=e.getTimezoneOffset()/60,u=0>r,r=(""+kt.abs(r)).split(".")[0],r=(u?"+":"-")+("zz"===t?o(r):r)),r!==n?r:t.slice(1,t.length-1)})}function s(e,t,r){r=i(r);var o,a,s,u,c,w,b,k,x,T,M,D,S,C,O,z,F,A,H,E,P,N,I,V=r.numberFormat,W=V.groupSize[0],R=V[g],Y=V[h],U=V.decimals,L=V.pattern[0],B=[],$=0>e,j=m,q=m,J=-1;if(e===n)return m;if(!isFinite(e))return e;if(!t)return r.name.length?e.toLocaleString():""+e;if(c=d.exec(t)){if(t=c[1].toLowerCase(),a="c"===t,s="p"===t,(a||s)&&(V=a?V.currency:V.percent,W=V.groupSize[0],R=V[g],Y=V[h],U=V.decimals,o=V.symbol,L=V.pattern[$?0:1]),u=c[2],u&&(U=+u),"e"===t)return u?e.toExponential(U):e.toExponential();if(s&&(e*=100),e=l(e,U),$=0>e,e=e.split(h),w=e[0],b=e[1],$&&(w=w.substring(1)),q=w,k=w.length,k>=W)for(q=m,T=0;k>T;T++)T>0&&(k-T)%W===0&&(q+=R),q+=w.charAt(T);if(b&&(q+=Y+b),"n"===t&&!$)return q;for(e=m,T=0,M=L.length;M>T;T++)D=L.charAt(T),e+="n"===D?q:"$"===D||"%"===D?o:D;return e}if($&&(e=-e),(t.indexOf("'")>-1||t.indexOf('"')>-1||t.indexOf("\\")>-1)&&(t=t.replace(f,function(e){var t=e.charAt(0).replace("\\",""),n=e.slice(1).replace(t,"");return B.push(n),y})),t=t.split(";"),$&&t[1])t=t[1],C=!0;else if(0===e){if(t=t[2]||t[0],-1==t.indexOf(v)&&-1==t.indexOf(_))return t}else t=t[0];if(E=t.indexOf("%"),P=t.indexOf("$"),s=-1!=E,a=-1!=P,s&&(e*=100),a&&"\\"===t[P-1]&&(t=t.split("\\").join(""),a=!1),(a||s)&&(V=a?V.currency:V.percent,W=V.groupSize[0],R=V[g],Y=V[h],U=V.decimals,o=V.symbol),S=t.indexOf(g)>-1,S&&(t=t.replace(p,m)),O=t.indexOf(h),M=t.length,-1!=O?(b=(""+e).split("e"),b=b[1]?l(e,Math.abs(b[1])):b[0],b=b.split(h)[1]||m,F=t.lastIndexOf(_)-O,z=t.lastIndexOf(v)-O,A=F>-1,H=z>-1,T=b.length,A||H||(t=t.substring(0,O)+t.substring(O+1),M=t.length,O=-1,T=0),A&&F>z?T=F:z>F&&(H&&T>z?T=z:A&&F>T&&(T=F)),T>-1&&(e=l(e,T))):e=l(e),z=t.indexOf(v),N=F=t.indexOf(_),J=-1==z&&-1!=F?F:-1!=z&&-1==F?z:z>F?F:z,z=t.lastIndexOf(v),F=t.lastIndexOf(_),I=-1==z&&-1!=F?F:-1!=z&&-1==F?z:z>F?z:F,J==M&&(I=J),-1!=J){if(q=(""+e).split(h),w=q[0],b=q[1]||m,k=w.length,x=b.length,$&&-1*e>=0&&($=!1),S)if(k===W&&O-N>k)w=R+w;else if(k>W){for(q=m,T=0;k>T;T++)T>0&&(k-T)%W===0&&(q+=R),q+=w.charAt(T);w=q}for(e=t.substring(0,J),$&&!C&&(e+="-"),T=J;M>T;T++){if(D=t.charAt(T),-1==O){if(k>I-T){e+=w;break}}else if(-1!=F&&T>F&&(j=m),k>=O-T&&O-T>-1&&(e+=w,T=O),O===T){e+=(b?Y:m)+b,T+=I-O+1;continue}D===_?(e+=D,j=D):D===v&&(e+=j)}if(I>=J&&(e+=t.substring(I+1)),a||s){for(q=m,T=0,M=e.length;M>T;T++)D=e.charAt(T),q+="$"===D||"%"===D?o:D;e=q}if(M=B.length)for(T=0;M>T;T++)e=e.replace(y,B[T])}return e}var l,u,c=/dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|"[^"]*"|'[^']*'/g,d=/^(n|c|p|e)(\d*)$/i,f=/(\\.)|(['][^']*[']?)|(["][^"]*["]?)/g,p=/\,/g,m="",h=".",g=",",v="#",_="0",y="??",w="en-US",b={}.toString;gt.cultures["en-US"]={name:w,numberFormat:{pattern:["-n"],decimals:2,",":",",".":".",groupSize:[3],percent:{pattern:["-n %","n %"],decimals:2,",":",",".":".",groupSize:[3],symbol:"%"},currency:{pattern:["($n)","$n"],decimals:2,",":",",".":".",groupSize:[3],symbol:"$"}},calendars:{standard:{days:{names:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],namesAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],namesShort:["Su","Mo","Tu","We","Th","Fr","Sa"]},months:{names:["January","February","March","April","May","June","July","August","September","October","November","December"],namesAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},AM:["AM","am","AM"],PM:["PM","pm","PM"],patterns:{d:"M/d/yyyy",D:"dddd, MMMM dd, yyyy",F:"dddd, MMMM dd, yyyy h:mm:ss tt",g:"M/d/yyyy h:mm tt",G:"M/d/yyyy h:mm:ss tt",m:"MMMM dd",M:"MMMM dd",s:"yyyy'-'MM'-'ddTHH':'mm':'ss",t:"h:mm tt",T:"h:mm:ss tt",u:"yyyy'-'MM'-'dd HH':'mm':'ss'Z'",y:"MMMM, yyyy",Y:"MMMM, yyyy"},"/":"/",":":":",firstDay:0,twoDigitYearMax:2029}}},gt.culture=function(e){var i,o=gt.cultures;return e===n?o.current:(i=t(e)||o[w],i.calendar=i.calendars.standard,o.current=i,Wt&&!Wt.load&&r(i.numberFormat),n)},gt.findCulture=t,gt.getCulture=i,gt.culture(w),l=function(e,t){return t=t||0,e=(""+e).split("e"),e=Math.round(+(e[0]+"e"+(e[1]?+e[1]+t:t))),e=(""+e).split("e"),e=+(e[0]+"e"+(e[1]?+e[1]-t:-t)),e.toFixed(t)},u=function(e,t,i){if(t){if("[object Date]"===b.call(e))return a(e,t,i);if(typeof e===Ft)return s(e,t,i)}return e!==n?e:""},Wt&&!Wt.load&&(u=function(t,n,i){return e.isPlainObject(i)&&(i=i.name),Wt.format(t,n,i)}),gt.format=function(e){var t=arguments;return e.replace(Dt,function(e,n,i){var r=t[parseInt(n,10)+1];return u(r,i?i.substring(1):"")})},gt._extractFormat=function(e){return"{0:"===e.slice(0,3)&&(e=e.slice(3,e.length-1)),e},gt._activeElement=function(){try{return document.activeElement}catch(e){return document.documentElement.activeElement}},gt._round=l,gt.toString=u}(),function(){function t(e,t,n){return!(e>=t&&n>=e)}function i(e){return e.charAt(0)}function r(t){return e.map(t,i)}function o(e,t){t||23!==e.getHours()||e.setHours(e.getHours()+2)}function a(e){for(var t=0,n=e.length,i=[];n>t;t++)i[t]=(e[t]+"").toLowerCase();return i}function s(e){var t,n={};for(t in e)n[t]=a(e[t]);return n}function l(e,i,a){if(!e)return null;var l,u,c,d,m,h,g,_,y,w,b,k,x,T=function(e){for(var t=0;i[N]===e;)t++,N++;return t>0&&(N-=1),t},M=function(t){var n=v[t]||RegExp("^\\d{1,"+t+"}"),i=e.substr(I,t).match(n);return i?(i=i[0],I+=i.length,parseInt(i,10)):null},D=function(t,n){for(var i,r,o,a=0,s=t.length;s>a;a++)if(i=t[a],r=i.length,o=e.substr(I,r),n&&(o=o.toLowerCase()),o==i)return I+=r,a+1;return null},S=function(){var t=!1;return e.charAt(I)===i[N]&&(I++,t=!0),t},C=a.calendars.standard,O=null,z=null,F=null,A=null,H=null,E=null,P=null,N=0,I=0,V=!1,W=new Date,R=C.twoDigitYearMax||2029,Y=W.getFullYear();for(i||(i="d"),d=C.patterns[i],d&&(i=d),i=i.split(""),c=i.length;c>N;N++)if(l=i[N],V)"'"===l?V=!1:S();else if("d"===l){if(u=T("d"),C._lowerDays||(C._lowerDays=s(C.days)),F=3>u?M(2):D(C._lowerDays[3==u?"namesAbbr":"names"],!0),null===F||t(F,1,31))return null}else if("M"===l){if(u=T("M"),C._lowerMonths||(C._lowerMonths=s(C.months)),z=3>u?M(2):D(C._lowerMonths[3==u?"namesAbbr":"names"],!0),null===z||t(z,1,12))return null;z-=1}else if("y"===l){if(u=T("y"),O=M(u),null===O)return null;2==u&&("string"==typeof R&&(R=Y+parseInt(R,10)),O=Y-Y%100+O,O>R&&(O-=100))}else if("h"===l){if(T("h"),A=M(2),12==A&&(A=0),null===A||t(A,0,11))return null}else if("H"===l){if(T("H"),A=M(2),null===A||t(A,0,23))return null}else if("m"===l){if(T("m"),H=M(2),null===H||t(H,0,59))return null}else if("s"===l){if(T("s"),E=M(2),null===E||t(E,0,59))return null}else if("f"===l){if(u=T("f"),x=e.substr(I,u).match(v[3]),P=M(u),null!==P&&(x=x[0].length,3>x&&(P*=Math.pow(10,3-x)),u>3&&(P=parseInt((""+P).substring(0,3),10))),null===P||t(P,0,999))return null}else if("t"===l){if(u=T("t"),_=C.AM,y=C.PM,1===u&&(_=r(_),y=r(y)),m=D(y),!m&&!D(_))return null}else if("z"===l){if(h=!0,u=T("z"),"Z"===e.substr(I,1)){S();continue}if(g=e.substr(I,6).match(u>2?p:f),!g)return null;if(g=g[0].split(":"),w=g[0],b=g[1],!b&&w.length>3&&(I=w.length-2,b=w.substring(I),w=w.substring(0,I)),w=parseInt(w,10),t(w,-12,13))return null;if(u>2&&(b=parseInt(b,10),isNaN(b)||t(b,0,59)))return null}else if("'"===l)V=!0,S();else if(!S())return null;return k=null!==A||null!==H||E||null,null===O&&null===z&&null===F&&k?(O=Y,z=W.getMonth(),F=W.getDate()):(null===O&&(O=Y),null===F&&(F=1)),m&&12>A&&(A+=12),h?(w&&(A+=-w),b&&(H+=-b),e=new Date(Date.UTC(O,z,F,A,H,E,P))):(e=new Date(O,z,F,A,H,E,P),o(e,A)),100>O&&e.setFullYear(O),e.getDate()!==F&&h===n?null:e}function u(e){var t="-"===e.substr(0,1)?-1:1;return e=e.substring(1),e=60*parseInt(e.substr(0,2),10)+parseInt(e.substring(2),10),t*e}var c=/\u00A0/g,d=/[eE][\-+]?[0-9]+/,f=/[+|\-]\d{1,2}/,p=/[+|\-]\d{1,2}:?\d{2}/,m=/^\/Date\((.*?)\)\/$/,h=/[+-]\d*/,g=["G","g","d","F","D","y","m","T","t"],v={2:/^\d{1,2}/,3:/^\d{1,3}/,4:/^\d{4}/},_={}.toString;gt.parseDate=function(e,t,n){var i,r,o,a,s;if("[object Date]"===_.call(e))return e;if(i=0,r=null,e&&0===e.indexOf("/D")&&(r=m.exec(e)))return r=r[1],s=h.exec(r.substring(1)),r=new Date(parseInt(r,10)),s&&(s=u(s[0]),r=gt.timezone.apply(r,0),r=gt.timezone.convert(r,0,-1*s)),r;if(n=gt.getCulture(n),!t){for(t=[],a=n.calendar.patterns,o=g.length;o>i;i++)t[i]=a[g[i]];i=0,t=["yyyy/MM/dd HH:mm:ss","yyyy/MM/dd HH:mm","yyyy/MM/dd","ddd MMM dd yyyy HH:mm:ss","yyyy-MM-ddTHH:mm:ss.fffffffzzz","yyyy-MM-ddTHH:mm:ss.fffzzz","yyyy-MM-ddTHH:mm:sszzz","yyyy-MM-ddTHH:mm:ss.fffffff","yyyy-MM-ddTHH:mm:ss.fff","yyyy-MM-ddTHH:mmzzz","yyyy-MM-ddTHH:mmzz","yyyy-MM-ddTHH:mm:ss","yyyy-MM-ddTHH:mm","yyyy-MM-dd HH:mm:ss","yyyy-MM-dd HH:mm","yyyy-MM-dd","HH:mm:ss","HH:mm"].concat(t)}for(t=yt(t)?t:[t],o=t.length;o>i;i++)if(r=l(e,t[i],n))return r;return r},gt.parseInt=function(e,t){var n=gt.parseFloat(e,t);return n&&(n=0|n),n},gt.parseFloat=function(e,t,n){if(!e&&0!==e)return null;if(typeof e===Ft)return e;e=""+e,t=gt.getCulture(t);var i,r,o=t.numberFormat,a=o.percent,s=o.currency,l=s.symbol,u=a.symbol,f=e.indexOf("-");return d.test(e)?(e=parseFloat(e.replace(o["."],".")),isNaN(e)&&(e=null),e):f>0?null:(f=f>-1,e.indexOf(l)>-1||n&&n.toLowerCase().indexOf("c")>-1?(o=s,i=o.pattern[0].replace("$",l).split("n"),e.indexOf(i[0])>-1&&e.indexOf(i[1])>-1&&(e=e.replace(i[0],"").replace(i[1],""),f=!0)):e.indexOf(u)>-1&&(r=!0,o=a,l=u),e=e.replace("-","").replace(l,"").replace(c," ").split(o[","].replace(c," ")).join("").replace(o["."],"."),e=parseFloat(e),isNaN(e)?e=null:f&&(e*=-1),e&&r&&(e/=100),e)},Wt&&!Wt.load&&(gt.parseDate=function(e,t,n){return"[object Date]"===_.call(e)?e:Wt.parseDate(e,t,n)},gt.parseFloat=function(t,i){return typeof t===Ft?t:t===n||null===t?null:(e.isPlainObject(i)&&(i=i.name),t=Wt.parseFloat(t,i),isNaN(t)?null:t)})}(),function(){var i,r,o,a,s,l,u;Tt._scrollbar=n,Tt.scrollbar=function(e){if(isNaN(Tt._scrollbar)||e){var t,n=document.createElement("div");return n.style.cssText="overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block",n.innerHTML=" ",document.body.appendChild(n),Tt._scrollbar=t=n.offsetWidth-n.scrollWidth,document.body.removeChild(n),t}return Tt._scrollbar},Tt.isRtl=function(t){return e(t).closest(".k-rtl").length>0},i=document.createElement("table");try{i.innerHTML="",Tt.tbodyInnerHtml=!0}catch(d){Tt.tbodyInnerHtml=!1}Tt.touch="ontouchstart"in t,Tt.msPointers=t.MSPointerEvent,Tt.pointers=t.PointerEvent,r=Tt.transitions=!1,o=Tt.transforms=!1,a="HTMLElement"in t?HTMLElement.prototype:[],Tt.hasHW3D="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix||"MozPerspective"in document.documentElement.style||"msPerspective"in document.documentElement.style,_t(["Moz","webkit","O","ms"],function(){var e,t=""+this,a=typeof i.style[t+"Transition"]===zt;return a||typeof i.style[t+"Transform"]===zt?(e=t.toLowerCase(),o={css:"ms"!=e?"-"+e+"-":"",prefix:t,event:"o"===e||"webkit"===e?e:""},a&&(r=o,r.event=r.event?r.event+"TransitionEnd":"transitionend"),!1):n}),i=null,Tt.transforms=o,Tt.transitions=r,Tt.devicePixelRatio=t.devicePixelRatio===n?1:t.devicePixelRatio;try{Tt.screenWidth=t.outerWidth||t.screen?t.screen.availWidth:t.innerWidth,Tt.screenHeight=t.outerHeight||t.screen?t.screen.availHeight:t.innerHeight}catch(d){Tt.screenWidth=t.screen.availWidth,Tt.screenHeight=t.screen.availHeight}Tt.detectOS=function(e){var n,i,r=!1,o=[],a=!/mobile safari/i.test(e),s={wp:/(Windows Phone(?: OS)?)\s(\d+)\.(\d+(\.\d+)?)/,fire:/(Silk)\/(\d+)\.(\d+(\.\d+)?)/,android:/(Android|Android.*(?:Opera|Firefox).*?\/)\s*(\d+)\.(\d+(\.\d+)?)/,iphone:/(iPhone|iPod).*OS\s+(\d+)[\._]([\d\._]+)/,ipad:/(iPad).*OS\s+(\d+)[\._]([\d_]+)/,meego:/(MeeGo).+NokiaBrowser\/(\d+)\.([\d\._]+)/,webos:/(webOS)\/(\d+)\.(\d+(\.\d+)?)/,blackberry:/(BlackBerry|BB10).*?Version\/(\d+)\.(\d+(\.\d+)?)/,playbook:/(PlayBook).*?Tablet\s*OS\s*(\d+)\.(\d+(\.\d+)?)/,windows:/(MSIE)\s+(\d+)\.(\d+(\.\d+)?)/,tizen:/(tizen).*?Version\/(\d+)\.(\d+(\.\d+)?)/i,sailfish:/(sailfish).*rv:(\d+)\.(\d+(\.\d+)?).*firefox/i,ffos:/(Mobile).*rv:(\d+)\.(\d+(\.\d+)?).*Firefox/},l={ios:/^i(phone|pad|pod)$/i,android:/^android|fire$/i,blackberry:/^blackberry|playbook/i,windows:/windows/,wp:/wp/,flat:/sailfish|ffos|tizen/i,meego:/meego/},u={tablet:/playbook|ipad|fire/i},d={omini:/Opera\sMini/i,omobile:/Opera\sMobi/i,firefox:/Firefox|Fennec/i,mobilesafari:/version\/.*safari/i,ie:/MSIE|Windows\sPhone/i,chrome:/chrome|crios/i,webkit:/webkit/i};for(i in s)if(s.hasOwnProperty(i)&&(o=e.match(s[i]))){if("windows"==i&&"plugins"in navigator)return!1;r={},r.device=i,r.tablet=c(i,u,!1),r.browser=c(e,d,"default"),r.name=c(i,l),r[r.name]=!0,r.majorVersion=o[2],r.minorVersion=o[3].replace("_","."),n=r.minorVersion.replace(".","").substr(0,2),r.flatVersion=r.majorVersion+n+Array(3-(3>n.length?n.length:2)).join("0"),r.cordova=typeof t.PhoneGap!==Pt||typeof t.cordova!==Pt,r.appMode=t.navigator.standalone||/file|local|wmapp/.test(t.location.protocol)||r.cordova,r.android&&(1.5>Tt.devicePixelRatio&&400>r.flatVersion||a)&&(Tt.screenWidth>800||Tt.screenHeight>800)&&(r.tablet=i);break}return r},s=Tt.mobileOS=Tt.detectOS(navigator.userAgent),Tt.wpDevicePixelRatio=s.wp?screen.width/320:0,Tt.kineticScrollNeeded=s&&(Tt.touch||Tt.msPointers||Tt.pointers),Tt.hasNativeScrolling=!1,(s.ios||s.android&&s.majorVersion>2||s.wp)&&(Tt.hasNativeScrolling=s),Tt.mouseAndTouchPresent=Tt.touch&&!(Tt.mobileOS.ios||Tt.mobileOS.android),Tt.detectBrowser=function(e){var t,n=!1,i=[],r={webkit:/(chrome)[ \/]([\w.]+)/i,safari:/(webkit)[ \/]([\w.]+)/i,opera:/(opera)(?:.*version|)[ \/]([\w.]+)/i,msie:/(msie\s|trident.*? rv:)([\w.]+)/i,mozilla:/(mozilla)(?:.*? rv:([\w.]+)|)/i};for(t in r)if(r.hasOwnProperty(t)&&(i=e.match(r[t]))){n={},n[t]=!0,n[i[1].toLowerCase().split(" ")[0].split("/")[0]]=!0,n.version=parseInt(document.documentMode||i[2],10);break}return n},Tt.browser=Tt.detectBrowser(navigator.userAgent),Tt.zoomLevel=function(){var e,n,i;try{return e=Tt.browser,n=0,i=document.documentElement,e.msie&&11==e.version&&i.scrollHeight>i.clientHeight&&!Tt.touch&&(n=Tt.scrollbar()),Tt.touch?i.clientWidth/t.innerWidth:e.msie&&e.version>=10?((top||t).document.documentElement.offsetWidth+n)/(top||t).innerWidth:1}catch(r){return 1}},Tt.cssBorderSpacing=n!==document.documentElement.style.borderSpacing&&!(Tt.browser.msie&&8>Tt.browser.version),function(t){var n="",i=e(document.documentElement),r=parseInt(t.version,10);t.msie?n="ie":t.mozilla?n="ff":t.safari?n="safari":t.webkit?n="webkit":t.opera&&(n="opera"),n&&(n="k-"+n+" k-"+n+r),Tt.mobileOS&&(n+=" k-mobile"),i.addClass(n)}(Tt.browser),Tt.eventCapture=document.documentElement.addEventListener,l=document.createElement("input"),Tt.placeholder="placeholder"in l,Tt.propertyChangeEvent="onpropertychange"in l,Tt.input=function(){for(var e,t=["number","date","time","month","week","datetime","datetime-local"],n=t.length,i="test",r={},o=0;n>o;o++)e=t[o],l.setAttribute("type",e),l.value=i,r[e.replace("-","")]="text"!==l.type&&l.value!==i;return r}(),l.style.cssText="float:left;",Tt.cssFloat=!!l.style.cssFloat,l=null,Tt.stableSort=function(){var e,t=513,n=[{index:0,field:"b"}];for(e=1;t>e;e++)n.push({index:e,field:"a"});return n.sort(function(e,t){return e.field>t.field?1:t.field>e.field?-1:0}),1===n[0].index}(),Tt.matchesSelector=a.webkitMatchesSelector||a.mozMatchesSelector||a.msMatchesSelector||a.oMatchesSelector||a.matchesSelector||a.matches||function(t){for(var n=document.querySelectorAll?(this.parentNode||document).querySelectorAll(t)||[]:e(t),i=n.length;i--;)if(n[i]==this)return!0;return!1},Tt.pushState=t.history&&t.history.pushState,u=document.documentMode,Tt.hashChange="onhashchange"in t&&!(Tt.browser.msie&&(!u||8>=u))}(),U={left:{reverse:"right"},right:{reverse:"left"},down:{reverse:"up"},up:{reverse:"down"},top:{reverse:"bottom"},bottom:{reverse:"top"},"in":{reverse:"out"},out:{reverse:"in"}},L={},e.extend(L,{enabled:!0,Element:function(t){this.element=e(t)},promise:function(e,t){e.is(":visible")||e.css({display:e.data("olddisplay")||"block"}).css("display"),t.hide&&e.data("olddisplay",e.css("display")).hide(),t.init&&t.init(),t.completeCallback&&t.completeCallback(e),e.dequeue()},disable:function(){this.enabled=!1,this.promise=this.promiseShim},enable:function(){this.enabled=!0,this.promise=this.animatedPromise}}),L.promiseShim=L.promise,"kendoAnimate"in e.fn||vt(e.fn,{kendoStop:function(e,t){return this.stop(e,t)},kendoAnimate:function(e,t,n,i){return w(this,e,t,n,i)},kendoAddClass:function(e,t){return gt.toggleClass(this,e,t,!0)},kendoRemoveClass:function(e,t){return gt.toggleClass(this,e,t,!1)},kendoToggleClass:function(e,t,n){return gt.toggleClass(this,e,t,n)}}),B=/&/g,$=//g,G=function(e){return e.target},Tt.touch&&(G=function(e){var t="originalEvent"in e?e.originalEvent.changedTouches:"changedTouches"in e?e.changedTouches:null;return t?document.elementFromPoint(t[0].clientX,t[0].clientY):e.target},_t(["swipe","swipeLeft","swipeRight","swipeUp","swipeDown","doubleTap","tap"],function(t,n){e.fn[n]=function(e){return this.bind(n,e)}})),Tt.touch?Tt.mobileOS?(Tt.mousedown="touchstart",Tt.mouseup="touchend",Tt.mousemove="touchmove",Tt.mousecancel="touchcancel",Tt.click="touchend",Tt.resize="orientationchange"):(Tt.mousedown="mousedown touchstart",Tt.mouseup="mouseup touchend",Tt.mousemove="mousemove touchmove",Tt.mousecancel="mouseleave touchcancel",Tt.click="click",Tt.resize="resize"):Tt.pointers?(Tt.mousemove="pointermove",Tt.mousedown="pointerdown",Tt.mouseup="pointerup",Tt.mousecancel="pointercancel",Tt.click="pointerup",Tt.resize="orientationchange resize"):Tt.msPointers?(Tt.mousemove="MSPointerMove",Tt.mousedown="MSPointerDown",Tt.mouseup="MSPointerUp",Tt.mousecancel="MSPointerCancel",Tt.click="MSPointerUp",Tt.resize="orientationchange resize"):(Tt.mousemove="mousemove",Tt.mousedown="mousedown",Tt.mouseup="mouseup",Tt.mousecancel="mouseleave",Tt.click="click",Tt.resize="resize"),K=function(e,t){var n,i,r,o,a=t||"d",s=1;for(i=0,r=e.length;r>i;i++)o=e[i],""!==o&&(n=o.indexOf("["),0!==n&&(-1==n?o="."+o:(s++,o="."+o.substring(0,n)+" || {})"+o.substring(n))),s++,a+=o+(r-1>i?" || {})":")"));return Array(s).join("(")+a},Q=/^([a-z]+:)?\/\//i,vt(gt,{ui:gt.ui||{},fx:gt.fx||_,effects:gt.effects||L,mobile:gt.mobile||{},data:gt.data||{},dataviz:gt.dataviz||{},keys:{INSERT:45,DELETE:46,BACKSPACE:8,TAB:9,ENTER:13,ESC:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,END:35,HOME:36,SPACEBAR:32,PAGEUP:33,PAGEDOWN:34,F2:113,F10:121,F12:123,NUMPAD_PLUS:107,NUMPAD_MINUS:109,NUMPAD_DOT:110},support:gt.support||Tt,animate:gt.animate||w,ns:"",attr:function(e){return"data-"+gt.ns+e},getShadows:a,wrap:s,deepExtend:l,getComputedStyles:p,isScrollable:m,size:h,toCamelCase:f,toHyphens:d,getOffset:gt.getOffset||g,parseEffects:gt.parseEffects||v,toggleClass:gt.toggleClass||b,directions:gt.directions||U,Observable:E,Class:i,Template:z,template:wt(z.compile,z),render:wt(z.render,z),stringify:wt(xt.stringify,xt),eventTarget:G,htmlEncode:k,isLocalUrl:function(e){return e&&!Q.test(e)},expr:function(e,t,n){return e=e||"",typeof t==zt&&(n=t,t=!1),n=n||"d",e&&"["!==e.charAt(0)&&(e="."+e),t?(e=e.replace(/"([^.]*)\.([^"]*)"/g,'"$1_$DOT$_$2"'),e=e.replace(/'([^.]*)\.([^']*)'/g,"'$1_$DOT$_$2'"),e=K(e.split("."),n),e=e.replace(/_\$DOT\$_/g,".")):e=n+e,e},getter:function(e,t){var n=e+t;return Nt[n]=Nt[n]||Function("d","return "+gt.expr(e,t))},setter:function(e){return It[e]=It[e]||Function("d,value",gt.expr(e)+"=value")},accessor:function(e){return{get:gt.getter(e),set:gt.setter(e)}},guid:function(){var e,t,n="";for(e=0;32>e;e++)t=16*kt.random()|0,(8==e||12==e||16==e||20==e)&&(n+="-"),n+=(12==e?4:16==e?3&t|8:t).toString(16);return n},roleSelector:function(e){return e.replace(/(\S+)/g,"["+gt.attr("role")+"=$1],").slice(0,-1)},directiveSelector:function(e){var t,n=e.split(" ");if(n)for(t=0;n.length>t;t++)"view"!=n[t]&&(n[t]=n[t].replace(/(\w*)(view|bar|strip|over)$/,"$1-$2"));return n.join(" ").replace(/(\S+)/g,"kendo-mobile-$1,").slice(0,-1)},triggeredByInput:function(e){return/^(label|input|textarea|select)$/i.test(e.target.tagName)},logToConsole:function(e){var i=t.console;!gt.suppressLog&&n!==i&&i.log&&i.log(e)}}),Z=E.extend({init:function(e,t){var n,i=this;i.element=gt.jQuery(e).handler(i),i.angular("init",t),E.fn.init.call(i),n=t?t.dataSource:null,n&&(t=vt({},t,{dataSource:{}})),t=i.options=vt(!0,{},i.options,t),n&&(t.dataSource=n),i.element.attr(gt.attr("role"))||i.element.attr(gt.attr("role"),(t.name||"").toLowerCase()),i.element.data("kendo"+t.prefix+t.name,i),i.bind(i.events,t)},events:[],options:{prefix:""},_hasBindingTarget:function(){return!!this.element[0].kendoBindingTarget},_tabindex:function(e){e=e||this.wrapper;var t=this.element,n="tabindex",i=e.attr(n)||t.attr(n);t.removeAttr(n),e.attr(n,isNaN(i)?0:i)},setOptions:function(t){this._setEvents(t),e.extend(this.options,t)},_setEvents:function(e){for(var t,n=this,i=0,r=n.events.length;r>i;i++)t=n.events[i],n.options[t]&&e[t]&&n.unbind(t,n.options[t]);n.bind(n.events,e)},resize:function(e){var t=this.getSize(),n=this._size;(e||(t.width>0||t.height>0)&&(!n||t.width!==n.width||t.height!==n.height))&&(this._size=t,this._resize(t,e),this.trigger("resize",t))},getSize:function(){return gt.dimensions(this.element)},size:function(e){return e?(this.setSize(e),n):this.getSize()},setSize:e.noop,_resize:e.noop,destroy:function(){var e=this;e.element.removeData("kendo"+e.options.prefix+e.options.name),e.element.removeData("handler"),e.unbind()},angular:function(){}}),X=Z.extend({dataItems:function(){return this.dataSource.flatView()},_angularItems:function(t){var n=this;n.angular(t,function(){return{elements:n.items(),data:e.map(n.dataItems(),function(e){return{dataItem:e} +})}})}}),gt.dimensions=function(e,t){var n=e[0];return t&&e.css(t),{width:n.offsetWidth,height:n.offsetHeight}},gt.notify=bt,et=/template$/i,tt=/^\s*(?:\{(?:.|\r\n|\n)*\}|\[(?:.|\r\n|\n)*\])\s*$/,nt=/^\{(\d+)(:[^\}]+)?\}|^\[[A-Za-z_]*\]$/,it=/([A-Z])/g,gt.initWidget=function(i,r,o){var a,s,l,u,c,d,f,p,m,h,g,v,_;if(o?o.roles&&(o=o.roles):o=gt.ui.roles,i=i.nodeType?i:i[0],d=i.getAttribute("data-"+gt.ns+"role")){m=-1===d.indexOf("."),l=m?o[d]:gt.getter(d)(t),g=e(i).data(),v=l?"kendo"+l.fn.options.prefix+l.fn.options.name:"",h=m?RegExp("^kendo.*"+d+"$","i"):RegExp("^"+v+"$","i");for(_ in g)if(_.match(h)){if(_!==v)return g[_];a=g[_]}if(l){for(p=x(i,"dataSource"),r=e.extend({},T(i,l.fn.options),r),p&&(r.dataSource=typeof p===zt?gt.getter(p)(t):p),u=0,c=l.fn.events.length;c>u;u++)s=l.fn.events[u],f=x(i,s),f!==n&&(r[s]=gt.getter(f)(t));return a?e.isEmptyObject(r)||a.setOptions(r):a=new l(i,r),a}}},gt.rolesFromNamespaces=function(e){var t,n,i=[];for(e[0]||(e=[gt.ui,gt.dataviz.ui]),t=0,n=e.length;n>t;t++)i[t]=e[t].roles;return vt.apply(null,[{}].concat(i.reverse()))},gt.init=function(t){var n=gt.rolesFromNamespaces(Vt.call(arguments,1));e(t).find("[data-"+gt.ns+"role]").addBack().each(function(){gt.initWidget(this,{},n)})},gt.destroy=function(t){e(t).find("[data-"+gt.ns+"role]").addBack().each(function(){var t,n=e(this).data();for(t in n)0===t.indexOf("kendo")&&typeof n[t].destroy===Ot&&n[t].destroy()})},gt.resize=function(t,n){var i,r=e(t).find("[data-"+gt.ns+"role]").addBack().filter(D);r.length&&(i=e.makeArray(r),i.sort(M),e.each(i,function(){var t=gt.widgetInstance(e(this));t&&t.resize(n)}))},gt.parseOptions=T,vt(gt.ui,{Widget:Z,DataBoundWidget:X,roles:{},progress:function(t,n){var i,r,o,a,s=t.find(".k-loading-mask"),l=gt.support,u=l.browser;n?s.length||(i=l.isRtl(t),r=i?"right":"left",a=t.scrollLeft(),o=u.webkit&&i?t[0].scrollWidth-t.width()-2*a:0,s=e("
Loading...
").width("100%").height("100%").css("top",t.scrollTop()).css(r,Math.abs(a)+o).prependTo(t)):s&&s.remove()},plugin:function(t,i,r){var o,a=t.fn.options.name;i=i||gt.ui,r=r||"",i[a]=t,i.roles[a.toLowerCase()]=t,o="getKendo"+r+a,a="kendo"+r+a,e.fn[a]=function(i){var r,o=this;return typeof i===zt?(r=Vt.call(arguments,1),this.each(function(){var t,s,l=e.data(this,a);if(!l)throw Error(gt.format("Cannot call method '{0}' of {1} before it is initialized",i,a));if(t=l[i],typeof t!==Ot)throw Error(gt.format("Cannot find method '{0}' of {1}",i,a));return s=t.apply(l,r),s!==n?(o=s,!1):n})):this.each(function(){new t(this,i)}),o},e.fn[a].widget=t,e.fn[o]=function(){return this.data(a)}}}),rt={bind:function(){return this},nullObject:!0,options:{}},ot=Z.extend({init:function(e,t){Z.fn.init.call(this,e,t),this.element.autoApplyNS(),this.wrapper=this.element,this.element.addClass("km-widget")},destroy:function(){Z.fn.destroy.call(this),this.element.kendoDestroy()},options:{prefix:"Mobile"},events:[],view:function(){var e=this.element.closest(gt.roleSelector("view splitview modalview drawer"));return gt.widgetInstance(e,gt.mobile.ui)||rt},viewHasNativeScrolling:function(){var e=this.view();return e&&e.options.useNativeScrolling},container:function(){var e=this.element.closest(gt.roleSelector("view layout modalview drawer splitview"));return gt.widgetInstance(e.eq(0),gt.mobile.ui)||rt}}),vt(gt.mobile,{init:function(e){gt.init(e,gt.mobile.ui,gt.ui,gt.dataviz.ui)},appLevelNativeScrolling:function(){return gt.mobile.application&>.mobile.application.options&>.mobile.application.options.useNativeScrolling},roles:{},ui:{Widget:ot,DataBoundWidget:X.extend(ot.prototype),roles:{},plugin:function(e){gt.ui.plugin(e,gt.mobile.ui,"Mobile")}}}),l(gt.dataviz,{init:function(e){gt.init(e,gt.dataviz.ui)},ui:{roles:{},themes:{},views:[],plugin:function(e){gt.ui.plugin(e,gt.dataviz.ui)}},roles:{}}),gt.touchScroller=function(t,n){return e(t).map(function(t,i){return i=e(i),Tt.kineticScrollNeeded&>.mobile.ui.Scroller&&!i.data("kendoMobileScroller")?(i.kendoMobileScroller(n),i.data("kendoMobileScroller")):!1})[0]},gt.preventDefault=function(e){e.preventDefault()},gt.widgetInstance=function(e,n){var i,r,o,a,s=e.data(gt.ns+"role"),l=[];if(s){if("content"===s&&(s="scroller"),n)if(n[0])for(i=0,r=n.length;r>i;i++)l.push(n[i].roles[s]);else l.push(n.roles[s]);else l=[gt.ui.roles[s],gt.dataviz.ui.roles[s],gt.mobile.ui.roles[s]];for(s.indexOf(".")>=0&&(l=[gt.getter(s)(t)]),i=0,r=l.length;r>i;i++)if(o=l[i],o&&(a=e.data("kendo"+o.fn.options.prefix+o.fn.options.name)))return a}},gt.onResize=function(n){var i=n;return Tt.mobileOS.android&&(i=function(){setTimeout(n,600)}),e(t).on(Tt.resize,i),i},gt.unbindResize=function(n){e(t).off(Tt.resize,n)},gt.attrValue=function(e,t){return e.data(gt.ns+t)},gt.days={Sunday:0,Monday:1,Tuesday:2,Wednesday:3,Thursday:4,Friday:5,Saturday:6},e.extend(e.expr[":"],{kendoFocusable:function(t){var n=e.attr(t,"tabindex");return S(t,!isNaN(n)&&n>-1)}}),at=["mousedown","mousemove","mouseenter","mouseleave","mouseover","mouseout","mouseup","click"],st="label, input, [data-rel=external]",lt={setupMouseMute:function(){var t,n=0,i=at.length,r=document.documentElement;if(!lt.mouseTrap&&Tt.eventCapture)for(lt.mouseTrap=!0,lt.bustClick=!1,lt.captureMouse=!1,t=function(t){lt.captureMouse&&("click"===t.type?lt.bustClick&&!e(t.target).is(st)&&(t.preventDefault(),t.stopPropagation()):t.stopPropagation())};i>n;n++)r.addEventListener(at[n],t,!0)},muteMouse:function(e){lt.captureMouse=!0,e.data.bustClick&&(lt.bustClick=!0),clearTimeout(lt.mouseTrapTimeoutID)},unMuteMouse:function(){clearTimeout(lt.mouseTrapTimeoutID),lt.mouseTrapTimeoutID=setTimeout(function(){lt.captureMouse=!1,lt.bustClick=!1},400)}},ut={down:"touchstart mousedown",move:"mousemove touchmove",up:"mouseup touchend touchcancel",cancel:"mouseleave touchcancel"},Tt.touch&&(Tt.mobileOS.ios||Tt.mobileOS.android)?ut={down:"touchstart",move:"touchmove",up:"touchend touchcancel",cancel:"touchcancel"}:Tt.pointers?ut={down:"pointerdown",move:"pointermove",up:"pointerup",cancel:"pointercancel pointerleave"}:Tt.msPointers&&(ut={down:"MSPointerDown",move:"MSPointerMove",up:"MSPointerUp",cancel:"MSPointerCancel MSPointerLeave"}),!Tt.msPointers||"onmspointerenter"in t||e.each({MSPointerEnter:"MSPointerOver",MSPointerLeave:"MSPointerOut"},function(t,n){e.event.special[t]={delegateType:n,bindType:n,handle:function(t){var i,r=this,o=t.relatedTarget,a=t.handleObj;return(!o||o!==r&&!e.contains(r,o))&&(t.type=a.origType,i=a.handler.apply(this,arguments),t.type=n),i}}}),ct=function(e){return ut[e]||e},dt=/([^ ]+)/g,gt.applyEventMap=function(e,t){return e=e.replace(dt,ct),t&&(e=e.replace(dt,"$1."+t)),e},ft=e.fn.on,vt(!0,O,e),O.fn=O.prototype=new e,O.fn.constructor=O,O.fn.init=function(t,n){return n&&n instanceof e&&!(n instanceof O)&&(n=O(n)),e.fn.init.call(this,t,n,pt)},O.fn.init.prototype=O.fn,pt=O(document),vt(O.fn,{handler:function(e){return this.data("handler",e),this},autoApplyNS:function(e){return this.data("kendoNS",e||gt.guid()),this},on:function(){var e,t,n,i,r,o,a=this,s=a.data("kendoNS");return 1===arguments.length?ft.call(a,arguments[0]):(e=a,t=Vt.call(arguments),typeof t[t.length-1]===Pt&&t.pop(),n=t[t.length-1],i=gt.applyEventMap(t[0],s),Tt.mouseAndTouchPresent&&i.search(/mouse|click/)>-1&&this[0]!==document.documentElement&&(lt.setupMouseMute(),r=2===t.length?null:t[1],o=i.indexOf("click")>-1&&i.indexOf("touchend")>-1,ft.call(this,{touchstart:lt.muteMouse,touchend:lt.unMuteMouse},r,{bustClick:o})),typeof n===zt&&(e=a.data("handler"),n=e[n],t[t.length-1]=function(t){n.call(e,t)}),t[0]=i,ft.apply(a,t),a)},kendoDestroy:function(e){return e=e||this.data("kendoNS"),e&&this.off("."+e),this}}),gt.jQuery=O,gt.eventMap=ut,gt.timezone=function(){function e(e,t){var n,i,r,o=t[3],a=t[4],s=t[5],l=t[8];return l||(t[8]=l={}),l[e]?l[e]:(isNaN(a)?0===a.indexOf("last")?(n=new Date(Date.UTC(e,c[o]+1,1,s[0]-24,s[1],s[2],0)),i=d[a.substr(4,3)],r=n.getUTCDay(),n.setUTCDate(n.getUTCDate()+i-r-(i>r?7:0))):a.indexOf(">=")>=0&&(n=new Date(Date.UTC(e,c[o],a.substr(5),s[0],s[1],s[2],0)),i=d[a.substr(0,3)],r=n.getUTCDay(),n.setUTCDate(n.getUTCDate()+i-r+(r>i?7:0))):n=new Date(Date.UTC(e,c[o],a,s[0],s[1],s[2],0)),l[e]=n)}function t(t,n,i){var r,o,a,s;return(n=n[i])?(a=new Date(t).getUTCFullYear(),n=jQuery.grep(n,function(e){var t=e[0],n=e[1];return a>=t&&(n>=a||t==a&&"only"==n||"max"==n)}),n.push(t),n.sort(function(t,n){return"number"!=typeof t&&(t=+e(a,t)),"number"!=typeof n&&(n=+e(a,n)),t-n}),s=n[jQuery.inArray(t,n)-1]||n[n.length-1],isNaN(s)?s:null):(r=i.split(":"),o=0,r.length>1&&(o=60*r[0]+ +r[1]),[-1e6,"max","-","Jan",1,[0,0,0],o,"-"])}function n(e,t,n){var i,r,o,a=t[n];if("string"==typeof a&&(a=t[a]),!a)throw Error('Timezone "'+n+'" is either incorrect, or kendo.timezones.min.js is not included.');for(i=a.length-1;i>=0&&(r=a[i][3],!(r&&e>r));i--);if(o=a[i+1],!o)throw Error('Timezone "'+n+'" not found on '+e+".");return o}function i(e,i,r,o){typeof e!=Ft&&(e=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));var a=n(e,i,o);return{zone:a,rule:t(e,r,a[1])}}function r(e,t){var n,r,o;return"Etc/UTC"==t||"Etc/GMT"==t?0:(n=i(e,this.zones,this.rules,t),r=n.zone,o=n.rule,gt.parseFloat(o?r[0]-o[6]:r[0]))}function o(e,t){var n=i(e,this.zones,this.rules,t),r=n.zone,o=n.rule,a=r[2];return a.indexOf("/")>=0?a.split("/")[o&&+o[6]?1:0]:a.indexOf("%s")>=0?a.replace("%s",o&&"-"!=o[7]?o[7]:""):a}function a(e,t,n){var i,r;return typeof t==zt&&(t=this.offset(e,t)),typeof n==zt&&(n=this.offset(e,n)),i=e.getTimezoneOffset(),e=new Date(e.getTime()+6e4*(t-n)),r=e.getTimezoneOffset(),new Date(e.getTime()+6e4*(r-i))}function s(e,t){return this.convert(e,e.getTimezoneOffset(),t)}function l(e,t){return this.convert(e,t,e.getTimezoneOffset())}function u(e){return this.apply(new Date(e),"Etc/UTC")}var c={Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},d={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};return{zones:{},rules:{},offset:r,convert:a,apply:s,remove:l,abbr:o,toLocalDate:u}}(),gt.date=function(){function e(e,t){return 0===t&&23===e.getHours()?(e.setHours(e.getHours()+2),!0):!1}function t(t,n,i){var r=t.getHours();i=i||1,n=(n-t.getDay()+7*i)%7,t.setDate(t.getDate()+n),e(t,r)}function n(e,n,i){return e=new Date(e),t(e,n,i),e}function i(e){return new Date(e.getFullYear(),e.getMonth(),1)}function r(e){var t=new Date(e.getFullYear(),e.getMonth()+1,0),n=i(e),r=Math.abs(t.getTimezoneOffset()-n.getTimezoneOffset());return r&&t.setHours(n.getHours()+r/60),t}function o(t){return t=new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0),e(t,0),t}function a(e){return Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds())}function s(e){return e.getTime()-o(e)}function l(e,t,n){var i,r=s(t),o=s(n);return e&&r!=o?(t>=n&&(n+=g),i=s(e),r>i&&(i+=g),r>o&&(o+=g),i>=r&&o>=i):!0}function u(e,t,n){var i,r=t.getTime(),o=n.getTime();return r>=o&&(o+=g),i=e.getTime(),i>=r&&o>=i}function c(t,n){var i=t.getHours();return t=new Date(t),d(t,n*g),e(t,i),t}function d(e,t,n){var i,r=e.getTimezoneOffset();e.setTime(e.getTime()+t),n||(i=e.getTimezoneOffset()-r,e.setTime(e.getTime()+i*h))}function f(){return o(new Date)}function p(e){return o(e).getTime()==f().getTime()}function m(e){var t=new Date(1980,1,1,0,0,0);return e&&t.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()),t}var h=6e4,g=864e5;return{adjustDST:e,dayOfWeek:n,setDayOfWeek:t,getDate:o,isInDateRange:u,isInTimeRange:l,isToday:p,nextDay:function(e){return c(e,1)},previousDay:function(e){return c(e,-1)},toUtcTime:a,MS_PER_DAY:g,MS_PER_HOUR:60*h,MS_PER_MINUTE:h,setTime:d,addDays:c,today:f,toInvariantTime:m,firstDayOfMonth:i,lastDayOfMonth:r,getMilliseconds:s}}(),gt.stripWhitespace=function(e){var t,n,i;if(document.createNodeIterator)for(t=document.createNodeIterator(e,NodeFilter.SHOW_TEXT,function(t){return t.parentNode==e?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT},!1);t.nextNode();)t.referenceNode&&!t.referenceNode.textContent.trim()&&t.referenceNode.parentNode.removeChild(t.referenceNode);else for(n=0;e.childNodes.length>n;n++)i=e.childNodes[n],3!=i.nodeType||/\S/.test(i.nodeValue)||(e.removeChild(i),n--),1==i.nodeType&>.stripWhitespace(i)},mt=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},gt.animationFrame=function(e){mt.call(t,e)},ht=[],gt.queueAnimation=function(e){ht[ht.length]=e,1===ht.length&>.runNextAnimation()},gt.runNextAnimation=function(){gt.animationFrame(function(){ht[0]&&(ht.shift()(),ht[0]&>.runNextAnimation())})},gt.parseQueryStringParams=function(e){for(var t=e.split("?")[1]||"",n={},i=t.split(/&|=/),r=i.length,o=0;r>o;o+=2)""!==i[o]&&(n[decodeURIComponent(i[o])]=decodeURIComponent(i[o+1]));return n},gt.elementUnderCursor=function(e){return n!==e.x.client?document.elementFromPoint(e.x.client,e.y.client):n},gt.wheelDeltaY=function(e){var t,i=e.originalEvent,r=i.wheelDeltaY;return i.wheelDelta?(r===n||r)&&(t=i.wheelDelta):i.detail&&i.axis===i.VERTICAL_AXIS&&(t=10*-i.detail),t},gt.throttle=function(e,t){var i,r,o=0;return!t||0>=t?e:(r=function(){function r(){e.apply(a,l),o=+new Date}var a=this,s=+new Date-o,l=arguments;return o?(i&&clearTimeout(i),s>t?r():i=setTimeout(r,t-s),n):r()},r.cancel=function(){clearTimeout(i)},r)},gt.caret=function(t,i,r){var o,a,s,l,u=i!==n;if(r===n&&(r=i),t[0]&&(t=t[0]),!u||!t.disabled){try{t.selectionStart!==n?u?(t.focus(),t.setSelectionRange(i,r)):i=[t.selectionStart,t.selectionEnd]:document.selection&&(e(t).is(":visible")&&t.focus(),o=t.createTextRange(),u?(o.collapse(!0),o.moveStart("character",i),o.moveEnd("character",r-i),o.select()):(a=o.duplicate(),o.moveToBookmark(document.selection.createRange().getBookmark()),a.setEndPoint("EndToStart",o),s=a.text.length,l=s+o.text.length,i=[s,l]))}catch(c){i=[]}return i}},gt.compileMobileDirective=function(e,n){var i=t.angular;return e.attr("data-"+gt.ns+"role",e[0].tagName.toLowerCase().replace("kendo-mobile-","").replace("-","")),i.element(e).injector().invoke(["$compile",function(t){t(e)(n),/^\$(digest|apply)$/.test(n.$$phase)||n.$digest()}]),gt.widgetInstance(e,gt.mobile.ui)},gt.antiForgeryTokens=function(){var t={},i=e("meta[name=csrf-token],meta[name=_csrf]").attr("content"),r=e("meta[name=csrf-param],meta[name=_csrf_header]").attr("content");return e("input[name^='__RequestVerificationToken']").each(function(){t[this.name]=this.value}),r!==n&&i!==n&&(t[r]=i),t},function(){function n(t,n,i,r){var o,a,s=e("
").attr({action:i,method:"POST",target:r}),l=gt.antiForgeryTokens();l.fileName=n,o=t.split(";base64,"),l.contentType=o[0].replace("data:",""),l.base64=o[1];for(a in l)l.hasOwnProperty(a)&&e("").attr({value:l[a],name:a,type:"hidden"}).appendTo(s);s.appendTo("body").submit().remove()}function i(e,t){var n,i,r,o,a,s=e;if("string"==typeof e){for(n=e.split(";base64,"),i=n[0],r=atob(n[1]),o=new Uint8Array(r.length),a=0;r.length>a;a++)o[a]=r.charCodeAt(a);s=new Blob([o.buffer],{type:i})}navigator.msSaveBlob(s,t)}function r(e,n){t.Blob&&e instanceof Blob&&(e=URL.createObjectURL(e)),o.download=n,o.href=e;var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,t,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}var o=document.createElement("a"),a="download"in o;gt.saveAs=function(e){var t=n;e.forceProxy||(a?t=r:navigator.msSaveBlob&&(t=i)),t(e.dataURI,e.fileName,e.proxyURL,e.proxyTarget)}}()}(jQuery,window),function(e,t){function n(e,t,n,i){var r,o=e.getFullYear(),a=t.getFullYear(),s=n.getFullYear();return o-=o%i,r=o+(i-1),a>o&&(o=a),r>s&&(r=s),o+"-"+r}function i(e){for(var t,n=0,i=e.min,r=e.max,o=e.start,a=e.setter,l=e.build,u=e.cells||12,c=e.perRow||4,d=e.content||F,f=e.empty||A,p=e.html||'';u>n;n++)n>0&&n%c===0&&(p+=''),t=l(o,n),p+=s(o,i,r)?d(t):f(t),a(o,1);return p+"
"}function r(e,t,n){var i=e.getFullYear(),r=t.getFullYear(),o=r,a=0;return n&&(r-=r%n,o=r-r%n+n-1),i>o?a=1:r>i&&(a=-1),a}function o(){var e=new mt;return new mt(e.getFullYear(),e.getMonth(),e.getDate())}function a(e,t,n){var i=o();return e&&(i=new mt(+e)),t>i?i=new mt(+t):i>n&&(i=new mt(+n)),i}function s(e,t,n){return+e>=+t&&+n>=+e}function l(e,t){return e.slice(t).concat(e.slice(0,t))}function u(e,t,n){t=t instanceof mt?t.getFullYear():e.getFullYear()+n*t,e.setFullYear(t)}function c(t){e(this).toggleClass(q,it.indexOf(t.type)>-1||t.type==tt)}function d(e){e.preventDefault()}function f(e){return C(e).calendars.standard}function p(e){var n=ht[e.start],i=ht[e.depth],r=C(e.culture);e.format=D(e.format||r.calendars.standard.patterns.d),isNaN(n)&&(n=0,e.start=U),(i===t||i>n)&&(e.depth=U),e.dates||(e.dates=[])}function m(e){E&&e.find("*").attr("unselectable","on")}function h(e,t){for(var n=0,i=t.length;i>n;n++)if(e===+t[n])return!0;return!1}function g(e,t){return e?e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate():!1}function v(e,t){return e?e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth():!1}var _,y=window.kendo,w=y.support,b=y.ui,k=b.Widget,x=y.keys,T=y.parseDate,M=y.date.adjustDST,D=y._extractFormat,S=y.template,C=y.getCulture,O=y.support.transitions,z=O?O.css+"transform-origin":"",F=S('#=data.value#',{useWithBlock:!1}),A=S(' ',{useWithBlock:!1}),H=y.support.browser,E=H.msie&&9>H.version,P=".kendoCalendar",N="click"+P,I="keydown"+P,V="id",W="min",R="left",Y="slideIn",U="month",L="century",B="change",$="navigate",j="value",q="k-state-hover",J="k-state-disabled",G="k-state-focused",K="k-other-month",Q=' class="'+K+'"',Z="k-nav-today",X="td:has(.k-link)",et="blur"+P,tt="focus",nt=tt+P,it=w.touch?"touchstart":"mouseenter",rt=w.touch?"touchstart"+P:"mouseenter"+P,ot=w.touch?"touchend"+P+" touchmove"+P:"mouseleave"+P,at=6e4,st=864e5,lt="_prevArrow",ut="_nextArrow",ct="aria-disabled",dt="aria-selected",ft=e.proxy,pt=e.extend,mt=Date,ht={month:0,year:1,decade:2,century:3},gt=k.extend({init:function(t,n){var i,r,o=this;k.fn.init.call(o,t,n),t=o.wrapper=o.element,n=o.options,n.url=window.unescape(n.url),o._templates(),o._header(),o._footer(o.footer),r=t.addClass("k-widget k-calendar").on(rt+" "+ot,X,c).on(I,"table.k-content",ft(o._move,o)).on(N,X,function(t){var n=t.currentTarget.firstChild;-1!=n.href.indexOf("#")&&t.preventDefault(),o._click(e(n))}).on("mouseup"+P,"table.k-content, .k-footer",function(){o._focusView(o.options.focusOnNav!==!1)}).attr(V),r&&(o._cellID=r+"_cell_selected"),p(n),i=T(n.value,n.format,n.culture),o._index=ht[n.start],o._current=new mt(+a(i,n.min,n.max)),o._addClassProxy=function(){o._active=!0,o._cell.addClass(G)},o._removeClassProxy=function(){o._active=!1,o._cell.removeClass(G)},o.value(i),y.notify(o)},options:{name:"Calendar",value:null,min:new mt(1900,0,1),max:new mt(2099,11,31),dates:[],url:"",culture:"",footer:"",format:"",month:{},start:U,depth:U,animation:{horizontal:{effects:Y,reverse:!0,duration:500,divisor:2},vertical:{effects:"zoomIn",duration:400}}},events:[B,$],setOptions:function(e){var t=this;p(e),e.dates[0]||(e.dates=t.options.dates),k.fn.setOptions.call(t,e),t._templates(),t._footer(t.footer),t._index=ht[t.options.start],t.navigate()},destroy:function(){var e=this,t=e._today;e.element.off(P),e._title.off(P),e[lt].off(P),e[ut].off(P),y.destroy(e._table),t&&y.destroy(t.off(P)),k.fn.destroy.call(e)},current:function(){return this._current},view:function(){return this._view},focus:function(e){e=e||this._table,this._bindTable(e),e.focus()},min:function(e){return this._option(W,e)},max:function(e){return this._option("max",e)},navigateToPast:function(){this._navigate(lt,-1)},navigateToFuture:function(){this._navigate(ut,1)},navigateUp:function(){var e=this,t=e._index;e._title.hasClass(J)||e.navigate(e._current,++t)},navigateDown:function(e){var n=this,i=n._index,r=n.options.depth;if(e)return i===ht[r]?(+n._value!=+e&&(n.value(e),n.trigger(B)),t):(n.navigate(e,--i),t)},navigate:function(n,i){i=isNaN(i)?ht[i]:i;var r,o,s,l,u=this,c=u.options,d=c.culture,f=c.min,p=c.max,h=u._title,g=u._table,v=u._oldTable,y=u._value,w=u._current,b=n&&+n>+w,k=i!==t&&i!==u._index;n||(n=w),u._current=n=new mt(+a(n,f,p)),i===t?i=u._index:u._index=i,u._view=o=_.views[i],s=o.compare,l=i===ht[L],h.toggleClass(J,l).attr(ct,l),l=s(n,f)<1,u[lt].toggleClass(J,l).attr(ct,l),l=s(n,p)>-1,u[ut].toggleClass(J,l).attr(ct,l),g&&v&&v.data("animating")&&(v.kendoStop(!0,!0),g.kendoStop(!0,!0)),u._oldTable=g,(!g||u._changeView)&&(h.html(o.title(n,f,p,d)),u._table=r=e(o.content(pt({min:f,max:p,date:n,url:c.url,dates:c.dates,format:c.format,culture:d},u[o.name]))),m(r),u._animate({from:g,to:r,vertical:k,future:b}),u._focus(n),u.trigger($)),i===ht[c.depth]&&y&&u._class("k-state-selected",o.toDateString(y)),u._class(G,o.toDateString(n)),!g&&u._cell&&u._cell.removeClass(G),u._changeView=!0},value:function(e){var n=this,i=n._view,r=n.options,o=n._view,a=r.min,l=r.max;return e===t?n._value:(e=T(e,r.format,r.culture),null!==e&&(e=new mt(+e),s(e,a,l)||(e=null)),n._value=e,o&&null===e&&n._cell?n._cell.removeClass("k-state-selected"):(n._changeView=!e||i&&0!==i.compare(e,n._current),n.navigate(e)),t)},_move:function(t){var n,i,r,o,s=this,l=s.options,u=t.keyCode,c=s._view,d=s._index,f=new mt(+s._current),p=y.support.isRtl(s.wrapper);return t.target===s._table[0]&&(s._active=!0),t.ctrlKey?u==x.RIGHT&&!p||u==x.LEFT&&p?(s.navigateToFuture(),i=!0):u==x.LEFT&&!p||u==x.RIGHT&&p?(s.navigateToPast(),i=!0):u==x.UP?(s.navigateUp(),i=!0):u==x.DOWN&&(s._click(e(s._cell[0].firstChild)),i=!0):(u==x.RIGHT&&!p||u==x.LEFT&&p?(n=1,i=!0):u==x.LEFT&&!p||u==x.RIGHT&&p?(n=-1,i=!0):u==x.UP?(n=0===d?-7:-4,i=!0):u==x.DOWN?(n=0===d?7:4,i=!0):u==x.ENTER?(s._click(e(s._cell[0].firstChild)),i=!0):u==x.HOME||u==x.END?(r=u==x.HOME?"first":"last",o=c[r](f),f=new mt(o.getFullYear(),o.getMonth(),o.getDate(),f.getHours(),f.getMinutes(),f.getSeconds(),f.getMilliseconds()),i=!0):u==x.PAGEUP?(i=!0,s.navigateToPast()):u==x.PAGEDOWN&&(i=!0,s.navigateToFuture()),(n||r)&&(r||c.setDate(f,n),s._focus(a(f,l.min,l.max)))),i&&t.preventDefault(),s._current},_animate:function(e){var t=this,n=e.from,i=e.to,r=t._active;n?n.parent().data("animating")?(n.off(P),n.parent().kendoStop(!0,!0).remove(),n.remove(),i.insertAfter(t.element[0].firstChild),t._focusView(r)):n.is(":visible")&&t.options.animation!==!1?t[e.vertical?"_vertical":"_horizontal"](n,i,e.future):(i.insertAfter(n),n.off(P).remove(),t._focusView(r)):(i.insertAfter(t.element[0].firstChild),t._bindTable(i))},_horizontal:function(e,t,n){var i=this,r=i._active,o=i.options.animation.horizontal,a=o.effects,s=e.outerWidth();a&&-1!=a.indexOf(Y)&&(e.add(t).css({width:s}),e.wrap("
"),i._focusView(r,e),e.parent().css({position:"relative",width:2*s,"float":R,"margin-left":n?0:-s}),t[n?"insertAfter":"insertBefore"](e),pt(o,{effects:Y+":"+(n?"right":R),complete:function(){e.off(P).remove(),i._oldTable=null,t.unwrap(),i._focusView(r)}}),e.parent().kendoStop(!0,!0).kendoAnimate(o))},_vertical:function(e,t){var n,i,r=this,o=r.options.animation.vertical,a=o.effects,s=r._active;a&&-1!=a.indexOf("zoom")&&(t.css({position:"absolute",top:e.prev().outerHeight(),left:0}).insertBefore(e),z&&(n=r._cellByDate(r._view.toDateString(r._current)),i=n.position(),i=i.left+parseInt(n.width()/2,10)+"px "+(i.top+parseInt(n.height()/2,10)+"px"),t.css(z,i)),e.kendoStop(!0,!0).kendoAnimate({effects:"fadeOut",duration:600,complete:function(){e.off(P).remove(),r._oldTable=null,t.css({position:"static",top:0,left:0}),r._focusView(s)}}),t.kendoStop(!0,!0).kendoAnimate(o))},_cellByDate:function(t){return this._table.find("td:not(."+K+")").filter(function(){return e(this.firstChild).attr(y.attr(j))===t})},_class:function(t,n){var i=this,r=i._cellID,o=i._cell;o&&o.removeAttr(dt).removeAttr("aria-label").removeAttr(V),o=i._table.find("td:not(."+K+")").removeClass(t).filter(function(){return e(this.firstChild).attr(y.attr(j))===n}).attr(dt,!0),t!==G||i._active||i.options.focusOnNav===!1||(t=""),o.addClass(t),o[0]&&(i._cell=o),r&&(o.attr(V,r),i._table.removeAttr("aria-activedescendant").attr("aria-activedescendant",r))},_bindTable:function(e){e.on(nt,this._addClassProxy).on(et,this._removeClassProxy)},_click:function(e){var t=this,n=t.options,i=new Date(+t._current),r=e.attr(y.attr(j)).split("/");r=new mt(r[0],r[1],r[2]),M(r,0),t._view.setDate(i,r),t.navigateDown(a(i,n.min,n.max))},_focus:function(e){var t=this,n=t._view;0!==n.compare(e,t._current)?t.navigate(e):(t._current=e,t._class(G,n.toDateString(e)))},_focusView:function(e,t){e&&this.focus(t)},_footer:function(n){var i=this,r=o(),a=i.element,s=a.find(".k-footer");return n?(s[0]||(s=e('').appendTo(a)),i._today=s.show().find(".k-link").html(n(r)).attr("title",y.toString(r,"D",i.options.culture)),i._toggle(),t):(i._toggle(!1),s.hide(),t)},_header:function(){var e,t=this,n=t.element;n.find(".k-header")[0]||n.html('
'),e=n.find(".k-link").on(rt+" "+ot+" "+nt+" "+et,c).click(!1),t._title=e.eq(1).on(N,function(){t._active=t.options.focusOnNav!==!1,t.navigateUp()}),t[lt]=e.eq(0).on(N,function(){t._active=t.options.focusOnNav!==!1,t.navigateToPast()}),t[ut]=e.eq(2).on(N,function(){t._active=t.options.focusOnNav!==!1,t.navigateToFuture()})},_navigate:function(e,t){var n=this,i=n._index+1,r=new mt(+n._current);e=n[e],e.hasClass(J)||(i>3?r.setFullYear(r.getFullYear()+100*t):_.views[i].setDate(r,t),n.navigate(r))},_option:function(e,n){var i,r=this,o=r.options,a=r._value||r._current;return n===t?o[e]:(n=T(n,o.format,o.culture),n&&(o[e]=new mt(+n),i=e===W?n>a:a>n,(i||v(a,n))&&(i&&(r._value=null),r._changeView=!0),r._changeView||(r._changeView=!(!o.month.content&&!o.month.empty)),r.navigate(r._value),r._toggle()),t)},_toggle:function(e){var n=this,i=n.options,r=n._today;e===t&&(e=s(o(),i.min,i.max)),r&&(r.off(N),e?r.addClass(Z).removeClass(J).on(N,ft(n._todayClick,n)):r.removeClass(Z).addClass(J).on(N,d))},_todayClick:function(e){var t=this,n=ht[t.options.depth],i=o();e.preventDefault(),0===t._view.compare(t._current,i)&&t._index==n&&(t._changeView=!1),t._value=i,t.navigate(i,n),t.trigger(B)},_templates:function(){var e=this,t=e.options,n=t.footer,i=t.month,r=i.content,o=i.empty;e.month={content:S(''+(r||"#=data.value#")+"",{useWithBlock:!!r}),empty:S(''+(o||" ")+"",{useWithBlock:!!o})},e.footer=n!==!1?S(n||'#= kendo.toString(data,"D","'+t.culture+'") #',{useWithBlock:!1}):null}});b.plugin(gt),_={firstDayOfMonth:function(e){return new mt(e.getFullYear(),e.getMonth(),1)},firstVisibleDay:function(e,t){t=t||y.culture().calendar;for(var n=t.firstDay,i=new mt(e.getFullYear(),e.getMonth(),0,e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds());i.getDay()!=n;)_.setTime(i,-1*st);return i},setTime:function(e,t){var n=e.getTimezoneOffset(),i=new mt(e.getTime()+t),r=i.getTimezoneOffset()-n;e.setTime(i.getTime()+r*at)},views:[{name:U,title:function(e,t,n,i){return f(i).months.names[e.getMonth()]+" "+e.getFullYear()},content:function(e){for(var t=this,n=0,r=e.min,o=e.max,a=e.date,s=e.dates,u=e.format,c=e.culture,d=e.url,p=d&&s[0],m=f(c),g=m.firstDay,v=m.days,w=l(v.names,g),b=l(v.namesShort,g),k=_.firstVisibleDay(a,m),x=t.first(a),T=t.last(a),D=t.toDateString,S=new mt,C='';7>n;n++)C+='";return S=new mt(S.getFullYear(),S.getMonth(),S.getDate()),M(S,0),S=+S,i({cells:42,perRow:7,html:C+='',start:new mt(k.getFullYear(),k.getMonth(),k.getDate()),min:new mt(r.getFullYear(),r.getMonth(),r.getDate()),max:new mt(o.getFullYear(),o.getMonth(),o.getDate()),content:e.content,empty:e.empty,setter:t.setDate,build:function(e){var t=[],n=e.getDay(),i="",r="#";return(x>e||e>T)&&t.push(K),+e===S&&t.push("k-today"),(0===n||6===n)&&t.push("k-weekend"),p&&h(+e,s)&&(r=d.replace("{0}",y.toString(e,u,c)),i=" k-action-link"),{date:e,dates:s,ns:y.ns,title:y.toString(e,"D",c),value:e.getDate(),dateString:D(e),cssClass:t[0]?' class="'+t.join(" ")+'"':"",linkClass:i,url:r}}})},first:function(e){return _.firstDayOfMonth(e)},last:function(e){var t=new mt(e.getFullYear(),e.getMonth()+1,0),n=_.firstDayOfMonth(e),i=Math.abs(t.getTimezoneOffset()-n.getTimezoneOffset());return i&&t.setHours(n.getHours()+i/60),t},compare:function(e,t){var n,i=e.getMonth(),r=e.getFullYear(),o=t.getMonth(),a=t.getFullYear();return n=r>a?1:a>r?-1:i==o?0:i>o?1:-1},setDate:function(e,t){var n=e.getHours();t instanceof mt?e.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()):_.setTime(e,t*st),M(e,n)},toDateString:function(e){return e.getFullYear()+"/"+e.getMonth()+"/"+e.getDate()}},{name:"year",title:function(e){return e.getFullYear()},content:function(e){var t=f(e.culture).months.namesAbbr,n=this.toDateString,r=e.min,o=e.max;return i({min:new mt(r.getFullYear(),r.getMonth(),1),max:new mt(o.getFullYear(),o.getMonth(),1),start:new mt(e.date.getFullYear(),0,1),setter:this.setDate,build:function(e){return{value:t[e.getMonth()],ns:y.ns,dateString:n(e),cssClass:""}}})},first:function(e){return new mt(e.getFullYear(),0,e.getDate())},last:function(e){return new mt(e.getFullYear(),11,e.getDate())},compare:function(e,t){return r(e,t)},setDate:function(e,t){var n,i=e.getHours();t instanceof mt?(n=t.getMonth(),e.setFullYear(t.getFullYear(),n,e.getDate()),n!==e.getMonth()&&e.setDate(0)):(n=e.getMonth()+t,e.setMonth(n),n>11&&(n-=12),n>0&&e.getMonth()!=n&&e.setDate(0)),M(e,i)},toDateString:function(e){return e.getFullYear()+"/"+e.getMonth()+"/1"}},{name:"decade",title:function(e,t,i){return n(e,t,i,10)},content:function(e){var t=e.date.getFullYear(),n=this.toDateString;return i({start:new mt(t-t%10-1,0,1),min:new mt(e.min.getFullYear(),0,1),max:new mt(e.max.getFullYear(),0,1),setter:this.setDate,build:function(e,t){return{value:e.getFullYear(),ns:y.ns,dateString:n(e),cssClass:0===t||11==t?Q:""}}})},first:function(e){var t=e.getFullYear();return new mt(t-t%10,e.getMonth(),e.getDate())},last:function(e){var t=e.getFullYear();return new mt(t-t%10+9,e.getMonth(),e.getDate())},compare:function(e,t){return r(e,t,10)},setDate:function(e,t){u(e,t,1)},toDateString:function(e){return e.getFullYear()+"/0/1"}},{name:L,title:function(e,t,i){return n(e,t,i,100)},content:function(e){var t=e.date.getFullYear(),n=e.min.getFullYear(),r=e.max.getFullYear(),o=this.toDateString,a=n,s=r;return a-=a%10,s-=s%10,10>s-a&&(s=a+9),i({start:new mt(t-t%100-10,0,1),min:new mt(a,0,1),max:new mt(s,0,1),setter:this.setDate,build:function(e,t){var i=e.getFullYear(),a=i+9;return n>i&&(i=n),a>r&&(a=r),{ns:y.ns,value:i+" - "+a,dateString:o(e),cssClass:0===t||11==t?Q:""}}})},first:function(e){var t=e.getFullYear();return new mt(t-t%100,e.getMonth(),e.getDate())},last:function(e){var t=e.getFullYear();return new mt(t-t%100+99,e.getMonth(),e.getDate())},compare:function(e,t){return r(e,t,100)},setDate:function(e,t){u(e,t,10)},toDateString:function(e){var t=e.getFullYear();return t-t%10+"/0/1"}}]},_.isEqualDatePart=g,_.makeUnselectable=m,_.restrictValue=a,_.isInRange=s,_.normalize=p,_.viewsEnum=ht,y.calendar=_}(window.kendo.jQuery),function(e){function t(t,n){return t===n||e.contains(t,n) +}var n=window.kendo,i=n.ui,r=i.Widget,o=n.support,a=n.getOffset,s="open",l="close",u="deactivate",c="activate",d="center",f="left",p="right",m="top",h="bottom",g="absolute",v="hidden",_="body",y="location",w="position",b="visible",k="effects",x="k-state-active",T="k-state-border",M=/k-state-border-(\w+)/,D=".k-picker-wrap, .k-dropdown-wrap, .k-link",S="down",C=e(document.documentElement),O=e(window),z="scroll",F="resize scroll",A=o.transitions.css,H=A+"transform",E=e.extend,P=".kendoPopup",N=["font-size","font-family","font-stretch","font-style","font-weight","line-height"],I=r.extend({init:function(t,i){var o,a=this;i=i||{},i.isRtl&&(i.origin=i.origin||h+" "+p,i.position=i.position||m+" "+p),r.fn.init.call(a,t,i),t=a.element,i=a.options,a.collisions=i.collision?i.collision.split(" "):[],a.downEvent=n.applyEventMap(S,n.guid()),1===a.collisions.length&&a.collisions.push(a.collisions[0]),o=e(a.options.anchor).closest(".k-popup,.k-group").filter(":not([class^=km-])"),i.appendTo=e(e(i.appendTo)[0]||o[0]||_),a.element.hide().addClass("k-popup k-group k-reset").toggleClass("k-rtl",!!i.isRtl).css({position:g}).appendTo(i.appendTo).on("mouseenter"+P,function(){a._hovered=!0}).on("mouseleave"+P,function(){a._hovered=!1}),a.wrapper=e(),i.animation===!1&&(i.animation={open:{effects:{}},close:{hide:!0,effects:{}}}),E(i.animation.open,{complete:function(){a.wrapper.css({overflow:b}),a._activated=!0,a._trigger(c)}}),E(i.animation.close,{complete:function(){a._animationClose()}}),a._mousedownProxy=function(e){a._mousedown(e)},a._resizeProxy=function(e){a._resize(e)},i.toggleTarget&&e(i.toggleTarget).on(i.toggleEvent+P,e.proxy(a.toggle,a))},events:[s,c,l,u],options:{name:"Popup",toggleEvent:"click",origin:h+" "+f,position:m+" "+f,anchor:_,appendTo:null,collision:"flip fit",viewport:window,copyAnchorStyles:!0,autosize:!1,modal:!1,adjustSize:{width:0,height:0},animation:{open:{effects:"slideIn:down",transition:!0,duration:200},close:{duration:100,hide:!0}}},_animationClose:function(){var t,i,r,o,a=this,s=a.options;a.wrapper.hide(),t=a.wrapper.data(y),i=e(s.anchor),t&&a.wrapper.css(t),s.anchor!=_&&(r=((i.attr("class")||"").match(M)||["","down"])[1],o=T+"-"+r,i.removeClass(o).children(D).removeClass(x).removeClass(o),a.element.removeClass(T+"-"+n.directions[r].reverse)),a._closing=!1,a._trigger(u)},destroy:function(){var t,i=this,o=i.options,a=i.element.off(P);r.fn.destroy.call(i),o.toggleTarget&&e(o.toggleTarget).off(P),o.modal||(C.unbind(i.downEvent,i._mousedownProxy),i._scrollableParents().unbind(z,i._resizeProxy),O.unbind(F,i._resizeProxy)),n.destroy(i.element.children()),a.removeData(),o.appendTo[0]===document.body&&(t=a.parent(".k-animation-container"),t[0]?t.remove():a.remove())},open:function(t,i){var r,a,l,u=this,c={isFixed:!isNaN(parseInt(i,10)),x:t,y:i},d=u.element,f=u.options,p="down",h=e(f.anchor),y=d[0]&&d.hasClass("km-widget");if(!u.visible()){if(f.copyAnchorStyles&&(y&&"font-size"==N[0]&&N.shift(),d.css(n.getComputedStyles(h[0],N))),d.data("animating")||u._trigger(s))return;u._activated=!1,f.modal||(C.unbind(u.downEvent,u._mousedownProxy).bind(u.downEvent,u._mousedownProxy),o.mobileOS.ios||o.mobileOS.android||(u._scrollableParents().unbind(z,u._resizeProxy).bind(z,u._resizeProxy),O.unbind(F,u._resizeProxy).bind(F,u._resizeProxy))),u.wrapper=a=n.wrap(d,f.autosize).css({overflow:v,display:"block",position:g}),o.mobileOS.android&&a.css(H,"translatez(0)"),a.css(w),e(f.appendTo)[0]==document.body&&a.css(m,"-10000px"),r=E(!0,{},f.animation.open),u.flipped=u._position(c),r.effects=n.parseEffects(r.effects,u.flipped),p=r.effects.slideIn?r.effects.slideIn.direction:p,f.anchor!=_&&(l=T+"-"+p,d.addClass(T+"-"+n.directions[p].reverse),h.addClass(l).children(D).addClass(x).addClass(l)),d.data(k,r.effects).kendoStop(!0).kendoAnimate(r)}},position:function(){this.visible()&&this._position()},toggle:function(){var e=this;e[e.visible()?l:s]()},visible:function(){return this.element.is(":"+b)},close:function(t){var i,r,o,a,s=this,u=s.options;if(s.visible()){if(i=s.wrapper[0]?s.wrapper:n.wrap(s.element).hide(),s._closing||s._trigger(l))return;s.element.find(".k-popup").each(function(){var n=e(this),i=n.data("kendoPopup");i&&i.close(t)}),C.unbind(s.downEvent,s._mousedownProxy),s._scrollableParents().unbind(z,s._resizeProxy),O.unbind(F,s._resizeProxy),t?r={hide:!0,effects:{}}:(r=E(!0,{},u.animation.close),o=s.element.data(k),a=r.effects,!a&&!n.size(a)&&o&&n.size(o)&&(r.effects=o,r.reverse=!0),s._closing=!0),s.element.kendoStop(!0),i.css({overflow:v}),s.element.kendoAnimate(r)}},_trigger:function(e){return this.trigger(e,{type:e})},_resize:function(e){var t=this;"resize"===e.type?(clearTimeout(t._resizeTimeout),t._resizeTimeout=setTimeout(function(){t._position(),t._resizeTimeout=null},50)):(!t._hovered||t._activated&&t.element.hasClass("k-list-container"))&&t.close()},_mousedown:function(i){var r=this,o=r.element[0],a=r.options,s=e(a.anchor)[0],l=a.toggleTarget,u=n.eventTarget(i),c=e(u).closest(".k-popup"),d=c.parent().parent(".km-shim").length;c=c[0],(d||!c||c===r.element[0])&&"popover"!==e(i.target).closest("a").data("rel")&&(t(o,u)||t(s,u)||l&&t(e(l)[0],u)||r.close())},_fit:function(e,t,n){var i=0;return e+t>n&&(i=n-(e+t)),0>e&&(i=-e),i},_flip:function(e,t,n,i,r,o,a){var s=0;return a=a||t,o!==r&&o!==d&&r!==d&&(e+a>i&&(s+=-(n+t)),0>e+s&&(s+=n+t)),s},_scrollableParents:function(){return e(this.options.anchor).parentsUntil("body").filter(function(e,t){return n.isScrollable(t)})},_position:function(t){var i,r,s,l,u,c,d,f,p,m,h,v=this,_=v.element,b=v.wrapper,k=v.options,x=e(k.viewport),T=x.offset(),M=e(k.anchor),D=k.origin.toLowerCase().split(" "),S=k.position.toLowerCase().split(" "),C=v.collisions,O=o.zoomLevel(),z=10002,F=!!(x[0]==window&&window.innerWidth&&1.02>=O),A=0,H=document.documentElement,P=F?window.innerWidth:x.width(),N=F?window.innerHeight:x.height();if(F&&H.scrollHeight-H.clientHeight>0&&(P-=n.support.scrollbar()),i=M.parents().filter(b.siblings()),i[0])if(s=Math.max(+i.css("zIndex"),0))z=s+10;else for(r=M.parentsUntil(i),l=r.length;l>A;A++)s=+e(r[A]).css("zIndex"),s&&s>z&&(z=s+10);return b.css("zIndex",z),b.css(t&&t.isFixed?{left:t.x,top:t.y}:v._align(D,S)),u=a(b,w,M[0]===b.offsetParent()[0]),c=a(b),d=M.offsetParent().parent(".k-animation-container,.k-popup,.k-group"),d.length&&(u=a(b,w,!0),c=a(b)),x[0]===window?(c.top-=window.pageYOffset||document.documentElement.scrollTop||0,c.left-=window.pageXOffset||document.documentElement.scrollLeft||0):(c.top-=T.top,c.left-=T.left),v.wrapper.data(y)||b.data(y,E({},u)),f=E({},c),p=E({},u),m=k.adjustSize,"fit"===C[0]&&(p.top+=v._fit(f.top,b.outerHeight()+m.height,N/O)),"fit"===C[1]&&(p.left+=v._fit(f.left,b.outerWidth()+m.width,P/O)),h=E({},p),"flip"===C[0]&&(p.top+=v._flip(f.top,_.outerHeight(),M.outerHeight(),N/O,D[0],S[0],b.outerHeight())),"flip"===C[1]&&(p.left+=v._flip(f.left,_.outerWidth(),M.outerWidth(),P/O,D[1],S[1],b.outerWidth())),_.css(w,g),b.css(p),p.left!=h.left||p.top!=h.top},_align:function(t,n){var i,r=this,o=r.wrapper,s=e(r.options.anchor),l=t[0],u=t[1],c=n[0],f=n[1],m=a(s),g=e(r.options.appendTo),v=o.outerWidth(),_=o.outerHeight(),y=s.outerWidth(),w=s.outerHeight(),b=m.top,k=m.left,x=Math.round;return g[0]!=document.body&&(i=a(g),b-=i.top,k-=i.left),l===h&&(b+=w),l===d&&(b+=x(w/2)),c===h&&(b-=_),c===d&&(b-=x(_/2)),u===p&&(k+=y),u===d&&(k+=x(y/2)),f===p&&(k-=v),f===d&&(k-=x(v/2)),{top:b,left:k}}});i.plugin(I)}(window.kendo.jQuery),function(e,t){function n(t){var n=t.parseFormats,i=t.format;N.normalize(t),n=e.isArray(n)?n:[n],n.length||n.push("yyyy-MM-dd"),-1===e.inArray(i,n)&&n.splice(0,0,t.format),t.parseFormats=n}function i(e){e.preventDefault()}var r,o=window.kendo,a=o.ui,s=a.Widget,l=o.parseDate,u=o.keys,c=o.template,d=o._activeElement,f="
",p="",m=".kendoDatePicker",h="click"+m,g="open",v="close",_="change",y="disabled",w="readonly",b="k-state-default",k="k-state-focused",x="k-state-selected",T="k-state-disabled",M="k-state-hover",D="mouseenter"+m+" mouseleave"+m,S="mousedown"+m,C="id",O="min",z="max",F="month",A="aria-disabled",H="aria-expanded",E="aria-hidden",P="aria-readonly",N=o.calendar,I=N.isInRange,V=N.restrictValue,W=N.isEqualDatePart,R=e.extend,Y=e.proxy,U=Date,L=function(t){var n,i=this,r=document.body,s=e(f).attr(E,"true").addClass("k-calendar-container").appendTo(r);i.options=t=t||{},n=t.id,n&&(n+="_dateview",s.attr(C,n),i._dateViewID=n),i.popup=new a.Popup(s,R(t.popup,t,{name:"Popup",isRtl:o.support.isRtl(t.anchor)})),i.div=s,i.value(t.value)};L.prototype={_calendar:function(){var t,n=this,r=n.calendar,s=n.options;r||(t=e(f).attr(C,o.guid()).appendTo(n.popup.element).on(S,i).on(h,"td:has(.k-link)",Y(n._click,n)),n.calendar=r=new a.Calendar(t),n._setOptions(s),o.calendar.makeUnselectable(r.element),r.navigate(n._value||n._current,s.start),n.value(n._value))},_setOptions:function(e){this.calendar.setOptions({focusOnNav:!1,change:e.change,culture:e.culture,dates:e.dates,depth:e.depth,footer:e.footer,format:e.format,max:e.max,min:e.min,month:e.month,start:e.start})},setOptions:function(e){var t=this.options;this.options=R(t,e,{change:t.change,close:t.close,open:t.open}),this.calendar&&this._setOptions(this.options)},destroy:function(){this.popup.destroy()},open:function(){var e=this;e._calendar(),e.popup.open()},close:function(){this.popup.close()},min:function(e){this._option(O,e)},max:function(e){this._option(z,e)},toggle:function(){var e=this;e[e.popup.visible()?v:g]()},move:function(e){var n=this,i=e.keyCode,r=n.calendar,o=e.ctrlKey&&i==u.DOWN||i==u.ENTER;if(e.altKey)i==u.DOWN?(n.open(),e.preventDefault()):i==u.UP&&(n.close(),e.preventDefault());else if(n.popup.visible()){if(i==u.ESC||o&&r._cell.hasClass(x))return n.close(),e.preventDefault(),t;n._current=r._move(e)}},current:function(e){this._current=e,this.calendar._focus(e)},value:function(e){var t=this,n=t.calendar,i=t.options;t._value=e,t._current=new U(+V(e,i.min,i.max)),n&&n.value(e)},_click:function(e){-1!==e.currentTarget.className.indexOf(x)&&this.close()},_option:function(e,t){var n=this,i=n.calendar;n.options[e]=t,i&&i[e](t)}},L.normalize=n,o.DateView=L,r=s.extend({init:function(t,i){var r,a,u=this;s.fn.init.call(u,t,i),t=u.element,i=u.options,i.min=l(t.attr("min"))||l(i.min),i.max=l(t.attr("max"))||l(i.max),n(i),u._initialOptions=R({},i),u._wrapper(),u.dateView=new L(R({},i,{id:t.attr(C),anchor:u.wrapper,change:function(){u._change(this.value()),u.close()},close:function(e){u.trigger(v)?e.preventDefault():(t.attr(H,!1),a.attr(E,!0))},open:function(e){var n,i=u.options;u.trigger(g)?e.preventDefault():(u.element.val()!==u._oldText&&(n=l(t.val(),i.parseFormats,i.culture),u.dateView[n?"current":"value"](n)),t.attr(H,!0),a.attr(E,!1),u._updateARIA(n))}})),a=u.dateView.div,u._icon();try{t[0].setAttribute("type","text")}catch(c){t[0].type="text"}t.addClass("k-input").attr({role:"combobox","aria-expanded":!1,"aria-owns":u.dateView._dateViewID}),u._reset(),u._template(),r=t.is("[disabled]")||e(u.element).parents("fieldset").is(":disabled"),r?u.enable(!1):u.readonly(t.is("[readonly]")),u._old=u._update(i.value||u.element.val()),u._oldText=t.val(),o.notify(u)},events:[g,v,_],options:{name:"DatePicker",value:null,footer:"",format:"",culture:"",parseFormats:[],min:new Date(1900,0,1),max:new Date(2099,11,31),start:F,depth:F,animation:{},month:{},dates:[],ARIATemplate:'Current focused date is #=kendo.toString(data.current, "D")#'},setOptions:function(e){var t=this,i=t._value;s.fn.setOptions.call(t,e),e=t.options,e.min=l(e.min),e.max=l(e.max),n(e),t.dateView.setOptions(e),i&&(t.element.val(o.toString(i,e.format,e.culture)),t._updateARIA(i))},_editable:function(e){var t=this,n=t._dateIcon.off(m),r=t.element.off(m),o=t._inputWrapper.off(m),a=e.readonly,s=e.disable;a||s?(o.addClass(s?T:b).removeClass(s?b:T),r.attr(y,s).attr(w,a).attr(A,s).attr(P,a)):(o.addClass(b).removeClass(T).on(D,t._toggleHover),r.removeAttr(y).removeAttr(w).attr(A,!1).attr(P,!1).on("keydown"+m,Y(t._keydown,t)).on("focusout"+m,Y(t._blur,t)).on("focus"+m,function(){t._inputWrapper.addClass(k)}),n.on(h,Y(t._click,t)).on(S,i))},readonly:function(e){this._editable({readonly:e===t?!0:e,disable:!1})},enable:function(e){this._editable({readonly:!1,disable:!(e=e===t?!0:e)})},destroy:function(){var e=this;s.fn.destroy.call(e),e.dateView.destroy(),e.element.off(m),e._dateIcon.off(m),e._inputWrapper.off(m),e._form&&e._form.off("reset",e._resetHandler)},open:function(){this.dateView.open()},close:function(){this.dateView.close()},min:function(e){return this._option(O,e)},max:function(e){return this._option(z,e)},value:function(e){var n=this;return e===t?n._value:(n._old=n._update(e),null===n._old&&n.element.val(""),n._oldText=n.element.val(),t)},_toggleHover:function(t){e(t.currentTarget).toggleClass(M,"mouseenter"===t.type)},_blur:function(){var e=this,t=e.element.val();e.close(),t!==e._oldText&&e._change(t),e._inputWrapper.removeClass(k)},_click:function(){var e=this,t=e.element;e.dateView.toggle(),o.support.touch||t[0]===d()||t.focus()},_change:function(e){var t=this;e=t._update(e),+t._old!=+e&&(t._old=e,t._oldText=t.element.val(),t.element.trigger(_),t.trigger(_))},_keydown:function(e){var t=this,n=t.dateView,i=t.element.val();n.popup.visible()||e.keyCode!=u.ENTER||i===t._oldText?(n.move(e),t._updateARIA(n._current)):t._change(i)},_icon:function(){var t,n=this,i=n.element;t=i.next("span.k-select"),t[0]||(t=e('select').insertAfter(i)),n._dateIcon=t.attr({role:"button","aria-controls":n.dateView._dateViewID})},_option:function(e,n){var i=this,r=i.options;return n===t?r[e]:(n=l(n,r.parseFormats,r.culture),n&&(r[e]=new U(+n),i.dateView[e](n)),t)},_update:function(e){var t,n=this,i=n.options,r=i.min,a=i.max,s=n._value,u=l(e,i.parseFormats,i.culture),c=null===u&&null===s||u instanceof Date&&s instanceof Date;return+u===+s&&c?(t=o.toString(u,i.format,i.culture),t!==e&&n.element.val(null===u?e:t),u):(null!==u&&W(u,r)?u=V(u,r,a):I(u,r,a)||(u=null),n._value=u,n.dateView.value(u),n.element.val(u?o.toString(u,i.format,i.culture):e),n._updateARIA(u),u)},_wrapper:function(){var t,n=this,i=n.element;t=i.parents(".k-datepicker"),t[0]||(t=i.wrap(p).parent().addClass("k-picker-wrap k-state-default"),t=t.wrap(p).parent()),t[0].style.cssText=i[0].style.cssText,i.css({width:"100%",height:i[0].style.height}),n.wrapper=t.addClass("k-widget k-datepicker k-header").addClass(i[0].className),n._inputWrapper=e(t[0].firstChild)},_reset:function(){var t=this,n=t.element,i=n.attr("form"),r=i?e("#"+i):n.closest("form");r[0]&&(t._resetHandler=function(){t.value(n[0].defaultValue),t.max(t._initialOptions.max),t.min(t._initialOptions.min)},t._form=r.on("reset",t._resetHandler))},_template:function(){this._ariaTemplate=c(this.options.ARIATemplate)},_updateARIA:function(e){var t,n=this,i=n.dateView.calendar;n.element.removeAttr("aria-activedescendant"),i&&(t=i._cell,t.attr("aria-label",n._ariaTemplate({current:e||i.current()})),n.element.attr("aria-activedescendant",t.attr("id")))}}),a.plugin(r)}(window.kendo.jQuery),function(e,t){function n(e,t,n){var i,r=e.getTimezoneOffset();e.setTime(e.getTime()+t),n||(i=e.getTimezoneOffset()-r,e.setTime(e.getTime()+i*H))}function i(){var e=new q,t=new q(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0),n=new q(e.getFullYear(),e.getMonth(),e.getDate(),12,0,0);return-1*(t.getTimezoneOffset()-n.getTimezoneOffset())}function r(e){return 60*e.getHours()*H+e.getMinutes()*H+1e3*e.getSeconds()+e.getMilliseconds()}function o(e,t,n){var i,o=r(t),a=r(n);return e&&o!=a?(i=r(e),o>i&&(i+=E),o>a&&(a+=E),i>=o&&a>=i):!0}function a(e){var t=e.parseFormats;e.format=m(e.format||c.getCulture(e.culture).calendars.standard.patterns.t),t=B(t)?t:[t],t.splice(0,0,e.format),e.parseFormats=t}function s(e){e.preventDefault()}var l,u,c=window.kendo,d=c.keys,f=c.parseDate,p=c._activeElement,m=c._extractFormat,h=c.support,g=h.browser,v=c.ui,_=v.Widget,y="open",w="close",b="change",k=".kendoTimePicker",x="click"+k,T="k-state-default",M="disabled",D="readonly",S="li",C="",O="k-state-focused",z="k-state-hover",F="mouseenter"+k+" mouseleave"+k,A="mousedown"+k,H=6e4,E=864e5,P="k-state-selected",N="k-state-disabled",I="aria-selected",V="aria-expanded",W="aria-hidden",R="aria-disabled",Y="aria-readonly",U="aria-activedescendant",L="id",B=e.isArray,$=e.extend,j=e.proxy,q=Date,J=new q;J=new q(J.getFullYear(),J.getMonth(),J.getDate(),0,0,0),l=function(t){var n=this,i=t.id;n.options=t,n.ul=e('
'+b[n]+"
","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("
iframe with addEventListener('hashchange', function() { + document.body.style.background = 'lime'; +}, false); +
+ + +

Session history management

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "history"
+ +

Auto

Test if history.pushState was successful
+ + +

IndexedDB

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "indexeddb"
+ + +

JSON parsing

[Table] [Single feat]  +

Auto

+ +

Auto

Create a JS object, convert to JSON string, convert back to object and compare.
+ + +

CSS3 Multiple backgrounds

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "multiplebgs"
+ +

Visual-square

background-repeat: repeat-x; +background-image: url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png); +background-position: 0 0, 0 5px, 0 10px, 0 15px, 0 20px, 0 25px;
+ + +

CSS3 Multiple column layout

[Table] [Single feat] -pre- +

Auto (m)

Modernizr test for: "csscolumns"
+ +

Visual-square

+
+
+
+
column-width: 15px; +column-gap: 0;
+ + +

Web Storage - name/value pairs

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "localstorage"
+ +

Auto

Test if getItem, setItem and removeItem work.
+ + +

Web Notifications

[Table] [Single feat]  +

Auto

+ + +

Offline web applications

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "applicationcache"
+ + +

querySelector/querySelectorAll

[Table] [Single feat]  +

Auto

+ +

Auto

+
+
+
+
+
querySelector test on selector '[data-foo=bar] + *'
+ +

Auto

+
+
+
+
+
querySelectorAll test on selector '[data-foo=bar] + *'
+ + +

SVG (basic support)

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "svg"
+ +

Visual-square

SVG fail +
SVG in <object>
+ + +

SVG effects for HTML

[Table] [Single feat]  + +

Visual

SVG fail +

Text must appear blurry

SVG with feGaussianBlur filter on foreignObject
+ + +

Inline SVG in HTML5

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "inlinesvg"
+ +

Visual-square

+ + +
+ + +

SVG SMIL animation

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "smil"
+ +

Visual-square

SVG fail +
SVG with animate element inside a rect
+ + +

Touch events

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "touch"
+ + +

CSS3 Transforms

[Table] [Single feat] -pre- +

Auto (m)

Modernizr test for: "csstransforms"
+ +

Visual-square

+
+
+
transform: translate(30px);
+ + +

CSS3 3D Transforms

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "csstransforms3d"
+ +

Visual-square

+
+
+
Parent: +perspective: 600; +perspective-origin: 0 200px; + +Child: + +transform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);
+ + +

Video element

[Table] [Single feat]  +

Auto

+ +

Interact

Video with controls and all three formats available.
+ +

Interact

Video with controls and all three formats available (with MIME).
+ + +

Web Sockets

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "websockets"
+ + +

Web Workers

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "webworkers"
+ +

Auto

Create a new Worker using new Worker('worker.js'); + +Then, test postMessage and onmessage event.
+ + +

Cross-document messaging

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "postmessage"
+ + +

XMLHttpRequest 2

[Table] [Single feat]  +

Auto

+ + +

XHTML served as application/xhtml+xml

[Table] [Single feat]  +

Auto

+ + +

CSS Generated content

[Table] [Single feat]  +

Visual

+-
Element with CSS: +#gencontent:before { + content: 'A'; +} +#gencontent:after { + content: 'Z'; +}
+ + +

CSS Table display

[Table] [Single feat]  +

Visual

+
+
+
+
topleft
+
topright
+
+
+
bottomleft
+
bottomright
+
+
+

Should be 2x2 table

+ + +

HTML5 form features

[Table] [Single feat]  +

Visual




date/time/range/number widgets

+ + +

MathML

[Table] [Single feat]  +

Visual

+ + +

PNG alpha transparency

[Table] [Single feat]  +

Visual

+ + +

Ruby annotation

[Table] [Single feat]  +

Visual

+
+(bottom1)(top1)(bottom2)(top2) +

Elements should be stacked on top of each other

+ + +

SVG filters

[Table] [Single feat]  +

Visual

+ object SVG not supported + +
+ +

Visual-square

SVG fail +

Must be green (not lime)

SVG with <feColorMatrix type="hueRotate" values="120"/>
+ +

Visual-square

SVG fail +
SVG with <feFlood flood-color="lime"/>
+ + +

CSS3 Word-wrap

[Table] [Single feat]  +

Visual

+
abcdefghijklmnopqrstuvwxyz
+ + +

Text should wrap

+ +

Visual

+ +
abcdefghijklmnopqrstuvwxyz
+

Text should overflow box

+ +

Visual-square

+
abcdefghijklmnop
+
+
word-wrap: break-word;
+ + +

calc() as CSS unit value

[Table] [Single feat]  +

Visual-square

+
+
width: calc(10px + 20px);
+ +

Visual-square

+
+
height: calc(60px - 100%); +width: calc((100% / 2) + 15px - 0.5em); +border-right: calc(0.5em) solid lime;
+ + +

CSS Grid Layout

[Table] [Single feat]  +

Visual-square

+ +
+
+
+
+
+ +
Grid with two columns, two rows and three elements taking up space.
+ + +

CSS3 Media Queries

[Table] [Single feat]  +

Visual-square

+ +
+
+
+
+ + +

CSS 2.1 selectors

[Table] [Single feat]  +

Visual-square

+
+
+
+
Test for child ( > )selector
+ +

Visual-square

+
+
+
Adjacent sibling selector test ( + )
+ +

Visual-square

+
Attribute selector ( [role="none"] )
+ + +

CSS3 Box-sizing

[Table] [Single feat]  +

Visual-square

+
+
+ + +

Data URLs

[Table] [Single feat]  +

Visual-square

div with data URL as background image
+ + +

New semantic elements

[Table] [Single feat]  +

Visual-square

+ +
+
+
+ +
+
+
+ +
section, article, aside, hgroup, header, footer, nav tested for default "block" style.
+ + +

CSS inline-block

[Table] [Single feat]  +

Visual-square

+ + +

CSS min/max-width/height

[Table] [Single feat]  +

Visual-square

+ +

Visual-square

+ +

Visual-square

+ +

Visual-square

+ + +

CSS3 object-fit/object-position

[Table] [Single feat]  +

Visual-square

+ +
+ +
object-fit: contain
+ +

Visual-square

+ +
+ +
+
object-position: 30px 30px;
+ + +

rem (root em) units

[Table] [Single feat]  +

Visual-square

+ A +
span with single character and font-size: 5rem;
+ + +

SVG in CSS backgrounds

[Table] [Single feat]  +

Visual-square

+ +
+ + +

SVG in HTML img element

[Table] [Single feat]  +

Visual-square

+ + +

contenteditable attribute (basic support)

[Table] [Single feat]  +

Interact

+

This element should be editable.

+
Div element with attribute contenteditable="true"
+ + +

CSS3 selectors

[Table] [Single feat]  +

Interact

Test here
+ + +

Drag and Drop

[Table] [Single feat]  +

Interact

Test here
+ + +

WAI-ARIA Accessibility features

[Table] [Single feat]  + + +

Text API for Canvas

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "canvastext"
+ + +

WebGL - 3D Canvas graphics

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "webgl"
+ +

Visual-square

+ +
+ + +

SVG fonts

[Table] [Single feat]  +

Visual

+

Windsong font

+
+ + +

TTF/OTF - TrueType and OpenType font support

[Table] [Single feat]  +

Visual

+

Windsong font

+
OTF font test
+ +

Visual

+

Windsong font

+
TTF font test
+ + +

WOFF - Web Open Font Format

[Table] [Single feat]  +

Visual

+

Windsong font

+
+ + +

Progress & Meter

[Table] [Single feat]  +

Visual

+fail +fail +

Progress and meter widgets at 50%

+ + +

Datalist element

[Table] [Single feat]  +

Interact

+ + + + +

Show "foo" and "foobar" as options when "f" is entered

+ + +

Form validation

[Table] [Single feat]  +

Interact

Form should show warning and NOT submit

+ + +

MPEG-4/H.264 video format

[Table] [Single feat]  +

Auto

+ +

Interact

Video, no MIME, no type attribute.
+ +

Interact

Video with source element
+ +

Interact

Video with source element and MIME set
+ + +

Ogg/Theora video format

[Table] [Single feat]  +

Auto

+ +

Interact

Video, no MIME, no type attribute.
+ +

Interact

Video with source element and MIME set
+ +

Interact

Video with source element
+ + +

WebM/VP8 video format

[Table] [Single feat]  +

Auto

+ +

Interact

Video, no MIME, no type attribute.
+ +

Interact

Video with source element
+ +

Interact

Video with source element and MIME set
+ + +

Animated PNG (APNG) [unoff]

[Table] [Single feat]  +

Auto

Test for second frame using Canvas element
+ +

Visual

Must animate

+ + +

CSS Canvas Drawings [unoff]

[Table] [Single feat] -pre- +

Auto

'getCSSCanvasContext' in document
+ + +

CSS Reflections [unoff]

[Table] [Single feat] -pre- +

Auto (m)

Modernizr test for: "cssreflections"
+ + +

Visual-square

+ +
+
+ +
+ + + +

Web SQL Database [unoff]

[Table] [Single feat]  +

Auto (m)

Modernizr test for: "websqldatabase"
+ + +

Stream API [unoff]

[Table] [Single feat]  +

Auto

Test for "getUserMedia" in navigator object
+ + +

CSS Masks [unoff]

[Table] [Single feat] -pre- +

Visual

+
+ +
mask-image: url(caniuse_files/alpha.png);
+ + +

CSS3 Text-overflow [unoff]

[Table] [Single feat]  +

Visual

+ +
+abcdefghijklmnopqrstuvwxyz +

Should end with ellipsis

text-overflow: ellipsis;
+ + +

CSS text-stroke [unoff]

[Table] [Single feat] -pre- +

Visual

+ +
+green stroked text +
text-stroke: 2px lime;
+ + +

EOT - Embedded OpenType fonts [unoff]

[Table] [Single feat]  +

Visual

+

Windsong font

+
+ + +

XHTML+SMIL animation [unoff]

[Table] [Single feat]  + + + +

Most tests by Alexis Deveria, additional contributions by Paul Irish

+ + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.eot b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..768d05309ffcf64f182d079efff4a84efd22f362 GIT binary patch literal 40166 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 Ci%MYt literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.otf b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.otf new file mode 100644 index 0000000000000000000000000000000000000000..369e640959e4278b0a7d6c71ef5655c4ab3dc8c6 GIT binary patch literal 78680 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Bright Ideas Magazine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.ttf b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4d341921ec489f5032f6f2ff4d2b8718538b28bd GIT binary patch literal 39936 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 literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.woff b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/Windsong-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..1aa47d4c8641419d74391a1f0b8b4986368c6cb9 GIT binary patch literal 27284 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 SD?|aX1|UVS11m&XuoNq)T;ON` literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/alpha.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a0f35215b5ed58fb2d1e3e744e53cdfd8760ee GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYelw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlB3Dlr$B>F!Z_ZhBF(~l39K8BF{F7Rtm<)6=YZkqn++Z}!Exq1Tw6Ndtj&|zd_&|at{yPWIxA)tW_p00i_ I>zopr000yZTbOHdH zau+jKB_EKL+}9xcvNbd#DeCL#&my860rH&l0zlwujIpXfffykQW<%Z%gI$DCR7b4I z1&mAr+|`L*QmKy^7(_Z40b=X;fT9Y-`jNhUM|#ZWGD`o%&DWo@EtBV)GoL?HDyzE)|M9k? z&mZjH>}VUkc4c^^{nT1V;GG-4Ke*>(%gOa$f4yU4doMh>`}oAWHS + + + + + + + + + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/ga.js b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/ga.js new file mode 100644 index 0000000..76a01b0 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/ga.js @@ -0,0 +1,43 @@ +(function(){var k=void 0,aa=encodeURIComponent,l=String,o=Math,ba="push",ca="cookie",p="charAt",q="indexOf",da="getTime",r="toString",t="window",v="length",w="document",x="split",y="location",ea="protocol",fa="href",z="substring",A="join",C="toLowerCase";var ga="_gat",ha="_gaq",ia="4.9.4",ja="_gaUserPrefs",ka="ioo",D="&",E="=",F="__utma=",H="__utmb=",la="__utmc=",ma="__utmk=",I="__utmv=",J="__utmz=",na="__utmx=",oa="GASO=";var pa=function(){var d=this,f=[],b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";d.set=function(b){f[b]=!0};d.Sc=function(){for(var d=[],e=0;e=0};b.Xc=function(){return b.Jb("Firefox")&&![].reduce};b.Vc=function(){return L[t][ja]};b.Gc=function(){return L[t].external};b.Hc=function(){return L[t].performance||L[t].webkitPerformance};b.Ic=function(){return L[t].top==L[t]};b.Ya=function(b){var e=L[t]&&L[t].gaGlobal;if(b&&!e)e={},L[t].gaGlobal=e;return e};b.ec=function(b){L[w][y].href=b};b.qb= +function(d){if(!d||!b.Jb("Firefox"))return d;for(var d=d.replace(/\n|\r/g," "),e=0,f=d[v];e-1&&(b=d[q](b,e),b<0&&(b=d[v]),h=d[z](e+f[q](E)+1,b)));return h},xa=function(d){var f=!1,b=0,h,e;if(!M(d)){f= +!0;for(h=0;h-1)}return f},P=function(d,f){var b=aa;return b instanceof Function?f?encodeURI(d):b(d):(K(68),escape(d))},Q=function(d,f){var b=decodeURIComponent,h,d=d[x]("+")[A](" ");if(b instanceof Function)try{h=f?decodeURI(d):b(d)}catch(e){K(17),h=unescape(d)}else K(68),h=unescape(d);return h},R=function(d,f){return d[q](f)>-1}; +function ya(d){if(!d||""==d)return"";for(;d[p](0)[v]>0&&" \n\r\t"[q](d[p](0))>-1;)d=d[z](1);for(;d[p](d[v]-1)[v]>0&&" \n\r\t"[q](d[p](d[v]-1))>-1;)d=d[z](0,d[v]-1);return d}var T=function(d,f){d[ba]||K(94);d[d[v]]=f},za=function(d){var f=1,b=0,h;if(!M(d)){f=0;for(h=d[v]-1;h>=0;h--)b=d.charCodeAt(h),f=(f<<6&268435455)+b+(b<<14),b=f&266338304,f=b!=0?f^b>>21:f}return f},Aa=function(){return o.round(o.random()*2147483647)},Ba=function(){};var Ca=function(d,f){this.ib=d;this.jb=f},Da=function(){function d(b){for(var d=[],b=b[x](","),e,f=0;f0&&(i=i[x]("^")[0]);b=i[x](":");i=b[1];d=parseInt(b[0],10);!j&&d0?h(b):"";m.o&&(c=e.Oc(L[w][ca],a,m.o,c,b),a="2"+a,j=b>0?h(m.s):"");a+=c;a=L.qb(a);a[v]>2E3&&(K(69),a=a[z](0,2E3));j=a+"; path="+m.f+"; "+j+e.hb();if(!V.pb())L[w].cookie=j};e.Oc=function(a,c,d,j,i){var g="",i=i||m.s,j=b([j,e.m+i*1],d),g=N(a,"2"+c,";");if(!M(g))return a=b(f(a,c,d,!0),d),g=g[x](a)[A](""),g=j+g;return j};e.hb=function(){return M(m.b)?"":"domain="+ +m.b+";"}};var Fa=function(d){function f(a){a=ua(a)?a[A]("."):"";return M(a)?"-":a}function b(a,c){var n=[],b;if(!M(a)&&(n=a[x]("."),c))for(b=0;b')}catch(m){e=h.createElement("iframe"),e.name=f}e.height="0";e.width="0";e.style.display="none";e.style.visibility="hidden";var g=h[y], +g=g[ea]+"//"+g.host+"/favicon.ico",g=Ga+"u/post_iframe.html#"+aa(g),a=function(){e.src="";e.parentNode&&e.parentNode.removeChild(e)};ta(L[t],"beforeunload",a);var c=!1,u=0,j=function(){if(!c){try{if(u>9||e.contentWindow[y].host==h[y].host){c=!0;a();var d=L[t],g="beforeunload",n=a;d.removeEventListener?d.removeEventListener(g,n,!1):d.detachEvent&&d.detachEvent("on"+g,n);b&&b();return}}catch(f){}u++;L.setTimeout(j,200)}};ta(e,"load",j);h.body.appendChild(e);e.src=g}else L.setTimeout(function(){d.Ob(f, +b)},100)}};var Ka=function(d){var f=this,b=d,h=new Fa(b),e=null,m=!V.pb(),g=function(){};f.Uc=function(){return"https:"==L[w][y][ea]?"https://ssl.google-analytics.com/__utm.gif":"http://www.google-analytics.com/__utm.gif"};f.A=function(a,c,d,j,i,s){e||(e=new Ja);var n=b.B,O=L[w][y];h.Z(d);var B=h.z()[x](".");if(B[1]<500||j){if(i){var S=(new Date)[da](),X;X=(S-B[3])*(b.Ac/1E3);X>=1&&(B[2]=o.min(o.floor(B[2]*1+X),b.zc),B[3]=S)}if(j||!i||B[2]>=1){!j&&i&&(B[2]=B[2]*1-1);j=B[1]*1+1;B[1]=j;i="utmwv="+ia;S="&utms="+ +j;X="&utmn="+Aa();j=i+"e"+S+X;a=i+S+X+(M(O.hostname)?"":"&utmhn="+P(O.hostname))+(b.L==100?"":"&utmsp="+P(b.L))+a;if(0==n||2==n)O=2==n?g:s||g,m&&e.Bb(b.ga,a,j,O,!0);if(1==n||2==n)c="&utmac="+c,j+=c,a+=c+"&utmcc="+f.Tc(d),V.Ab&&(d="&aip=1",j+=d,a+=d),a+="&utmu="+qa.Sc(),m&&e.Bb(f.Uc(),a,j,s)}}h.$(B[A]("."));h.aa()};f.Tc=function(a){for(var c=[],b=[F,J,I,na],d=h.g(),i,g=0;g0)for(b=0;b0;)d+=a--^c++;return za(d)}};var Z=function(d,f,b,h){function e(a){var c="",c=a[x]("://")[1][C]();R(c,"/")&&(c=c[x]("/")[0]);return c}var m=h,g=this;g.a=d;g.ob=f;g.m=b;g.mb=function(a){var c=g.ua();return new Z.v(N(a,m.Ea+E,D),N(a,m.Ha+E,D),N(a,m.Ja+E,D),g.R(a,m.Ca,"(not set)"),g.R(a,m.Fa,"(not set)"),g.R(a,m.Ia,c&&!M(c.G)?Q(c.G):k),g.R(a,m.Da,k),N(a,m.vc+E,D))};g.nb=function(a){var c=e(a),b;b=a;var d="";b=b[x]("://")[1][C]();R(b,"/")&&(b=b[x]("/")[1],R(b,"?")&&(d=b[x]("?")[0]));b=d;if(R(c,"google")&&(a=a[x]("?")[A](D),R(a,D+ +m.xc+E)&&b==m.wc))return!0;return!1};g.ua=function(){var a,c=g.ob,b,d=m.J;if(!M(c)&&"0"!=c&&R(c,"://")&&!g.nb(c)){a=e(c);for(var i=0;i9?h[z](n+1)*1:0,f++,h=0==h?1:h,a.ra([B,g.m,h,f,e.H()][A](".")),a.sa()}}}}; +Z.v=function(d,f,b,h,e,m,g,a){var c=this;c.q=d;c.Q=f;c.ya=b;c.n=h;c.P=e;c.G=m;c.Gb=g;c.xa=a;c.H=function(){var a=[],b=[["cid",c.q],["csr",c.Q],["gclid",c.ya],["ccn",c.n],["cmd",c.P],["ctr",c.G],["cct",c.Gb],["dclid",c.xa]],d,e;if(c.fb())for(d=0;d0&&b<=a.Ta){var f=P(c),h=P(d);f[v]+h[v]<=64&&(e.r[b]=[c,d,g],e.T(),n=!0)}return n};e.Zb=function(a){if((a=e.r[a])&&1===a[2])return a[1]};e.Yb=function(a){var b=e.r;b[a]&&(delete b[a],e.T())};e.Pc=function(){c.t(8);c.t(9);c.t(11);var a=e.r,b,d;for(d in a)if(b=a[d])c.j(8,d,b[0]),c.j(9,d,b[1]),(b=b[2])&&3!=b&&c.j(11,d,""+b)}};var Na=function(){function d(a,b,c,d){k==g[a]&&(g[a]={});k==g[a][b]&&(g[a][b]=[]);g[a][b][c]=d}function f(a,b,c){if(k!=g[a]&&k!=g[a][b])return g[a][b][c]}function b(a,b){if(k!=g[a]&&k!=g[a][b]){g[a][b]=k;var c=!0,d;for(d=0;d0?b+"00":"0"};b.sb=function(){var d=b.Kc();if(d==k||isNaN(d))return!1;if(d<=0)return!0;if(d>2147483648)return!1; +var a=b.rb;a.t(14);a.ia(14);var c=b.Jc(d);a.j(14,1,c)&&a.ja(14,1,d)&&b.Lc();h&&h.isValidLoadTime!=k&&h.setPageReadyTime();return!1};b.Wa=function(){if(!b.Mc())return!1;if(!L.Ic())return!1;b.sb()&&ta(L[t],"load",b.sb,!1);return!0}};var $=function(){};$.Zc=function(d){var f="gaso=",b=L[w][y].hash;d=b&&1==b[q](f)?N(b,f,D):(b=L[t].name)&&0<=b[q](f)?N(b,f,D):N(d.g(),oa,";");return d};$.ad=function(d,f){var b=(f||"www")+".google.com",b="https://"+b+"/analytics/reporting/overlay_js?gaso="+d+D+Aa(),h="_gasojs",e=L[w].createElement("script");e.type="text/javascript";e.src=b;if(h)e.id=h;(L[w].getElementsByTagName("head")[0]||L[w].getElementsByTagName("body")[0]).appendChild(e)}; +$.load=function(d,f){if(!$.$c){var b=$.Zc(f),h=b&&b.match(/^(?:\|([-0-9a-z.]{1,30})\|)?([-.\w]{10,1200})$/i);if(h)f.Dc(b),f.Ec(),V._gasoDomain=d.b,V._gasoCPath=d.f,$.ad(h[2],h[1]);$.$c=!0}};var Qa=function(d,f,b){function h(){if("auto"==j.b){var a=L[w].domain;"www."==a[z](0,4)&&(a=a[z](4));j.b=a}j.b=j.b[C]()}function e(){h();var a=j.b,b=a[q]("www.google.")*a[q](".google.")*a[q]("google.");return b||"/"!=j.f||a[q]("google.org")>-1}function m(b,c,d){if(M(b)||M(c)||M(d))return"-";b=N(b,F+a.a+".",c);M(b)||(b=b[x]("."),b[5]=""+(b[5]?b[5]*1+1:1),b[3]=b[4],b[4]=d,b=b[A]("."));return b}function g(){return"file:"!=L[w][y][ea]&&e()}var a=this,c=sa(a),u=k,j=new Da,i=!1,s=k;a.n=d;a.m=o.round((new Date)[da]()/ +1E3);a.p=f||"UA-XXXXX-X";a.ab=L[w].referrer;a.oa=k;a.d=k;a.F=!1;a.O=k;a.e=k;a.bb=k;a.pa=k;a.a=k;a.k=k;j.o=b?P(b):k;a.eb=!1;a.mc=function(){return Aa()^a.O.cc()&2147483647};a.lc=function(){if(!j.b||""==j.b||"none"==j.b)return j.b="",1;h();return j.Ua?za(j.b):1};a.kc=function(a,b){if(M(a))a="-";else{b+=j.f&&"/"!=j.f?j.f:"";var c=a[q](b),a=c>=0&&c<=8?"0":"["==a[p](0)&&"]"==a[p](a[v]-1)?"-":a}return a};a.na=function(b){var c="";c+=j.ka?a.O.dc():"";c+=j.la&&!M(L[w].title)?"&utmdt="+P(L[w].title):"";var d; +d=L.Ya(!0);if(!d.hid)d.hid=Aa();d=d.hid;c+="&utmhid="+d+"&utmr="+P(l(a.oa))+"&utmp="+P(a.pc(b));return c};a.pc=function(a){var b=L[w][y];a&&K(13);return a=k!=a&&""!=a?P(a,!0):P(b.pathname+b.search,!0)};a.uc=function(b){if(a.D()){var c="";a.e!=k&&a.e.C()[v]>0&&(c+="&utme="+P(a.e.C()));c+=a.na(b);u.A(c,a.p,a.a)}};a.jc=function(){var b=new Fa(j);return b.Z(a.a)?b.Tb():k};a.cb=c("_getLinkerUrl",52,function(b,c){var d=b[x]("#"),e=b,f=a.jc();if(f)if(c&&1>=d[v])e+="#"+f;else if(!c||1>=d[v])1>=d[v]?e+=(R(b, +"?")?D:"?")+f:e=d[0]+(R(b,"?")?D:"?")+f+"#"+d[1];return e});a.nc=function(){var b=a.m,c=a.k,d=c.g(),e=a.a+"",f=L.Ya(),g,h=R(d,F+e+"."),i=R(d,H+e),u=R(d,la+e),s,G=[],Y="",Ia=!1,d=M(d)?"":d;if(j.w&&!a.eb){g=L[w][y]&&L[w][y].hash?L[w][y][fa][z](L[w][y][fa][q]("#")):"";j.U&&!M(g)&&(Y=g+D);Y+=L[w][y].search;if(!M(Y)&&R(Y,F))c.Sb(Y),c.Ba()||c.Qb(),s=c.ba(),a.eb=!0;g=c.ea;var va=c.Pa,U=c.Sa;M(g())||(va(Q(g())),R(g(),";")||U());g=c.da;va=c.X;U=c.Y;M(g())||(va(g()),R(g(),";")||U())}M(s)?h?(s=!i||!u)?(s=m(d, +";",l(b)),a.F=!0):(s=N(d,F+e+".",";"),G=N(d,H+e,";")[x](".")):(s=[e,a.mc(),b,b,b,1][A]("."),Ia=a.F=!0):M(c.z())||M(c.ca())?(s=m(Y,D,l(b)),a.F=!0):(G=c.z()[x]("."),e=G[0]);s=s[x](".");L[t]&&f&&f.dh==e&&!j.o&&(s[4]=f.sid?f.sid:s[4],Ia&&(s[3]=f.sid?f.sid:s[4],f.vid&&(b=f.vid[x]("."),s[1]=b[0],s[2]=b[1])));c.Na(s[A]("."));G[0]=e;G[1]=G[1]?G[1]:0;G[2]=k!=G[2]?G[2]:j.Wb;G[3]=G[3]?G[3]:s[4];c.$(G[A]("."));c.Oa(e);M(c.Rb())||c.fa(c.K());c.Qa();c.aa();c.Ra()};a.oc=function(){u=new Ka(j)};a.getName=c("_getName", +58,function(){return a.n});a.c=c("_initData",2,function(){var b;if(!i){if(!a.O)a.O=new La(j.ma);a.a=a.lc();a.k=new Fa(j);a.e=new Na;s=new Ma(j,l(a.a),a.k,a.e);a.oc()}if(g()){if(!i)a.oa=a.kc(a.ab,L[w].domain),b=new Z(l(a.a),a.oa,a.m,j);a.nc(b);s.$b()}if(!i)g()&&b.Pb(a.k,a.F),a.bb=new Na,$.load(j,a.k),i=!0});a.Xa=c("_visitCode",54,function(){a.c();var b=N(a.k.g(),F+a.a+".",";"),b=b[x](".");return b[v]<4?"":b[1]});a.qd=c("_cookiePathCopy",30,function(b){a.c();a.k&&a.k.Ub(a.a,b)});a.D=function(){return a.Xa()% +1E40&&(f=g[z](0,a),g=g[z](a+1));var c=f==ga?V:f==ha?Sa:V.Hb(f);c[g].apply(c,b[e].slice(1))}}catch(u){d++}return d}};var V=new Ra;var Ua=L[t][ga];Ua&&typeof Ua._getTracker=="function"?V=Ua:L[t][ga]=V;var Sa=new Ta;a:{var Va=L[t][ha],Wa=!1;if(Va&&typeof Va[ba]=="function"&&(Wa=ua(Va),!Wa))break a;L[t][ha]=Sa;Wa&&Sa[ba].apply(Sa,Va)};})(); diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/green5x5.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/green5x5.png new file mode 100644 index 0000000000000000000000000000000000000000..182554777243109b7474903c8f0a126334c0ee9d GIT binary patch literal 72 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=eoq(25RRG22|xN-FF6P>$Xz!) UzcbN!7Ep@8)78&qol`;+0Q8Iz9smFU literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/hashchange.html b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/hashchange.html new file mode 100644 index 0000000..ad95f69 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/hashchange.html @@ -0,0 +1,16 @@ + + + + + hashchange test + + + + + diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/jquery.min.js b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/jquery.min.js new file mode 100644 index 0000000..b2ac174 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/jquery.min.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu May 12 15:04:36 2011 -0400 + */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function L(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function F(){return!0}function E(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.1",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),"slice",D.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};f=c.createElement("select"),g=f.appendChild(c.createElement("option")),h=a.getElementsByTagName("input")[0],j={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function b(){j.noCloneEvent=!1,a.detachEvent("onclick",b)}),a.cloneNode(!0).fireEvent("onclick")),h=c.createElement("input"),h.value="t",h.setAttribute("type","radio"),j.radioValue=h.value==="t",h.setAttribute("checked","checked"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",l=c.createElement("body"),m={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",n=a.getElementsByTagName("td"),r=n[0].offsetHeight===0,n[0].style.display="",n[1].style.display="none",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement("div"),i.style.width="0",i.style.marginRight="0",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML="",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p="on"+q,r=p in a,r||(a.setAttribute(p,"return;"),r=typeof a[p]=="function"),j[q+"Bubbles"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;return(e.value||"").replace(p,"")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!="boolean"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,"form")||u.test(c))&&(i=v):i=w);if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=Object.prototype.hasOwnProperty,y=/\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\./g,B=/ /g,C=/[^\w\s.|`]/g,D=function(a){return a.replace(C,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=E);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),D).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem +)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=J(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&K.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",J(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in I)f.event.add(this,c+".specialChange",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(W(c[0])||W(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=T.call(arguments);P.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y=/ jQuery\d+="(?:\d+|null)"/g,Z=/^\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,_=/<([\w:]+)/,ba=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Y,""):null;if(typeof a=="string"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||["",""])[1].toLowerCase()]){a=a.replace($,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bE=/%20/g,bF=/\[\]$/,bG=/\r?\n/g,bH=/#.*$/,bI=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\/\//,bN=/\?/,bO=/)<[^<]*)*<\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\s+/,bR=/([?&])_=[^&]*/,bS=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement("a"),bW.href="",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bT)return bT.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bO,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bP.test(this.nodeName)||bJ.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bG,"\r\n")}}):{name:b.name,value:c.replace(bG,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=cb(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bI.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bH,"").replace(bM,bX[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]==="http:"?80:443))==(bX[3]||(bX[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,"$1_="+x);d.url=y+(y===d.url?(bN.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bV,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bE,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml.html b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml.html new file mode 100644 index 0000000..8203884 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml.html @@ -0,0 +1,120 @@ + + + + + Untitled + + + + + k + = + + + + + + ∂ + 2 + + z + + + ∂ + + x + 2 + + + + + + + ∂ + 2 + + z + + + ∂ + + y + 2 + + + + - + + + ( + + + + ∂ + 2 + + z + + + ∂ + x + ∂ + y + + + ) + + 2 + + + + + + ( + 1 + + + + + ( + + + ∂ + z + + + ∂ + x + + + ) + + 2 + + + + + + ( + + + ∂ + z + + + ∂ + y + + + ) + + 2 + + ) + + 2 + + + + + + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml_ref.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/mathml_ref.png new file mode 100644 index 0000000000000000000000000000000000000000..1633e58db6861fcf8939b43cdd4a4716c3e30ba6 GIT binary patch literal 3140 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 ek}<}VjPXCt26>Q8QyA0$00007)},r.history=function(){return !!(a.history&&history.pushState)},r.draganddrop=function(){return x("dragstart")&&x("drop")},r.websockets=function(){return"WebSocket"in a},r.rgba=function(){A("background-color:rgba(150,255,150,.5)");return D(k.backgroundColor,"rgba")},r.hsla=function(){A("background-color:hsla(120,40%,100%,.5)");return D(k.backgroundColor,"rgba")||D(k.backgroundColor,"hsla")},r.multiplebgs=function(){A("background:url(//:),url(//:),red url(//:)");return(new RegExp("(url\\s*\\(.*?){3}")).test(k.background)},r.backgroundsize=function(){return F("backgroundSize")},r.borderimage=function(){return F("borderImage")},r.borderradius=function(){return F("borderRadius","",function(a){return D(a,"orderRadius")})},r.boxshadow=function(){return F("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){B("opacity:.55");return/^0.55$/.test(k.opacity)},r.cssanimations=function(){return F("animationName")},r.csscolumns=function(){return F("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";A((a+o.join(b+a)+o.join(c+a)).slice(0,-a.length));return D(k.backgroundImage,"gradient")},r.cssreflections=function(){return F("boxReflect")},r.csstransforms=function(){return!!E(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},r.csstransforms3d=function(){var a=!!E(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=w("@media ("+o.join("transform-3d),(")+"modernizr)"));return a},r.csstransitions=function(){return F("transitionProperty")},r.fontface=function(){var a,c,d=h||g,e=b.createElement("style"),f=b.implementation||{hasFeature:function(){return!1}};e.type="text/css",d.insertBefore(e,d.firstChild),a=e.sheet||e.styleSheet;var i=f.hasFeature("CSS2","")?function(b){if(!a||!b)return!1;var c=!1;try{a.insertRule(b,0),c=/src/i.test(a.cssRules[0].cssText),a.deleteRule(a.cssRules.length-1)}catch(d){}return c}:function(b){if(!a||!b)return!1;a.cssText=b;return a.cssText.length!==0&&/src/i.test(a.cssText)&&a.cssText.replace(/\r+|\n+/g,"").indexOf(b.split(" ")[0])===0};c=i('@font-face { font-family: "font"; src: url(data:,); }'),d.removeChild(e);return c},r.video=function(){var a=b.createElement("video"),c=!!a.canPlayType;if(c){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}return c},r.audio=function(){var a=b.createElement("audio"),c=!!a.canPlayType;c&&(c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;"));return c},r.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},r.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}},r.webWorkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");a.innerHTML="";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var H in r)z(r,H)&&(v=H.toLowerCase(),e[v]=r[H](),u.push((e[v]?"":"no-")+v));e.input||G(),e.crosswindowmessaging=e.postmessage,e.historymanagement=e.history,e.addTest=function(a,b){a=a.toLowerCase();if(!e[a]){b=!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b;return e}},A(""),j=l=null,f&&a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="";return a.childNodes.length!==1}()&&function(a,b){function p(a,b){var c=-1,d=a.length,e,f=[];while(++c*Lj&5-g*$kJ0ldNpCJ?|Ie83F8;2VBm4LjJQWy?=8kx}+VrBhwK zJE6dm2lLOt=2jX1CPuxGO!&>4=i|)MzcPQPFMqp9IFc^c&Csy7+)5ecxc0bE>mLB! C7BZ>; literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/pushstate.html b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/pushstate.html new file mode 100644 index 0000000..bcef606 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/pushstate.html @@ -0,0 +1,40 @@ + + + + + popstate event test + + + + + + + diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/red30x30.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/red30x30.png new file mode 100644 index 0000000000000000000000000000000000000000..561c8d2d8b878513f69a7ba3b9c9c2bd0929d4d1 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^av;pe3?v!<**pYN%mF?juKyVrBp-2_1G%D}E{-7; mac2)S0yzu~3;wRWzQTi9otU%W@~VRGOQLclJ9Nnt^pFA%v(aG?(nrBxZ!stAM)1k{}>Pp3+0wy`R? znMTdYg#uBdz%4`c$N8Vn&aeXOw*B?-x8D>G9({f9(rla8Lgv2pFlz_< z?%gAPT12j4I<{%Bq!KC9G;8XZL&wR2+lH&;h{X;!K# z^;uY|&1bmMCt)rA~vX7&RoaP0O+Klaub-w z6$xyU?R;iq#Bg)5Y)kp(feFp4Tk(tmdMaNnig^H-8SMaaX2J~emGdnE<_De$7^$F| zoCknTzofRwwoIaUUa8ik;09p$`9)i_IavV9L_@|#5HcMdwx1{xs6*F6k2#%nEh+Qi zv!+3_f@9wTVGX&=IV}R+=EV?|2rPrev1j(>X;fFKtqp62y$_-CJ~+{gL^ibksI+yq zg!FZ2Zn9+C0-5{tUqHq!y3doaU)b#$Q*j4?F-wawi@K^6szxTv0<`wZG%Nlnk}fHe zwI6EL)T!4$a9oyopS+O@>gyKM3;E0ig~GXS0~#k~(pbtjWBSlxTV_kh%m?5^#gc6c z#)lzeXq?_2wWsypiA)W^niW)yr^Cxp=G30!7pSwWpR1^IVDuN6>VVrdj9@wpzrRLx zMSC_M?79om`X%|6+-Z&5!WP=fBGLiPiR7|v#}zDdcw>T|tJe;3IN1XrfO~h|LC^k; zn*iFXQs__^hBE+XLuqmPBkLt&{%0!ge{u^g=Uwskotxtl6TFnaKx~=q z;-~NTZ+(8?@h9JXHhGclmHmVFFenfQd;1`s;wd@dv|Nxt@1{udpmSel|L}bv`QaNf~{s2AC)j4_u0GcneHx8r7X#!jWuwAx`AHMwP3xlPPzPdlb1>1o}X2ySZ3|NfU zN)_A%)kRGysgJS=y3hg;=ts^I78Q(0xh9&~*%0TdYA~$ENe$<-22-?=IgR{{W3cwv?U$08jt`002ovPDHLkV1iUBnDPJs literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/stroked-text.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/stroked-text.png new file mode 100644 index 0000000000000000000000000000000000000000..e75890faa531f535a86cf754f0095cb8a1d10db5 GIT binary patch literal 1291 zcmWNR`!|#c0EWLA#xTbHGTF!_xr9j!xkO|}N$%`2QYy)sM3h_ECan@Vk_^g;C2eYL z6yu1nI*WA;g;k=Wq&PMmMSSo2;d!5b;62YJZ_izFj2{>TLCCr7=K8KVehoEgiM73@ zF*8gMRF3yve;xn=gb7THV8jCJ3a)U#*^JFru(E_@9`Xp1V33Th*t!85m|(78ZzIxQUxGq>L0P6^Y1s%-5lA7PE4soHx8< z5xWCBUgG5&yt#x+AMn8ujsqC5fQ39MZvz`Mm_;Ec(~UPuxG7?U!v9ypA_KA|4e-y|7zD92GL!R%~B8oS!@MD%!Aq%*$cJjC)Ua zVNSVYM$iL?<~CQ`n>8O!-EOXOTDmqZXi(dZI-|zO*|5s2z^DOMy0uu~s@+$%T(PBs z*%tYHswCoYLv{Z@NtEHL$CZ!!#CC80D{VTFkmtJ`Ci*2j?s8+uonV))&t}#M+ib=j z1+FIFnrr zQ!G)=T+n3))dX+!KFttLP7#fED(C3ze#c+qC)`a;6Wdj(^Bk6Ey83*>#4clt5?5V! z!Fw-%otA;U%@KLBZ8O`Z?awD9Vmr)h|BWzJWT$o(x7^5= z=JA6UGi^=n=Y%f`OU-f$c%DN0exrT-vfAX1>0IVWl}wgb?<2NRcj};ht$5NjjNoSO zx7nu9`<_~*rxZl6wm2V6`^`Z}G?@_l#wLk7Pe;#3BooRaiZ}arbxOk!^f6cla;G>ug*K=Da{7>w6)aTmt8b8?kT#S^=_-%Bk|;NmTI|y_1WFYgBQ9} z>pL0(7J_%v2l4_7IM8~nVD)fii505lZ|N~T{x>|zLPcLs$DcW)pKnmP7CFL==gIwZ HXK3pG0}rZi literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/style.css b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/style.css new file mode 100644 index 0000000..d90731b --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/style.css @@ -0,0 +1,168 @@ +body { + font-family: "Lucida Grande", Lucida, Verdana, sans-serif; + font-size: 12px; +} + +a { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +table, tr, th, td { + border: 1px solid #AAA; +} + +table { + margin-top: 1em; + width: 100%; +} + +tbody th { + text-align: left; + font-size: 14px; + width: 200px; +} + +th h3 { + margin: 3px; + font-size: 12px; +} + +th span.links { + font-size: 10px; +} + +dt { + font-weight: bold; +} + +tr:hover > th, +tr:hover > td + td { background-color: #FFC; } + +div.test_wrap { + display: -moz-inline-stack; + display: inline-block; + border: 1px solid #CCC; + text-align: center; + vertical-align: top; + min-height: 50px; + margin-right: 5px; + background: white; + position: relative; +} + +div.test_wrap h3 { + text-align: center; + margin: 2px; + font-size: 10px; +} + +div.auto { + display: -moz-inline-stack; + display: inline-block; + border: 1px solid; + width: 30px; + height: 30px; +} + +div.square { + display: -moz-inline-stack; + display: inline-block; + border: 1px solid; + width: 30px; + height: 30px; + background: red; +} + +div.info { + display: none; + position: absolute; + top: 100%; + z-index: 2; + left: 0; + background: white; + padding: 2px; + min-width: 300px; + border: 1px solid; + text-align: left; +} + +div.test_wrap:hover > div.info { + display: block; +} + + +div.vis_test { + display: -moz-inline-stack; + display: inline-block; +} + +div.vis_ref { + display: -moz-inline-stack; + display: inline-block; + border-left: 1px dashed black; + margin-left: 5px; + padding-left: 5px; + vertical-align: top; +} + +p.condition { + font-style: italic; + margin: 2px; + clear: both; +} + +.pass { + background: lime; +} + +.fail { + background: red; +} + +.partial { + background: yellow; +} + +.unknown { + background: #aaa; +} + +.current span { + border-radius: 6px; + -moz-border-radius: 6px; + background: none repeat scroll 0 0 #E6EA69; + color: black; + float: right; + font-size: 8px; + padding: 0 1px; +} + +#intro, #options { + width: 400px; + background: #EEE; + border-radius: 10px; + padding: 5px 10px; + margin: 10px; + float: left; +} + +#intro dt::after { + content: ':'; +} + +#intro dd { + margin-bottom: 1em; +} + +#opt_submit { + display: block; + margin: 10px; +} + +#options label { + display: block; + margin: 5px; +} \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-html-blur.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-html-blur.png new file mode 100644 index 0000000000000000000000000000000000000000..549b29757ac5d9d6bded185957d59e1f87cde560 GIT binary patch literal 1232 zcmV;>1TXuEP)6aGq@<+U+S;3&o7B|Q@bK{I>FMq5?dt04@9*#a{{Hv(_xbtx+uPg4#l`ma_VxAk z{r&yK#Kipk{N&{1?(Xi!#>T+Fz_YWnqobp$s;bx5*P^1Lt*x!W!NKV0==1aQyu7@= zzP{n%;j62w*4EaTn3(J9>)zhp=jZ3j%F5Hz)8pgg+1c5bmzS@vuhP=eprD|)x3}fx z<tHrlzLf-`~H#zun#4oSdA_&d#2mp62G}mX?;0k&(T!-l~cV<~g_AKX`goNi}Iz5w0Urbm1@*l=-xBGni<3L~!sQbIWpO4y)_yVvKf}Bn# z~=eg z?aTxFPQ(ERW)2pvgM;8`B_#lYVF)Ejl3J^4v&riRwdv&nars;zSZ?4ofiERic(_2Wyqc9pI^UzYq!VGNhMxHiA8sm31R0@ z!2UrTjf2@)2@r4EaTxAGWl_l9wZqbR?3` z&DRt~5dC??ec5mgY>@9{x4R{&)LmW)uIj2Zyb@NULbW9{8bV1huAb^5&xgZqvi{W2 z3f3&_`{1f(p#WTUJsJgT=1j0qXx6OO%uBF2c*)cT*LM#tm)2@YlC~NRDwrc+Kk~C9 zYx>jAwvY`w%VsgqoSmPaVJ6UlYO(=4S1MLu@!kHXSo^0*0!|nP&7lBbmSsT?Vgw}1 uK3*J77|i`V!@zk|4;*LPQI7q~{Ldey)1OlB6N@VV0000 + + + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-img.svg.1 b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-img.svg.1 new file mode 100644 index 0000000..c0a867f --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg-img.svg.1 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg_blur.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/svg_blur.png new file mode 100644 index 0000000000000000000000000000000000000000..17cb6e3a8d30481d8f2f03cc5a3a5492a6066676 GIT binary patch literal 3742 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 IM6N<$f{#e}3jhEB literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/table.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/table.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b9b9d772cd19b26d642cdf32188f4eb3c01fc9 GIT binary patch literal 2519 zcmV;|2`Ki7P){(`$m(NvG0@bvuY#h1%< zvZwrU(f5t-&X2#pe}|t3eT239UR}{4_4M>$%c_+;t)q=9wr+Kwf0e0q_3Bm@08zzf zQJ=$oudeRSkQ#-HQrVKH z-hA}HPglORfA2Op4z`5mG^t0@KSZcLm_0Kl&(!bokeUnAJw3-a`EKk%ZXF=M zcL}3$EUC2|JJU<7xGg-{1QUd*FOZQf1o2hq$fPIaS(TkF;Gbo zq*%&cTXQRgge-xIXxSn+D5g}R>M4z_m6WtqV+Qqedyq8wbu}HAK_&CwI>nR(q1c6t zKg$1aaxftOd2~{TXbdko=Wk`ukDh?_oU98a_ZmPPrhqUGt^cWx+xq@kxT^>)?tV+d9 zCjcb!RhF5;`k%}datRrLVma%F6CtlN5O>7XJ;Hdm~=*2E#~Img~I zO97y?T2apFDtl*5uNCx?u;c3wfEOD53UKA$4w&R`?2N!C(TXqjB9ONY^7zhP9@Pf=dpBEM z?*0I1fRFzLkcXn8?{I-gAYrfVjmke~fTIvv39Igoo$jJveGJIF{kMfivl-p> zB*DzD&cC(VY%a~cdFBFQFaCfPG6?HWf1X`zG?y>^;T)hImZIw{Bvr+QV<#`oFE<+X z#re5~)#lCo15t1%w1Sxr-e0BWk*CMvm>K)y>|(Q7zx>A845Vise-J?bE}VSj{QPpg zzBD^ImO?k?+Zvc}hMteR1;Wz&Bq52HWdlr%!i6Rk0UJn%%lFQv^avGRwCo zv0Dm}bdf)OSLSj#{ExsoOqI7;wS}UgGJU6zXI(aKc2 z`M!U7?1kT54^4P^;*qCL-q>+){|Z687fGJfQ#fmp^&_^h-x}^5|hEeSI7MHh@=AClxvTZvMx+qXiN8; zFr!4aRy9?LugTQJ0!7Pa;}RI+tEW{ZRjl(2QgP8)H6{}^O@pwWw-~k&qb?+-mz_1+ zG9V=BmhB_6AM-=WB*dF zww}AE^JdBQcr-=8+^|$CFmyol+B!p$NaeE{I2U%xbY>K~o8_A88&U`}4g<^rLT?PK zBT->4G&9BEuM%CYnd^qc9blN{YPFJ05=xz^lO+S1pI``n^$h|T+xG~# zl%LTQo32emI6%aYz=Imv77@|=hcFcB3r%T#+I~+P7~L&eF|cjeW6d9};8~tnleS{l z?qOlUJj8;hM-UJ*9QFftVR&@(+hFn<;llRv3gYu1Gak4R0+=_4)jfr`7@*^j^0h19 z-;Pabux|iDD_99lDV$`p)D|ms?1|DlLC1v}Zqw^K__Zf*K`OX4CuvuB8352f? z$LAr;I215@5V}pQ-oBzw5CztO-%Kv7*6XWF^YaUhPeb5AWnO>domTY4cP36)c#({R zq~uH6=NTROxq{bz{dx=WH&?Ho8#@W|++$H}UXdr17|tC#a&~(9?0Da3IAC89lNf|` z^}XeK6T#CRffQiILBJe<&~0LMk0skFnf>!+*K8;7_M{_bozv*70wG47#Xg~#b})MI z;6MntV*GR$l9E4de?@jNDMN_FIrkTbF@ED%UOqfG-LicP0$&EiRduP#3C>c5$<`;$lZK)V0{002ovPDHLkV1lU`&#C|b literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/text-shadow1.png b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/text-shadow1.png new file mode 100644 index 0000000000000000000000000000000000000000..47b3ceaf081d5d8a0688b62592dc62e61544f555 GIT binary patch literal 796 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 literal 0 HcmV?d00001 diff --git a/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/xhtml.html b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/xhtml.html new file mode 100644 index 0000000..af4be89 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/caniuse_files/xhtml.html @@ -0,0 +1,14 @@ + + + + + Untitled + +

true

+ + + \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/index.html b/user/themes/ouidade/bower_components/modernizr/test/index.html new file mode 100644 index 0000000..587f0c8 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/index.html @@ -0,0 +1,104 @@ + + + + + Modernizr Test Suite + + + + + + + + + + + + + + + + + + + + + + + + +

Modernizr Test Suite

+

+
+

+ +
    + +
    +
    + + +
    + +
    + + + + +
    JSON.stringify(Modernizr)
    + + Show the Ref Tests from Caniuse and Modernizr + + + + + + + + diff --git a/user/themes/ouidade/bower_components/modernizr/test/js/basic.html b/user/themes/ouidade/bower_components/modernizr/test/js/basic.html new file mode 100644 index 0000000..9f378a9 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/js/basic.html @@ -0,0 +1,65 @@ + + + + + Modernizr Test Suite + + + + + + + + + + + + + + + + + + +

    Modernizr Test Suite

    +

    +
    +

    + +
      + +
      +
      + + +
      + +
      + + + + diff --git a/user/themes/ouidade/bower_components/modernizr/test/js/dumpdata.js b/user/themes/ouidade/bower_components/modernizr/test/js/dumpdata.js new file mode 100644 index 0000000..43c667b --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/js/dumpdata.js @@ -0,0 +1,75 @@ +function dumpModernizr(){ + var str = ''; + dumpModernizr.old = dumpModernizr.old || {}; + + for (var prop in Modernizr) { + + // skip previously done ones. + if (dumpModernizr.old[prop]) continue; + else dumpModernizr.old[prop] = true; + + if (typeof Modernizr[prop] === 'function') continue; + // skip unit test items + if (/^test/.test(prop)) continue; + + if (~TEST.inputs.indexOf(prop)) { + str += '
    1. '+prop+'{}
        '; + for (var field in Modernizr[prop]) { + str += '
      • ' + field + ': ' + Modernizr[prop][field] + '
      • '; + } + str += '
    2. '; + } else { + str += '
    3. ' + prop + ': ' + Modernizr[prop] + '
    4. '; + } + } + return str; +} + + +function grabFeatDetects(){ + // thx github.js + $.getScript('https://api.github.com/repos/Modernizr/Modernizr/git/trees/master?recursive=1&callback=processTree'); +} + + +function processTree(data){ + var filenames = []; + + for (var i = 0; i < data.data.tree.length; i++){ + var file = data.data.tree[i]; + var match = file.path.match(/^feature-detects\/(.*)/); + if (!match) continue; + + var relpath = location.host == "modernizr.github.com" ? + '../modernizr-git/' : '../'; + + filenames.push(relpath + match[0]); + } + + var jqxhrs = filenames.map(function(filename){ + return jQuery.getScript(filename); + }); + + jQuery.when.apply(jQuery, jqxhrs).done(resultsToDOM); + +} + +function resultsToDOM(){ + + var modOutput = document.createElement('div'), + ref = document.getElementById('qunit-testresult') || document.getElementById('qunit-tests'); + + modOutput.className = 'output'; + modOutput.innerHTML = dumpModernizr(); + + ref.parentNode.insertBefore(modOutput, ref); + + // Modernizr object as text + document.getElementsByTagName('textarea')[0].innerHTML = JSON.stringify(Modernizr); + +} + +/* uno */ resultsToDOM(); +/* dos */ grabFeatDetects(); +/* tres */ setTimeout(resultsToDOM, 5e3); +/* quatro */ setTimeout(resultsToDOM, 15e3); diff --git a/user/themes/ouidade/bower_components/modernizr/test/js/lib/detect-global.js b/user/themes/ouidade/bower_components/modernizr/test/js/lib/detect-global.js new file mode 100644 index 0000000..48b4ac2 --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/js/lib/detect-global.js @@ -0,0 +1,153 @@ +// https://github.com/kangax/detect-global + +// tweaked to run without a UI. + +(function () { + function getPropertyDescriptors(object) { + var props = { }; + for (var prop in object) { + + // nerfing for firefox who goes crazy over some objects like sessionStorage + try { + + props[prop] = { + type: typeof object[prop], + value: object[prop] + }; + + } catch(e){ + props[prop] = {}; + } + } + return props; + } + + function getCleanWindow() { + var elIframe = document.createElement('iframe'); + elIframe.style.display = 'none'; + + var ref = document.getElementsByTagName('script')[0]; + ref.parentNode.insertBefore(elIframe, ref); + + elIframe.src = 'about:blank'; + return elIframe.contentWindow; + } + + function appendControl(el, name) { + var elCheckbox = document.createElement('input'); + elCheckbox.type = 'checkbox'; + elCheckbox.checked = true; + elCheckbox.id = '__' + name; + + var elLabel = document.createElement('label'); + elLabel.htmlFor = '__' + name; + elLabel.innerHTML = 'Exclude ' + name + ' properties?'; + elLabel.style.marginLeft = '0.5em'; + + var elWrapper = document.createElement('p'); + elWrapper.style.marginBottom = '0.5em'; + + elWrapper.appendChild(elCheckbox); + elWrapper.appendChild(elLabel); + + el.appendChild(elWrapper); + } + + function appendAnalyze(el) { + var elAnalyze = document.createElement('button'); + elAnalyze.id = '__analyze'; + elAnalyze.innerHTML = 'Analyze'; + elAnalyze.style.marginTop = '1em'; + el.appendChild(elAnalyze); + } + + function appendCancel(el) { + var elCancel = document.createElement('a'); + elCancel.href = '#'; + elCancel.innerHTML = 'Cancel'; + elCancel.style.cssText = 'color:#eee;margin-left:0.5em;'; + elCancel.onclick = function() { + el.parentNode.removeChild(el); + return false; + }; + el.appendChild(elCancel); + } + + function initConfigPopup() { + var el = document.createElement('div'); + + el.style.cssText = 'position:fixed; left:10px; top:10px; width:300px; background:rgba(50,50,50,0.9);' + + '-moz-border-radius:10px; padding:1em; color: #eee; text-align: left;' + + 'font-family: "Helvetica Neue", Verdana, Arial, sans serif; z-index: 99999;'; + + for (var prop in propSets) { + appendControl(el, prop); + } + + appendAnalyze(el); + appendCancel(el); + + var ref = document.getElementsByTagName('script')[0]; + ref.parentNode.insertBefore(el, ref); + } + + function getPropsCount(object) { + var count = 0; + for (var prop in object) { + count++; + } + return count; + } + + function shouldDeleteProperty(propToCheck) { + for (var prop in propSets) { + var elCheckbox = document.getElementById('__' + prop); + var isPropInSet = propSets[prop].indexOf(propToCheck) > -1; + if (isPropInSet && (elCheckbox ? elCheckbox.checked : true) ) { + return true; + } + } + } + + function analyze() { + var global = (function(){ return this; })(), + globalProps = getPropertyDescriptors(global), + cleanWindow = getCleanWindow(); + + for (var prop in cleanWindow) { + if (globalProps[prop]) { + delete globalProps[prop]; + } + } + for (var prop in globalProps) { + if (shouldDeleteProperty(prop)) { + delete globalProps[prop]; + } + } + + window.__globalsCount = getPropsCount(globalProps); + window.__globals = globalProps; + + window.console && console.log('Total number of global properties: ' + __globalsCount); + window.console && console.dir(__globals); + } + + var propSets = { + 'Prototype': '$$ $A $F $H $R $break $continue $w Abstract Ajax Class Enumerable Element Field Form ' + + 'Hash Insertion ObjectRange PeriodicalExecuter Position Prototype Selector Template Toggle Try'.split(' '), + + 'Scriptaculous': 'Autocompleter Builder Control Draggable Draggables Droppables Effect Sortable SortableObserver Sound Scriptaculous'.split(' '), + 'Firebug': 'loadFirebugConsole console _getFirebugConsoleElement _FirebugConsole _FirebugCommandLine _firebug'.split(' '), + 'Mozilla': 'Components XPCNativeWrapper XPCSafeJSObjectWrapper getInterface netscape GetWeakReference GeckoActiveXObject'.split(' '), + 'GoogleAnalytics': 'gaJsHost gaGlobal _gat _gaq pageTracker'.split(' '), + 'lazyGlobals': 'onhashchange'.split(' ') + }; + + // initConfigPopup(); // disable because we're going UI-less. + + var analyzeElem = document.getElementById('__analyze'); + analyzeElem && (analyzeElem.onclick = analyze); + + analyze(); // and assign total added globals to window.__globalsCount + +})(); \ No newline at end of file diff --git a/user/themes/ouidade/bower_components/modernizr/test/js/lib/jquery-1.7b2.js b/user/themes/ouidade/bower_components/modernizr/test/js/lib/jquery-1.7b2.js new file mode 100644 index 0000000..98c6d0d --- /dev/null +++ b/user/themes/ouidade/bower_components/modernizr/test/js/lib/jquery-1.7b2.js @@ -0,0 +1,9279 @@ +/*! + * jQuery JavaScript Library v1.7b2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Oct 13 21:12:55 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7b2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return obj != null && rdigit.test( obj ) && !isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery as an AMD module, but only for AMD loaders that +// understand the issues with loading multiple versions of jQuery +// in a page that all might call define(). The loader will indicate +// they have special allowances for multiple jQuery versions by +// specifying define.amd.jQuery = true. Register as a named module, +// since jQuery can be concatenated with other files that may use define, +// but not use a proper concatenation script that understands anonymous +// AMD modules. A named AMD is safest and most robust way to register. +// Lowercase jquery is used because AMD module names are derived from +// file names, and jQuery is normally delivered in a lowercase file name. +if ( typeof define === "function" && define.amd && define.amd.jQuery ) { + define( "jquery", [], function () { return jQuery; } ); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + documentElement = document.documentElement, + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + testElementParent, + testElement, + testElementStyle, + tds, + events, + eventName, + i, + isSupported, + offsetSupport; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
      a"; + + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure unknown elements (like HTML5 elems) are handled appropriately + unknownElems: !!div.getElementsByTagName( "nav" ).length, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + // We don't want to do body-related feature tests on frameset + // documents, which lack a body. So we use + // document.getElementsByTagName("body")[0], which is undefined in + // frameset documents, while document.body isn’t. (7398) + body = document.getElementsByTagName("body")[ 0 ]; + // We use our own, invisible, body unless the body is already present + // in which case we use a div (#9239) + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + jQuery.extend( testElementStyle, { + position: "absolute", + left: "-999px", + top: "-999px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
      "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "
      t
      "; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + testElement.innerHTML = ""; + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Determine fixed-position support early + testElement.style.position = "static"; + testElement.style.top = "0px"; + testElement.style.marginTop = "1px"; + offsetSupport = (function( body, container ) { + + var outer, inner, table, td, supports, + bodyMarginTop = parseFloat( body.style.marginTop ) || 0, + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;", + style = "style='" + ptlm + "border:5px solid #000;padding:0;'", + html = "
      " + + "" + + "
      "; + + container.style.cssText = ptlm + "border:0;visibility:hidden"; + + container.innerHTML = html; + body.insertBefore( container, body.firstChild ); + outer = container.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + supports = { + doesNotAddBorder: (inner.offsetTop !== 5), + doesAddBorderForTableAndCells: (td.offsetTop === 5) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + supports.supportsFixedPosition = (inner.offsetTop === 20 || inner.offsetTop === 15); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + supports.subtractsBorderForOverflowNotVisible = (inner.offsetTop === -5); + supports.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); + + return supports; + + })( testElement, div ); + + jQuery.extend( support, offsetSupport ); + testElementParent.removeChild( testElement ); + + // Null connected elements to avoid leaks in IE + testElement = fragment = select = opt = body = marginDiv = div = input = null; + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support space separated names + if ( jQuery.isArray( name ) ) { + name = name; + } else if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = (type || "fx") + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + runner = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", runner ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, runner ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, runner ) { + var timeout = setTimeout( next, time ); + runner.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = (value || "").split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || (rboolean.test( name ) ? boolHook : nodeHook); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( elem.nodeType === 1 ) { + attrNames = (value || "").split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ].toLowerCase(); + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( name ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && (fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return (ret.nodeValue = value + ""); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rquickIs = /^([\w\-]+)?(?:#([\w\-]+))?(?:\.([\w\-]+))?(?:\[([\w+\-]+)=["']?([\w\-]*)["']?\])?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 4 5 + // [ _, tag, id, class, attrName, attrValue ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "\\b" + quick[3] + "\\b" ); + } + return quick; + }, + quickIs = function( elem, m ) { + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || elem.id === m[2]) && + (!m[3] || m[3].test( elem.className )) && + (!m[4] || elem.getAttribute( m[4] ) == m[5]) + ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.replace( rhoverHack, "mouseover$1 mouseout$1" ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = (tns[2] || "").split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + namespace: namespaces.join(".") + }, handleObjIn ); + + // Delegated event; pre-analyze selector so it's processed quickly on event dispatch + if ( selector ) { + handleObj.quick = quickParse( selector ); + if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) { + handleObj.isPositional = true; + } + } + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // For removal, types can be an Event object + if ( types && types.type && types.handler ) { + handler = types.handler; + types = types.type; + selector = types.selector; + } + + // Once for each type.namespace in types; type may be omitted + types = (types || "").replace( rhoverHack, "mouseover$1 mouseout$1" ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + namespaces = namespaces? "." + namespaces : ""; + for ( j in events ) { + jQuery.event.remove( elem, j + namespaces, handler, selector ); + } + return; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Only need to loop for special events or selective removal + if ( handler || namespaces || selector || special.remove ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( !handler || handler.guid === handleObj.guid ) { + if ( !namespaces || namespaces.test( handleObj.namespace ) ) { + if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + } + } + } else { + // Removing all events + eventType.length = 0; + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + } + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + event.stopPropagation(); + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + old = null; + for ( cur = elem.parentNode; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length; i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = (jQuery._data( cur, "events" ) || {})[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) ) { + handle.apply( cur, data ); + } + + if ( event.isPropagationStopped() ) { + break; + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.call( elem.ownerDocument, event, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + handle: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + handlerQueue = [], + i, cur, selMatch, matches, handleObj, sel, hit, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + hit = selMatch[ sel ]; + + if ( handleObj.isPositional ) { + // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/ + hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0; + } else if ( hit === undefined ) { + hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) ); + } + if ( hit ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Copy the remaining (bound) handlers in case they're changed + handlers = handlers.slice( delegateCount ); + + // Run delegates first; they may want to stop propagation beneath us + event.delegateTarget = this; + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + dispatch( matched.elem, event, matched.matches, args ); + } + delete event.delegateTarget; + + // Run non-delegated handlers for this level + if ( handlers.length ) { + dispatch( this, event, handlers, args ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement layerX layerY offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + focus: { + delegateType: "focusin", + noBubble: true + }, + blur: { + delegateType: "focusout", + noBubble: true + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.handle.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Run jQuery handler functions; called from jQuery.event.handle +function dispatch( target, event, handlers, args ) { + var run_all = !event.exclusive && !event.namespace, + specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle, + j, handleObj, ret; + + event.currentTarget = target; + for ( j = 0; j < handlers.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = handlers[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( specialHandle || handleObj.handler ).apply( target, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } +} + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + oldType, ret; + + // For a real mouseover/out, always call the handler; for + // mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) { + oldType = event.type; + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = oldType; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // Form was submitted, bubble the event up the tree + if ( this.parentNode ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + jQuery.event.remove( event.delegateTarget || this, event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault ) { + // ( event ) native or jQuery.Event + return this.off( types.type, types.handler, types.selector ); + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

      "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
      "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var nodeNames = ( + "abbr article aside audio canvas datalist details figcaption figure footer " + + "header hgroup mark meter nav output progress section summary time video" + ).split( " " ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( nodeNames.length ) { + safeFrag.createElement( + nodeNames.pop() + ); + } + } + return safeFrag; +} + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
      ", "
      " ], + thead: [ 1, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + col: [ 2, "", "
      " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + + + + diff --git a/vendor/filp/whoops/src/Whoops/Run.php b/vendor/filp/whoops/src/Whoops/Run.php new file mode 100644 index 0000000..e23d606 --- /dev/null +++ b/vendor/filp/whoops/src/Whoops/Run.php @@ -0,0 +1,408 @@ + + */ + +namespace Whoops; + +use Exception; +use InvalidArgumentException; +use Whoops\Exception\ErrorException; +use Whoops\Exception\Inspector; +use Whoops\Handler\CallbackHandler; +use Whoops\Handler\Handler; +use Whoops\Handler\HandlerInterface; + +class Run +{ + const EXCEPTION_HANDLER = "handleException"; + const ERROR_HANDLER = "handleError"; + const SHUTDOWN_HANDLER = "handleShutdown"; + + protected $isRegistered; + protected $allowQuit = true; + protected $sendOutput = true; + + /** + * @var integer|false + */ + protected $sendHttpCode = 500; + + /** + * @var HandlerInterface[] + */ + protected $handlerStack = array(); + + protected $silencedPatterns = array(); + + /** + * Pushes a handler to the end of the stack + * + * @throws InvalidArgumentException If argument is not callable or instance of HandlerInterface + * @param Callable|HandlerInterface $handler + * @return Run + */ + public function pushHandler($handler) + { + if (is_callable($handler)) { + $handler = new CallbackHandler($handler); + } + + if (!$handler instanceof HandlerInterface) { + throw new InvalidArgumentException( + "Argument to " . __METHOD__ . " must be a callable, or instance of" + . "Whoops\\Handler\\HandlerInterface" + ); + } + + $this->handlerStack[] = $handler; + return $this; + } + + /** + * Removes the last handler in the stack and returns it. + * Returns null if there"s nothing else to pop. + * @return null|HandlerInterface + */ + public function popHandler() + { + return array_pop($this->handlerStack); + } + + /** + * Returns an array with all handlers, in the + * order they were added to the stack. + * @return array + */ + public function getHandlers() + { + return $this->handlerStack; + } + + /** + * Clears all handlers in the handlerStack, including + * the default PrettyPage handler. + * @return Run + */ + public function clearHandlers() + { + $this->handlerStack = array(); + return $this; + } + + /** + * @param Exception $exception + * @return Inspector + */ + protected function getInspector(Exception $exception) + { + return new Inspector($exception); + } + + /** + * Registers this instance as an error handler. + * @return Run + */ + public function register() + { + if (!$this->isRegistered) { + // Workaround PHP bug 42098 + // https://bugs.php.net/bug.php?id=42098 + class_exists("\\Whoops\\Exception\\ErrorException"); + class_exists("\\Whoops\\Exception\\FrameCollection"); + class_exists("\\Whoops\\Exception\\Frame"); + class_exists("\\Whoops\\Exception\\Inspector"); + + set_error_handler(array($this, self::ERROR_HANDLER)); + set_exception_handler(array($this, self::EXCEPTION_HANDLER)); + register_shutdown_function(array($this, self::SHUTDOWN_HANDLER)); + + $this->isRegistered = true; + } + + return $this; + } + + /** + * Unregisters all handlers registered by this Whoops\Run instance + * @return Run + */ + public function unregister() + { + if ($this->isRegistered) { + restore_exception_handler(); + restore_error_handler(); + + $this->isRegistered = false; + } + + return $this; + } + + /** + * Should Whoops allow Handlers to force the script to quit? + * @param bool|int $exit + * @return bool + */ + public function allowQuit($exit = null) + { + if (func_num_args() == 0) { + return $this->allowQuit; + } + + return $this->allowQuit = (bool) $exit; + } + + /** + * Silence particular errors in particular files + * @param array|string $patterns List or a single regex pattern to match + * @param int $levels Defaults to E_STRICT | E_DEPRECATED + * @return \Whoops\Run + */ + public function silenceErrorsInPaths($patterns, $levels = 10240) + { + $this->silencedPatterns = array_merge( + $this->silencedPatterns, + array_map( + function ($pattern) use ($levels) { + return array( + "pattern" => $pattern, + "levels" => $levels, + ); + }, + (array) $patterns + ) + ); + return $this; + } + + /* + * Should Whoops send HTTP error code to the browser if possible? + * Whoops will by default send HTTP code 500, but you may wish to + * use 502, 503, or another 5xx family code. + * + * @param bool|int $code + * @return int|false + */ + public function sendHttpCode($code = null) + { + if (func_num_args() == 0) { + return $this->sendHttpCode; + } + + if (!$code) { + return $this->sendHttpCode = false; + } + + if ($code === true) { + $code = 500; + } + + if ($code < 400 || 600 <= $code) { + throw new InvalidArgumentException( + "Invalid status code '$code', must be 4xx or 5xx" + ); + } + + return $this->sendHttpCode = $code; + } + + /** + * Should Whoops push output directly to the client? + * If this is false, output will be returned by handleException + * @param bool|int $send + * @return bool + */ + public function writeToOutput($send = null) + { + if (func_num_args() == 0) { + return $this->sendOutput; + } + + return $this->sendOutput = (bool) $send; + } + + /** + * Handles an exception, ultimately generating a Whoops error + * page. + * + * @param Exception $exception + * @return string Output generated by handlers + */ + public function handleException(Exception $exception) + { + // Walk the registered handlers in the reverse order + // they were registered, and pass off the exception + $inspector = $this->getInspector($exception); + + // Capture output produced while handling the exception, + // we might want to send it straight away to the client, + // or return it silently. + ob_start(); + + // Just in case there are no handlers: + $handlerResponse = null; + + foreach (array_reverse($this->handlerStack) as $handler) { + $handler->setRun($this); + $handler->setInspector($inspector); + $handler->setException($exception); + + // The HandlerInterface does not require an Exception passed to handle() + // and neither of our bundled handlers use it. + // However, 3rd party handlers may have already relied on this parameter, + // and removing it would be possibly breaking for users. + $handlerResponse = $handler->handle($exception); + + if (in_array($handlerResponse, array(Handler::LAST_HANDLER, Handler::QUIT))) { + // The Handler has handled the exception in some way, and + // wishes to quit execution (Handler::QUIT), or skip any + // other handlers (Handler::LAST_HANDLER). If $this->allowQuit + // is false, Handler::QUIT behaves like Handler::LAST_HANDLER + break; + } + } + + $willQuit = $handlerResponse == Handler::QUIT && $this->allowQuit(); + + $output = ob_get_clean(); + + // If we're allowed to, send output generated by handlers directly + // to the output, otherwise, and if the script doesn't quit, return + // it so that it may be used by the caller + if ($this->writeToOutput()) { + // @todo Might be able to clean this up a bit better + // If we're going to quit execution, cleanup all other output + // buffers before sending our own output: + if ($willQuit) { + while (ob_get_level() > 0) { + ob_end_clean(); + } + } + + $this->writeToOutputNow($output); + } + + if ($willQuit) { + flush(); // HHVM fix for https://github.com/facebook/hhvm/issues/4055 + exit(1); + } + + return $output; + } + + /** + * Converts generic PHP errors to \ErrorException + * instances, before passing them off to be handled. + * + * This method MUST be compatible with set_error_handler. + * + * @param int $level + * @param string $message + * @param string $file + * @param int $line + * + * @return bool + * @throws ErrorException + */ + public function handleError($level, $message, $file = null, $line = null) + { + if ($level & error_reporting()) { + foreach ($this->silencedPatterns as $entry) { + $pathMatches = (bool) preg_match($entry["pattern"], $file); + $levelMatches = $level & $entry["levels"]; + if ($pathMatches && $levelMatches) { + // Ignore the error, abort handling + return true; + } + } + + // XXX we pass $level for the "code" param only for BC reasons. + // see https://github.com/filp/whoops/issues/267 + $exception = new ErrorException($message, /*code*/ $level, /*severity*/ $level, $file, $line); + if ($this->canThrowExceptions) { + throw $exception; + } else { + $this->handleException($exception); + } + // Do not propagate errors which were already handled by Whoops. + return true; + } + + // Propagate error to the next handler, allows error_get_last() to + // work on silenced errors. + return false; + } + + /** + * Special case to deal with Fatal errors and the like. + */ + public function handleShutdown() + { + // If we reached this step, we are in shutdown handler. + // An exception thrown in a shutdown handler will not be propagated + // to the exception handler. Pass that information along. + $this->canThrowExceptions = false; + + $error = error_get_last(); + if ($error && $this->isLevelFatal($error['type'])) { + // If there was a fatal error, + // it was not handled in handleError yet. + $this->handleError( + $error['type'], + $error['message'], + $error['file'], + $error['line'] + ); + } + } + + /** + * In certain scenarios, like in shutdown handler, we can not throw exceptions + * @var bool + */ + private $canThrowExceptions = true; + + /** + * Echo something to the browser + * @param string $output + * @return $this + */ + private function writeToOutputNow($output) + { + if ($this->sendHttpCode() && \Whoops\Util\Misc::canSendHeaders()) { + $httpCode = $this->sendHttpCode(); + + if (function_exists('http_response_code')) { + http_response_code($httpCode); + } else { + // http_response_code is added in 5.4. + // For compatibility with 5.3 we use the third argument in header call + // First argument must be a real header. + // If it is empty, PHP will ignore the third argument. + // If it is invalid, such as a single space, Apache will handle it well, + // but the PHP development server will hang. + // Setting a full status line would require us to hardcode + // string values for all different status code, and detect the protocol. + // which is an extra error-prone complexity. + header('X-Ignore-This: 1', true, $httpCode); + } + } + + echo $output; + + return $this; + } + + private static function isLevelFatal($level) + { + $errors = E_ERROR; + $errors |= E_PARSE; + $errors |= E_CORE_ERROR; + $errors |= E_CORE_WARNING; + $errors |= E_COMPILE_ERROR; + $errors |= E_COMPILE_WARNING; + return ($level & $errors) > 0; + } +} diff --git a/vendor/filp/whoops/src/Whoops/Util/Misc.php b/vendor/filp/whoops/src/Whoops/Util/Misc.php new file mode 100644 index 0000000..d38dbbf --- /dev/null +++ b/vendor/filp/whoops/src/Whoops/Util/Misc.php @@ -0,0 +1,44 @@ + + */ + +namespace Whoops\Util; + +class Misc +{ + /** + * Can we at this point in time send HTTP headers? + * + * Currently this checks if we are even serving an HTTP request, + * as opposed to running from a command line. + * + * If we are serving an HTTP request, we check if it's not too late. + * + * @return bool + */ + public static function canSendHeaders() + { + return isset($_SERVER["REQUEST_URI"]) && !headers_sent(); + } + + /** + * Translate ErrorException code into the represented constant. + * + * @param int $error_code + * @return string + */ + public static function translateErrorCode($error_code) + { + $constants = get_defined_constants(true); + if (array_key_exists('Core' , $constants)) { + foreach ($constants['Core'] as $constant => $value) { + if (substr($constant, 0, 2) == 'E_' && $value == $error_code) { + return $constant; + } + } + } + return "E_UNKNOWN"; + } +} diff --git a/vendor/filp/whoops/src/Whoops/Util/TemplateHelper.php b/vendor/filp/whoops/src/Whoops/Util/TemplateHelper.php new file mode 100644 index 0000000..71690de --- /dev/null +++ b/vendor/filp/whoops/src/Whoops/Util/TemplateHelper.php @@ -0,0 +1,154 @@ + + */ + +namespace Whoops\Util; + +/** + * Exposes useful tools for working with/in templates + */ +class TemplateHelper +{ + /** + * An array of variables to be passed to all templates + * @var array + */ + private $variables = array(); + + /** + * Escapes a string for output in an HTML document + * + * @param string $raw + * @return string + */ + public function escape($raw) + { + $flags = ENT_QUOTES; + + // HHVM has all constants defined, but only ENT_IGNORE + // works at the moment + if (defined("ENT_SUBSTITUTE") && !defined("HHVM_VERSION")) { + $flags |= ENT_SUBSTITUTE; + } else { + // This is for 5.3. + // The documentation warns of a potential security issue, + // but it seems it does not apply in our case, because + // we do not blacklist anything anywhere. + $flags |= ENT_IGNORE; + } + + return htmlspecialchars($raw, $flags, "UTF-8"); + } + + /** + * Escapes a string for output in an HTML document, but preserves + * URIs within it, and converts them to clickable anchor elements. + * + * @param string $raw + * @return string + */ + public function escapeButPreserveUris($raw) + { + $escaped = $this->escape($raw); + return preg_replace( + "@([A-z]+?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@", + "$1", $escaped + ); + } + + /** + * Convert a string to a slug version of itself + * + * @param string $original + * @return string + */ + public function slug($original) + { + $slug = str_replace(" ", "-", $original); + $slug = preg_replace('/[^\w\d\-\_]/i', '', $slug); + return strtolower($slug); + } + + /** + * Given a template path, render it within its own scope. This + * method also accepts an array of additional variables to be + * passed to the template. + * + * @param string $template + * @param array $additionalVariables + */ + public function render($template, array $additionalVariables = null) + { + $variables = $this->getVariables(); + + // Pass the helper to the template: + $variables["tpl"] = $this; + + if ($additionalVariables !== null) { + $variables = array_replace($variables, $additionalVariables); + } + + call_user_func(function () { + extract(func_get_arg(1)); + require func_get_arg(0); + }, $template, $variables); + } + + /** + * Sets the variables to be passed to all templates rendered + * by this template helper. + * + * @param array $variables + */ + public function setVariables(array $variables) + { + $this->variables = $variables; + } + + /** + * Sets a single template variable, by its name: + * + * @param string $variableName + * @param mixd $variableValue + */ + public function setVariable($variableName, $variableValue) + { + $this->variables[$variableName] = $variableValue; + } + + /** + * Gets a single template variable, by its name, or + * $defaultValue if the variable does not exist + * + * @param string $variableName + * @param mixed $defaultValue + * @return mixed + */ + public function getVariable($variableName, $defaultValue = null) + { + return isset($this->variables[$variableName]) ? + $this->variables[$variableName] : $defaultValue; + } + + /** + * Unsets a single template variable, by its name + * + * @param string $variableName + */ + public function delVariable($variableName) + { + unset($this->variables[$variableName]); + } + + /** + * Returns all variables for this helper + * + * @return array + */ + public function getVariables() + { + return $this->variables; + } +} diff --git a/vendor/filp/whoops/src/deprecated/Zend/ExceptionStrategy.php b/vendor/filp/whoops/src/deprecated/Zend/ExceptionStrategy.php new file mode 100644 index 0000000..58c72f0 --- /dev/null +++ b/vendor/filp/whoops/src/deprecated/Zend/ExceptionStrategy.php @@ -0,0 +1,63 @@ + + */ + +namespace Whoops\Provider\Zend; + +use Whoops\Run; +use Zend\Http\Response; +use Zend\Mvc\Application; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\View\Http\ExceptionStrategy as BaseExceptionStrategy; + +/** + * @deprecated Use https://github.com/ghislainf/zf2-whoops + */ +class ExceptionStrategy extends BaseExceptionStrategy +{ + protected $run; + + public function __construct(Run $run) + { + $this->run = $run; + return $this; + } + + public function prepareExceptionViewModel(MvcEvent $event) + { + // Do nothing if no error in the event + $error = $event->getError(); + if (empty($error)) { + return; + } + + // Do nothing if the result is a response object + $result = $event->getResult(); + if ($result instanceof Response) { + return; + } + + switch ($error) { + case Application::ERROR_CONTROLLER_NOT_FOUND: + case Application::ERROR_CONTROLLER_INVALID: + case Application::ERROR_ROUTER_NO_MATCH: + // Specifically not handling these + return; + + case Application::ERROR_EXCEPTION: + default: + $exception = $event->getParam('exception'); + if ($exception) { + $response = $event->getResponse(); + if (!$response || $response->getStatusCode() === 200) { + header('HTTP/1.0 500 Internal Server Error', true, 500); + } + ob_clean(); + $this->run->handleException($event->getParam('exception')); + } + break; + } + } +} diff --git a/vendor/filp/whoops/src/deprecated/Zend/Module.php b/vendor/filp/whoops/src/deprecated/Zend/Module.php new file mode 100644 index 0000000..545f8a5 --- /dev/null +++ b/vendor/filp/whoops/src/deprecated/Zend/Module.php @@ -0,0 +1,107 @@ + + * + * The Whoops directory should be added as a module to ZF2 (/vendor/Whoops) + * + * Whoops must be added as the first module + * For example: + * 'modules' => array( + * 'Whoops', + * 'Application', + * ), + * + * This file should be moved next to Whoops/Run.php (/vendor/Whoops/Module.php) + * + */ + +namespace Whoops; + +use Whoops\Handler\JsonResponseHandler; +use Whoops\Handler\PrettyPageHandler; +use Whoops\Provider\Zend\ExceptionStrategy; +use Whoops\Provider\Zend\RouteNotFoundStrategy; +use Zend\Console\Request as ConsoleRequest; +use Zend\EventManager\EventInterface; + +/** + * @deprecated Use https://github.com/ghislainf/zf2-whoops + */ +class Module +{ + protected $run; + + public function onBootstrap(EventInterface $event) + { + $prettyPageHandler = new PrettyPageHandler(); + + // Set editor + $config = $event->getApplication()->getServiceManager()->get('Config'); + if (isset($config['view_manager']['editor'])) { + $prettyPageHandler->setEditor($config['view_manager']['editor']); + } + + $this->run = new Run(); + $this->run->register(); + $this->run->pushHandler($prettyPageHandler); + + $this->attachListeners($event); + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + private function attachListeners(EventInterface $event) + { + $request = $event->getRequest(); + $application = $event->getApplication(); + $services = $application->getServiceManager(); + $events = $application->getEventManager(); + $config = $services->get('Config'); + + //Display exceptions based on configuration and console mode + if ($request instanceof ConsoleRequest || empty($config['view_manager']['display_exceptions'])) { + return; + } + + $jsonHandler = new JsonResponseHandler(); + + if (!empty($config['view_manager']['json_exceptions']['show_trace'])) { + //Add trace to the JSON output + $jsonHandler->addTraceToOutput(true); + } + + if (!empty($config['view_manager']['json_exceptions']['ajax_only'])) { + //Only return JSON response for AJAX requests + $jsonHandler->onlyForAjaxRequests(true); + } + + if (!empty($config['view_manager']['json_exceptions']['display'])) { + //Turn on JSON handler + $this->run->pushHandler($jsonHandler); + } + + //Attach the Whoops ExceptionStrategy + $exceptionStrategy = new ExceptionStrategy($this->run); + $exceptionStrategy->attach($events); + + //Attach the Whoops RouteNotFoundStrategy + $routeNotFoundStrategy = new RouteNotFoundStrategy($this->run); + $routeNotFoundStrategy->attach($events); + + //Detach default ExceptionStrategy + $services->get('Zend\Mvc\View\Http\ExceptionStrategy')->detach($events); + + //Detach default RouteNotFoundStrategy + $services->get('Zend\Mvc\View\Http\RouteNotFoundStrategy')->detach($events); + } +} diff --git a/vendor/filp/whoops/src/deprecated/Zend/RouteNotFoundStrategy.php b/vendor/filp/whoops/src/deprecated/Zend/RouteNotFoundStrategy.php new file mode 100644 index 0000000..f1eb7ea --- /dev/null +++ b/vendor/filp/whoops/src/deprecated/Zend/RouteNotFoundStrategy.php @@ -0,0 +1,67 @@ + + */ + +namespace Whoops\Provider\Zend; + +use Whoops\Run; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\View\Http\RouteNotFoundStrategy as BaseRouteNotFoundStrategy; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ViewModel; + +/** + * @deprecated Use https://github.com/ghislainf/zf2-whoops + */ +class RouteNotFoundStrategy extends BaseRouteNotFoundStrategy +{ + protected $run; + + public function __construct(Run $run) + { + $this->run = $run; + } + + public function prepareNotFoundViewModel(MvcEvent $e) + { + $vars = $e->getResult(); + if ($vars instanceof Response) { + // Already have a response as the result + return; + } + + $response = $e->getResponse(); + if ($response->getStatusCode() != 404) { + // Only handle 404 responses + return; + } + + if (!$vars instanceof ViewModel) { + $model = new ViewModel(); + if (is_string($vars)) { + $model->setVariable('message', $vars); + } else { + $model->setVariable('message', 'Page not found.'); + } + } else { + $model = $vars; + if ($model->getVariable('message') === null) { + $model->setVariable('message', 'Page not found.'); + } + } + // If displaying reasons, inject the reason + $this->injectNotFoundReason($model, $e); + + // If displaying exceptions, inject + $this->injectException($model, $e); + + // Inject controller if we're displaying either the reason or the exception + $this->injectController($model, $e); + + ob_clean(); + + throw new \Exception($model->getVariable('message') . ' ' . $model->getVariable('reason')); + } +} diff --git a/vendor/filp/whoops/src/deprecated/Zend/module.config.example.php b/vendor/filp/whoops/src/deprecated/Zend/module.config.example.php new file mode 100644 index 0000000..42be30d --- /dev/null +++ b/vendor/filp/whoops/src/deprecated/Zend/module.config.example.php @@ -0,0 +1,20 @@ + + * + * Example controller configuration + */ + +return array( + 'view_manager' => array( + 'editor' => 'sublime', + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'json_exceptions' => array( + 'display' => true, + 'ajax_only' => true, + 'show_trace' => true, + ), + ), +); diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php b/vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php new file mode 100644 index 0000000..5ab7796 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php @@ -0,0 +1,58 @@ +source = $source; + + return $this; + } + + /** + * @inheritdoc + */ + public function getResource() + { + return $this->resource; + } + + /** + * Does this adapter supports the given type ? + */ + protected function supports($type) + { + return false; + } + + /** + * Converts the image to true color + */ + protected function convertToTrueColor() + { + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php b/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php new file mode 100644 index 0000000..85d7f27 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php @@ -0,0 +1,388 @@ + + */ +interface AdapterInterface{ + /** + * set the image source for the adapter + * + * @param Source $source + * @return $this + */ + public function setSource(Source $source); + + /** + * get the raw resource + * + * @return resource + */ + public function getResource(); + + /** + * Gets the name of the adapter + * + * @return string + */ + public function getName(); + + /** + * Image width + * + * @return int + */ + public function width(); + + /** + * Image height + * + * @return int + */ + public function height(); + + /** + * Init the resource + * + * @return $this + */ + public function init(); + + /** + * Save the image as a gif + * + * @return $this + */ + public function saveGif($file); + + /** + * Save the image as a png + * + * @return $this + */ + public function savePng($file); + + /** + * Save the image as a jpeg + * + * @return $this + */ + public function saveJpeg($file, $quality); + + /** + * Works as resize() excepts that the layout will be cropped + * + * @param int $width the width + * @param int $height the height + * @param int $background the background + * + * @return $this + */ + public function cropResize($width = null, $height = null, $background=0xffffff); + + + /** + * Resize the image preserving scale. Can enlarge it. + * + * @param int $width the width + * @param int $height the height + * @param int $background the background + * @param boolean $crop + * + * @return $this + */ + public function scaleResize($width = null, $height = null, $background=0xffffff, $crop = false); + + /** + * Resizes the image. It will never be enlarged. + * + * @param int $width the width + * @param int $height the height + * @param int $background the background + * @param boolean $force + * @param boolean $rescale + * @param boolean $crop + * + * @return $this + */ + public function resize($width = null, $height = null, $background = 0xffffff, $force = false, $rescale = false, $crop = false); + + /** + * Crops the image + * + * @param int $x the top-left x position of the crop box + * @param int $y the top-left y position of the crop box + * @param int $width the width of the crop box + * @param int $height the height of the crop box + * + * @return $this + */ + public function crop($x, $y, $width, $height); + + /** + * enable progressive image loading + * + * @return $this + */ + public function enableProgressive(); + + /** + * Resizes the image forcing the destination to have exactly the + * given width and the height + * + * @param int $width the width + * @param int $height the height + * @param int $background the background + * + * @return $this + */ + public function forceResize($width = null, $height = null, $background = 0xffffff); + + /** + * Perform a zoom crop of the image to desired width and height + * + * @param integer $width Desired width + * @param integer $height Desired height + * @param int $background + * + * @return $this + */ + public function zoomCrop($width, $height, $background = 0xffffff); + + + /** + * Fills the image background to $bg if the image is transparent + * + * @param int $background background color + * + * @return $this + */ + public function fillBackground($background = 0xffffff); + + + /** + * Negates the image + * + * @return $this + */ + public function negate(); + + /** + * Changes the brightness of the image + * + * @param int $brightness the brightness + * + * @return $this + */ + public function brightness($brightness); + + /** + * Contrasts the image + * + * @param int $contrast the contrast [-100, 100] + * + * @return $this + */ + public function contrast($contrast); + + /** + * Apply a grayscale level effect on the image + * + * @return $this + */ + public function grayscale(); + + /** + * Emboss the image + * + * @return $this + */ + public function emboss(); + + /** + * Smooth the image + * + * @param int $p value between [-10,10] + * + * @return $this + */ + public function smooth($p); + + /** + * Sharps the image + * + * @return $this + */ + public function sharp(); + + /** + * Edges the image + * + * @return $this + */ + public function edge(); + + /** + * Colorize the image + * + * @param int $red value in range [-255, 255] + * @param int $green value in range [-255, 255] + * @param int $blue value in range [-255, 255] + * + * @return $this + */ + public function colorize($red, $green, $blue); + + /** + * apply sepia to the image + * + * @return $this + */ + public function sepia(); + + /** + * Merge with another image + * + * @param Image $other + * @param int $x + * @param int $y + * @param int $width + * @param int $height + * + * @return $this + */ + public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null); + + /** + * Rotate the image + * + * @param float $angle + * @param int $background + * + * @return $this + */ + public function rotate($angle, $background = 0xffffff); + + /** + * Fills the image + * + * @param int $color + * @param int $x + * @param int $y + * + * @return $this + */ + public function fill($color = 0xffffff, $x = 0, $y = 0); + + /** + * write text to the image + * + * @param string $font + * @param string $text + * @param int $x + * @param int $y + * @param int $size + * @param int $angle + * @param int $color + * @param string $align + */ + public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left'); + + /** + * Draws a rectangle + * + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + * @param int $color + * @param bool $filled + * + * @return $this + */ + public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false); + + /** + * Draws a rounded rectangle + * + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + * @param int $radius + * @param int $color + * @param bool $filled + * + * @return $this + */ + public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false); + + /** + * Draws a line + * + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + * @param int $color + * + * @return $this + */ + public function line($x1, $y1, $x2, $y2, $color = 0x000000); + + /** + * Draws an ellipse + * + * @param int $cx + * @param int $cy + * @param int $width + * @param int $height + * @param int $color + * @param bool $filled + * + * @return $this + */ + public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false); + + /** + * Draws a circle + * + * @param int $cx + * @param int $cy + * @param int $r + * @param int $color + * @param bool $filled + * + * @return $this + */ + public function circle($cx, $cy, $r, $color = 0x000000, $filled = false); + + /** + * Draws a polygon + * + * @param array $points + * @param int $color + * @param bool $filled + * + * @return $this + */ + public function polygon(array $points, $color, $filled = false); + + /** + * Flips the image + * + * @param int $flipVertical + * @param int $flipHorizontal + * + * @return $this + */ + public function flip($flipVertical, $flipHorizontal); +} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php b/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php new file mode 100644 index 0000000..c0f125a --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php @@ -0,0 +1,351 @@ +width() / $this->height(); + $newRatio = $width / $height; + + // Compare ratios + if ($originalRatio > $newRatio) { + // Original image is wider + $newHeight = $height; + $newWidth = (int) $height * $originalRatio; + } else { + // Equal width or smaller + $newHeight = (int) $width / $originalRatio; + $newWidth = $width; + } + + // Perform resize + $this->resize($newWidth, $newHeight, $background, true); + + // Define x position + switch($xPosLetter) { + case 'L': + case 'left': + $xPos = 0; + break; + case 'R': + case 'right': + $xPos = (int) $newWidth - $width; + break; + default: + $xPos = (int) ($newWidth - $width) / 2; + } + + // Define y position + switch($yPosLetter) { + case 'T': + case 'top': + $yPos = 0; + break; + case 'B': + case 'bottom': + $yPos = (int) $newHeight - $height; + break; + default: + $yPos = (int) ($newHeight - $height) / 2; + } + + // Crop image to reach desired size + $this->crop($xPos, $yPos, $width, $height); + + return $this; + } + + /** + * Resizes the image forcing the destination to have exactly the + * given width and the height + * + * @param int $w the width + * @param int $h the height + * @param int $bg the background + */ + public function forceResize($width = null, $height = null, $background = 'transparent') + { + return $this->resize($width, $height, $background, true); + } + + /** + * @inheritdoc + */ + public function scaleResize($width = null, $height = null, $background='transparent', $crop = false) + { + return $this->resize($width, $height, $background, false, true, $crop); + } + + /** + * @inheritdoc + */ + public function cropResize($width = null, $height = null, $background='transparent') + { + return $this->resize($width, $height, $background, false, false, true); + } + + /** + * Fix orientation using Exif informations + */ + public function fixOrientation() + { + if (!extension_loaded('exif')) { + throw new \RuntimeException('You need to EXIF PHP Extension to use this function'); + } + + $exif = exif_read_data($this->source->getInfos()); + + if(!array_key_exists('Orientation', $exif)) { + return $this; + } + + switch($exif['Orientation']) { + case 1: + break; + + case 2: + $this->flip(false, true); + break; + + case 3: // 180 rotate left + $this->rotate(180); + break; + + case 4: // vertical flip + $this->flip(true, false); + break; + + case 5: // vertical flip + 90 rotate right + $this->flip(true, false); + $this->rotate(-90); + break; + + case 6: // 90 rotate right + $this->rotate(-90); + break; + + case 7: // horizontal flip + 90 rotate right + $this->flip(false, true); + $this->rotate(-90); + break; + + case 8: // 90 rotate left + $this->rotate(90); + break; + } + return $this; + } + + /** + * Opens the image + */ + abstract protected function openGif($file); + abstract protected function openJpeg($file); + abstract protected function openPng($file); + + /** + * Creates an image + */ + abstract protected function createImage($width, $height); + + /** + * Creating an image using $data + */ + abstract protected function createImageFromData($data); + + /** + * Loading image from $resource + */ + protected function loadResource($resource) + { + $this->resource = $resource; + } + + protected function loadFile($file, $type) + { + if (!$this->supports($type)) { + throw new \RuntimeException('Type '.$type.' is not supported by GD'); + } + + if ($type == 'jpeg') { + $this->openJpeg($file); + } + + if ($type == 'gif') { + $this->openGif($file); + } + + if ($type == 'png') { + $this->openPng($file); + } + + if (false === $this->resource) { + throw new \UnexpectedValueException('Unable to open file ('.$file.')'); + } else { + $this->convertToTrueColor(); + } + } + + /** + * @inheritdoc + */ + public function init() + { + $source = $this->source; + + if ($source instanceof \Gregwar\Image\Source\File) { + $this->loadFile($source->getFile(), $source->guessType()); + } else if ($source instanceof \Gregwar\Image\Source\Create) { + $this->createImage($source->getWidth(), $source->getHeight()); + } else if ($source instanceof \Gregwar\Image\Source\Data) { + $this->createImageFromData($source->getData()); + } else if ($source instanceof \Gregwar\Image\Source\Resource) { + $this->loadResource($source->getResource()); + } else { + throw new \Exception('Unsupported image source type '.get_class($source)); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function resize($width = null, $height = null, $background = 'transparent', $force = false, $rescale = false, $crop = false) + { + $current_width = $this->width(); + $current_height = $this->height(); + $new_width = 0; + $new_height = 0; + $scale = 1.0; + + if ($height === null && preg_match('#^(.+)%$#mUsi', $width, $matches)) { + $width = round($current_width * ((float)$matches[1]/100.0)); + $height = round($current_height * ((float)$matches[1]/100.0)); + } + + if (!$rescale && (!$force || $crop)) { + if ($width!=null && $current_width>$width) { + $scale = $current_width/$width; + } + + if ($height!=null && $current_height>$height) { + if ($current_height/$height > $scale) + $scale = $current_height/$height; + } + } else { + if ($width!=null) { + $scale = $current_width/$width; + $new_width = $width; + } + + if ($height!=null) { + if ($width!=null && $rescale) { + $scale = max($scale,$current_height/$height); + } else { + $scale = $current_height/$height; + } + $new_height = $height; + } + } + + if (!$force || $width==null || $rescale) { + $new_width = round($current_width/$scale); + } + + if (!$force || $height==null || $rescale) { + $new_height = round($current_height/$scale); + } + + if ($width == null || $crop) { + $width = $new_width; + } + + if ($height == null || $crop) { + $height = $new_height; + } + + $this->doResize($background, $width, $height, $new_width, $new_height); + } + + /** + * Trim background color arround the image + * + * @param int $bg the background + */ + protected function _trimColor($background='transparent') + { + $width = $this->width(); + $height = $this->height(); + + $b_top = 0; + $b_lft = 0; + $b_btm = $height - 1; + $b_rt = $width - 1; + + //top + for(; $b_top < $height; ++$b_top) { + for($x = 0; $x < $width; ++$x) { + if ($this->getColor($x, $b_top) != $background) { + break 2; + } + } + } + + // bottom + for(; $b_btm >= 0; --$b_btm) { + for($x = 0; $x < $width; ++$x) { + if ($this->getColor($x, $b_btm) != $background) { + break 2; + } + } + } + + // left + for(; $b_lft < $width; ++$b_lft) { + for($y = $b_top; $y <= $b_btm; ++$y) { + if ($this->getColor($b_lft, $y) != $background) { + break 2; + } + } + } + + // right + for(; $b_rt >= 0; --$b_rt) { + for($y = $b_top; $y <= $b_btm; ++$y) { + if ($this->getColor($b_rt, $y) != $background) { + break 2; + } + } + } + + $b_btm++; + $b_rt++; + + $this->crop($b_lft, $b_top, $b_rt - $b_lft, $b_btm - $b_top); + } + + /** + * Resizes the image to an image having size of $target_width, $target_height, using + * $new_width and $new_height and padding with $bg color + */ + abstract protected function doResize($bg, $target_width, $target_height, $new_width, $new_height); + + /** + * Gets the color of the $x, $y pixel + */ + abstract protected function getColor($x, $y); + + /** + * @inheritdoc + */ + public function enableProgressive(){ + throw new \Exception('The Adapter '.$this->getName().' does not support Progressive Image loading'); + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php b/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php new file mode 100644 index 0000000..b63c734 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php @@ -0,0 +1,567 @@ + \IMG_JPG, + 'gif' => \IMG_GIF, + 'png' => \IMG_PNG, + ); + + protected function loadResource($resource) + { + parent::loadResource($resource); + imagesavealpha($this->resource, true); + } + + /** + * Gets the width and the height for writing some text + */ + public static function TTFBox($font, $text, $size, $angle = 0) + { + $box = imagettfbbox($size, $angle, $font, $text); + + return array( + 'width' => abs($box[2] - $box[0]), + 'height' => abs($box[3] - $box[5]) + ); + } + + public function __construct() + { + parent::__construct(); + + if (!(extension_loaded('gd') && function_exists('gd_info'))) { + throw new \RuntimeException('You need to install GD PHP Extension to use this library'); + } + } + + /** + * @inheritdoc + */ + public function getName() + { + return 'GD'; + } + + /** + * @inheritdoc + */ + public function fillBackground($background = 0xffffff) + { + $w = $this->width(); + $h = $this->height(); + $n = imagecreatetruecolor($w, $h); + imagefill($n, 0, 0, ImageColor::gdAllocate($this->resource, $background)); + imagecopyresampled($n, $this->resource, 0, 0, 0, 0, $w, $h, $w, $h); + imagedestroy($this->resource); + $this->resource = $n; + + return $this; + } + + /** + * Do the image resize + * + * @return $this + */ + protected function doResize($bg, $target_width, $target_height, $new_width, $new_height) + { + $width = $this->width(); + $height = $this->height(); + $n = imagecreatetruecolor($target_width, $target_height); + + if ($bg != 'transparent') { + imagefill($n, 0, 0, ImageColor::gdAllocate($this->resource, $bg)); + } else { + imagealphablending($n, false); + $color = ImageColor::gdAllocate($this->resource, 'transparent'); + + imagefill($n, 0, 0, $color); + imagesavealpha($n, true); + } + + imagecopyresampled($n, $this->resource, ($target_width-$new_width)/2, ($target_height-$new_height)/2, 0, 0, $new_width, $new_height, $width, $height); + imagedestroy($this->resource); + + $this->resource = $n; + + return $this; + } + + /** + * @inheritdoc + */ + public function crop($x, $y, $width, $height) + { + $destination = imagecreatetruecolor($width, $height); + imagealphablending($destination, false); + imagesavealpha($destination, true); + imagecopy($destination, $this->resource, 0, 0, $x, $y, $this->width(), $this->height()); + imagedestroy($this->resource); + $this->resource = $destination; + + return $this; + } + + /** + * @inheritdoc + */ + public function negate() + { + imagefilter($this->resource, IMG_FILTER_NEGATE); + return $this; + } + + /** + * @inheritdoc + */ + public function brightness($brightness) + { + imagefilter($this->resource, IMG_FILTER_BRIGHTNESS, $brightness); + return $this; + } + + /** + * @inheritdoc + */ + public function contrast($contrast) + { + imagefilter($this->resource, IMG_FILTER_CONTRAST, $contrast); + return $this; + } + + /** + * @inheritdoc + */ + public function grayscale() + { + imagefilter($this->resource, IMG_FILTER_GRAYSCALE); + return $this; + } + + /** + * @inheritdoc + */ + public function emboss() + { + imagefilter($this->resource, IMG_FILTER_EMBOSS); + return $this; + } + + /** + * @inheritdoc + */ + public function smooth($p) + { + imagefilter($this->resource, IMG_FILTER_SMOOTH, $p); + return $this; + } + + /** + * @inheritdoc + */ + public function sharp() + { + imagefilter($this->resource, IMG_FILTER_MEAN_REMOVAL); + return $this; + } + + /** + * @inheritdoc + */ + public function edge() + { + imagefilter($this->resource, IMG_FILTER_EDGEDETECT); + return $this; + } + + /** + * @inheritdoc + */ + public function colorize($red, $green, $blue) + { + imagefilter($this->resource, IMG_FILTER_COLORIZE, $red, $green, $blue); + return $this; + } + + /** + * @inheritdoc + */ + public function sepia() + { + imagefilter($this->resource, IMG_FILTER_GRAYSCALE); + imagefilter($this->resource, IMG_FILTER_COLORIZE, 100, 50, 0); + return $this; + } + + /** + * @inheritdoc + */ + public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null) + { + $other = clone $other; + $other->init(); + $other->applyOperations(); + + imagealphablending($this->resource, true); + + if (null == $width) { + $width = $other->width(); + } + + if (null == $height) { + $height = $other->height(); + } + + imagecopyresampled($this->resource, $other->getAdapter()->getResource(), $x, $y, 0, 0, $width, $height, $width, $height); + + return $this; + } + + /** + * @inheritdoc + */ + public function rotate($angle, $background = 0xffffff) + { + $this->resource = imagerotate($this->resource, $angle, ImageColor::gdAllocate($this->resource, $background)); + imagealphablending($this->resource, true); + imagesavealpha($this->resource, true); + + return $this; + } + + /** + * @inheritdoc + */ + public function fill($color = 0xffffff, $x = 0, $y = 0) + { + imagealphablending($this->resource, false); + imagefill($this->resource, $x, $y, ImageColor::gdAllocate($this->resource, $color)); + + return $this; + } + + /** + * @inheritdoc + */ + public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left') + { + imagealphablending($this->resource, true); + + if ($align != 'left') { + $sim_size = self::TTFBox($font, $text, $size, $angle); + + if ($align == 'center') { + $x -= $sim_size['width'] / 2; + } + + if ($align == 'right') { + $x -= $sim_size['width']; + } + } + + imagettftext($this->resource, $size, $angle, $x, $y, ImageColor::gdAllocate($this->resource, $color), $font, $text); + + return $this; + } + + /** + * @inheritdoc + */ + public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false) + { + if ($filled) { + imagefilledrectangle($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color)); + } else { + imagerectangle($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color)); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false) { + if ($color) { + $color = ImageColor::gdAllocate($this->resource, $color); + } + + if ($filled == true) { + imagefilledrectangle($this->resource, $x1+$radius, $y1, $x2-$radius, $y2, $color); + imagefilledrectangle($this->resource, $x1, $y1+$radius, $x1+$radius-1, $y2-$radius, $color); + imagefilledrectangle($this->resource, $x2-$radius+1, $y1+$radius, $x2, $y2-$radius, $color); + + imagefilledarc($this->resource,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color, IMG_ARC_PIE); + imagefilledarc($this->resource,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color, IMG_ARC_PIE); + imagefilledarc($this->resource,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color, IMG_ARC_PIE); + imagefilledarc($this->resource,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color, IMG_ARC_PIE); + } else { + imageline($this->resource, $x1+$radius, $y1, $x2-$radius, $y1, $color); + imageline($this->resource, $x1+$radius, $y2, $x2-$radius, $y2, $color); + imageline($this->resource, $x1, $y1+$radius, $x1, $y2-$radius, $color); + imageline($this->resource, $x2, $y1+$radius, $x2, $y2-$radius, $color); + + imagearc($this->resource,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color); + imagearc($this->resource,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color); + imagearc($this->resource,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color); + imagearc($this->resource,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function line($x1, $y1, $x2, $y2, $color = 0x000000) + { + imageline($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color)); + + return $this; + } + + /** + * @inheritdoc + */ + public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false) + { + if ($filled) { + imagefilledellipse($this->resource, $cx, $cy, $width, $height, ImageColor::gdAllocate($this->resource, $color)); + } else { + imageellipse($this->resource, $cx, $cy, $width, $height, ImageColor::gdAllocate($this->resource, $color)); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function circle($cx, $cy, $r, $color = 0x000000, $filled = false) + { + return $this->ellipse($cx, $cy, $r, $r, ImageColor::gdAllocate($this->resource, $color), $filled); + } + + /** + * @inheritdoc + */ + public function polygon(array $points, $color, $filled = false) + { + if ($filled) { + imagefilledpolygon($this->resource, $points, count($points)/2, ImageColor::gdAllocate($this->resource, $color)); + } else { + imagepolygon($this->resource, $points, count($points)/2, ImageColor::gdAllocate($this->resource, $color)); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function flip($flipVertical, $flipHorizontal) { + + if (!$flipVertical && !$flipHorizontal) { + return $this; + } + + if (function_exists('imageflip')) { + if ($flipVertical && $flipHorizontal) { + $flipMode = \IMG_FLIP_BOTH; + } else if ($flipVertical && !$flipHorizontal) { + $flipMode = \IMG_FLIP_VERTICAL; + } else if (!$flipVertical && $flipHorizontal) { + $flipMode = \IMG_FLIP_HORIZONTAL; + } + + imageflip($this->resource, $flipMode); + } else { + $width = $this->width(); + $height = $this->height(); + + $src_x = 0; + $src_y = 0; + $src_width = $width; + $src_height = $height; + + if ($flipVertical) { + $src_y = $height -1; + $src_height = -$height; + } + + if ($flipHorizontal) { + $src_x = $width -1; + $src_width = -$width; + } + + $imgdest = imagecreatetruecolor ($width, $height); + imagealphablending($imgdest, false); + imagesavealpha($imgdest, true); + + if (imagecopyresampled($imgdest, $this->resource, 0, 0, $src_x, $src_y , $width, $height, $src_width, $src_height)) { + imagedestroy($this->resource); + $this->resource = $imgdest; + } + } + + return $this; + } + + /** + * @inheritdoc + */ + public function width() + { + if (null === $this->resource) { + $this->init(); + } + + return imagesx($this->resource); + } + + /** + * @inheritdoc + */ + public function height() + { + if (null === $this->resource) { + $this->init(); + } + + return imagesy($this->resource); + } + + protected function createImage($width, $height) + { + $this->resource = imagecreatetruecolor($width, $height); + } + + protected function createImageFromData($data) + { + $this->resource = @imagecreatefromstring($data); + } + + /** + * Converts the image to true color + */ + protected function convertToTrueColor() + { + if (!imageistruecolor($this->resource)) { + if (function_exists('imagepalettetotruecolor')) { + // Available in PHP 5.5 + imagepalettetotruecolor($this->resource); + } else { + $transparentIndex = imagecolortransparent($this->resource); + + $w = $this->width(); + $h = $this->height(); + + $img = imagecreatetruecolor($w, $h); + imagecopy($img, $this->resource, 0, 0, 0, 0, $w, $h); + + if ($transparentIndex != -1) { + $width = $this->width(); + $height = $this->height(); + + imagealphablending($img, false); + imagesavealpha($img, true); + + for ($x=0; $x<$width; $x++) { + for ($y=0; $y<$height; $y++) { + if (imagecolorat($this->resource, $x, $y) == $transparentIndex) { + imagesetpixel($img, $x, $y, 127 << 24); + } + } + } + } + + $this->resource = $img; + } + } + + imagesavealpha($this->resource, true); + } + + /** + * @inheritdoc + */ + public function saveGif($file) + { + $transColor = imagecolorallocatealpha($this->resource, 255, 255, 255, 127); + imagecolortransparent($this->resource, $transColor); + imagegif($this->resource, $file); + return $this; + } + + /** + * @inheritdoc + */ + public function savePng($file) + { + imagepng($this->resource, $file); + return $this; + } + + /** + * @inheritdoc + */ + public function saveJpeg($file, $quality) + { + imagejpeg($this->resource, $file, $quality); + return $this; + } + + /** + * Try to open the file using jpeg + * + */ + protected function openJpeg($file) + { + $this->resource = @imagecreatefromjpeg($file); + } + + /** + * Try to open the file using gif + */ + protected function openGif($file) + { + $this->resource = @imagecreatefromgif($file); + } + + /** + * Try to open the file using PNG + */ + protected function openPng($file) + { + $this->resource = @imagecreatefrompng($file); + } + + /** + * Does this adapter supports type ? + */ + protected function supports($type) + { + return (imagetypes() & self::$gdTypes[$type]); + } + + protected function getColor($x, $y) + { + return imagecolorat($this->resource, $x, $y); + } + + /** + * @inheritdoc + */ + public function enableProgressive(){ + imageinterlace($this->resource, 1); + + return $this; + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php b/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php new file mode 100644 index 0000000..9da3969 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php @@ -0,0 +1,389 @@ +newNewFile = $newNewFile; + } + + public function getNewFile() + { + return $this->newNewFile; + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php b/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php new file mode 100644 index 0000000..839c4b5 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php @@ -0,0 +1,83 @@ + + */ +class GarbageCollect +{ + /** + * Drops old files of a directory + * + * @param string $directory the name of the target directory + * @param int $days the number of days to consider a file old + * @param bool $verbose enable verbose output + * + * @return true if all the files/directories of a directory was wiped + */ + public static function dropOldFiles($directory, $days = 30, $verbose = false) + { + $allDropped = true; + $now = time(); + + $dir = opendir($directory); + + if (!$dir) { + if ($verbose) { + echo "! Unable to open $directory\n"; + } + + return false; + } + + while ($file = readdir($dir)) { + if ($file == '.' || $file == '..') { + continue; + } + + $fullName = $directory.'/'.$file; + + $old = $now-filemtime($fullName); + + if (is_dir($fullName)) { + // Directories are recursively crawled + if (static::dropOldFiles($fullName, $days, $verbose)) { + self::drop($fullName, $verbose); + } else { + $allDropped = false; + } + } else { + if ($old > (24*60*60*$days)) { + self::drop($fullName, $verbose); + } else { + $allDropped = false; + } + } + } + + closedir($dir); + + return $allDropped; + } + + /** + * Drops a file or an empty directory + */ + public static function drop($file, $verbose = false) + { + if (is_dir($file)) { + @rmdir($file); + } else { + @unlink($file); + } + + if ($verbose) { + echo "> Dropping $file...\n"; + } + } + +} diff --git a/vendor/gregwar/image/Gregwar/Image/Image.php b/vendor/gregwar/image/Gregwar/Image/Image.php new file mode 100644 index 0000000..410c2a3 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Image.php @@ -0,0 +1,752 @@ + + * + * @method Image saveGif($file) + * @method Image savePng($file) + * @method Image saveJpeg($file, $quality) + * @method Image cropResize($width = null, $height = null, $background=0xffffff) + * @method Image scale($width = null, $height = null, $background=0xffffff, $crop = false) + * @method Image ($width = null, $height = null, $background = 0xffffff, $force = false, $rescale = false, $crop = false) + * @method Image crop($x, $y, $width, $height) + * @method Image enableProgressive() + * @method Image force($width = null, $height = null, $background = 0xffffff) + * @method Image zoomCrop($width, $height, $background = 0xffffff) + * @method Image fillBackground($background = 0xffffff) + * @method Image negate() + * @method Image brightness($brightness) + * @method Image contrast($contrast) + * @method Image grayscale() + * @method Image emboss() + * @method Image smooth($p) + * @method Image sharp() + * @method Image edge() + * @method Image colorize($red, $green, $blue) + * @method Image sepia() + * @method Image merge(Image $other, $x = 0, $y = 0, $width = null, $height = null) + * @method Image rotate($angle, $background = 0xffffff) + * @method Image fill($color = 0xffffff, $x = 0, $y = 0) + * @method Image write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left') + * @method Image rectangle($x1, $y1, $x2, $y2, $color, $filled = false) + * @method Image roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false) + * @method Image line($x1, $y1, $x2, $y2, $color = 0x000000) + * @method Image ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false) + * @method Image circle($cx, $cy, $r, $color = 0x000000, $filled = false) + * @method Image polygon(array $points, $color, $filled = false) + * @method Image flip($flipVertical, $flipHorizontal) + */ +class Image +{ + /** + * Directory to use for file caching + */ + protected $cacheDir = 'cache/images'; + + /** + * Directory cache mode + */ + protected $cacheMode = null; + + /** + * Internal adapter + * + * @var AdapterInterface + */ + protected $adapter = null; + + /** + * Pretty name for the image + */ + protected $prettyName = ''; + protected $prettyPrefix; + + /** + * Transformations hash + */ + protected $hash = null; + + /** + * The image source + */ + protected $source = null; + + /** + * Force image caching, even if there is no operation applied + */ + protected $forceCache = true; + + /** + * Supported types + */ + public static $types = array( + 'jpg' => 'jpeg', + 'jpeg' => 'jpeg', + 'png' => 'png', + 'gif' => 'gif', + ); + + /** + * Fallback image + */ + protected $fallback; + + /** + * Use fallback image + */ + protected $useFallbackImage = true; + + /** + * Cache system + */ + protected $cache; + + /** + * Change the caching directory + */ + public function setCacheDir($cacheDir) + { + $this->cache->setCacheDirectory($cacheDir); + + return $this; + } + + /** + * @param int $dirMode + */ + public function setCacheDirMode($dirMode) + { + $this->cache->setDirectoryMode($dirMode); + } + + /** + * Enable or disable to force cache even if the file is unchanged + */ + public function setForceCache($forceCache = true) + { + $this->forceCache = $forceCache; + + return $this; + } + + /** + * The actual cache dir + */ + public function setActualCacheDir($actualCacheDir) + { + $this->cache->setActualCacheDirectory($actualCacheDir); + + return $this; + } + + /** + * Sets the pretty name of the image + */ + public function setPrettyName($name, $prefix = true) + { + if (empty($name)) { + return $this; + } + + $this->prettyName = $this->urlize($name); + $this->prettyPrefix = $prefix; + + return $this; + } + + /** + * Urlizes the prettyName + */ + protected function urlize($name) + { + $transliterator = '\Behat\Transliterator\Transliterator'; + + if (class_exists($transliterator)) { + $name = $transliterator::transliterate($name); + $name = $transliterator::urlize($name); + } else { + $name = strtolower($name); + $name = str_replace(' ', '-', $name); + $name = preg_replace('/([^a-z0-9\-]+)/m', '', $name); + } + + return $name; + } + + /** + * Operations array + */ + protected $operations = array(); + + public function __construct($originalFile = null, $width = null, $height = null) + { + $this->cache = new \Gregwar\Cache\Cache; + $this->cache->setCacheDirectory($this->cacheDir); + + $this->setFallback(null); + + if ($originalFile) { + $this->source = new Source\File($originalFile); + } else { + $this->source = new Source\Create($width, $height); + } + } + + /** + * Sets the image data + */ + public function setData($data) + { + $this->source = new Source\Data($data); + } + + /** + * Sets the resource + */ + public function setResource($resource) + { + $this->source = new Source\Resource($resource); + } + + /** + * Use the fallback image or not + */ + public function useFallback($useFallbackImage = true) + { + $this->useFallbackImage = $useFallbackImage; + + return $this; + } + + /** + * Sets the fallback image to use + */ + public function setFallback($fallback = null) + { + if ($fallback === null) { + $this->fallback = __DIR__ . '/images/error.jpg'; + } else { + $this->fallback = $fallback; + } + + return $this; + } + + /** + * Gets the fallack image path + */ + public function getFallback() + { + return $this->fallback; + } + + /** + * Gets the fallback into the cache dir + */ + public function getCacheFallback() + { + $fallback = $this->fallback; + + return $this->cache->getOrCreateFile('fallback.jpg', array(), function($target) use ($fallback) { + copy($fallback, $target); + }); + } + + /** + * @return AdapterInterface + */ + public function getAdapter() + { + if (null === $this->adapter) { + // Defaults to GD + $this->setAdapter('gd'); + } + + return $this->adapter; + } + + public function setAdapter($adapter) + { + if ($adapter instanceof Adapter\Adapter) { + $this->adapter = $adapter; + } else { + if (is_string($adapter)) { + $adapter = strtolower($adapter); + + switch ($adapter) { + case 'gd': + $this->adapter = new Adapter\GD(); + break; + case 'imagemagick': + case 'imagick': + $this->adapter = new Adapter\Imagick(); + break; + default: + throw new \Exception('Unknown adapter: '.$adapter); + break; + } + } else { + throw new \Exception('Unable to load the given adapter (not string or Adapter)'); + } + } + + $this->adapter->setSource($this->source); + } + + /** + * Get the file path + * + * @return mixed a string with the filen name, null if the image + * does not depends on a file + */ + public function getFilePath() + { + if ($this->source instanceof Source\File) { + return $this->source->getFile(); + } else { + return null; + } + } + + /** + * Defines the file only after instantiation + * + * @param string $originalFile the file path + */ + public function fromFile($originalFile) + { + $this->source = new Source\File($originalFile); + + return $this; + } + + /** + * Tells if the image is correct + */ + public function correct() + { + return $this->source->correct(); + } + + /** + * Guess the file type + */ + public function guessType() + { + return $this->source->guessType(); + } + + /** + * Adds an operation + */ + protected function addOperation($method, $args) + { + $this->operations[] = array($method, $args); + } + + /** + * Generic function + */ + public function __call($methodName, $args) + { + $adapter = $this->getAdapter(); + $reflection = new \ReflectionClass(get_class($adapter)); + + if ($reflection->hasMethod($methodName)) { + $method = $reflection->getMethod($methodName); + + if ($method->getNumberOfRequiredParameters() > count($args)) { + throw new \InvalidArgumentException('Not enough arguments given for '.$methodName); + } + + $this->addOperation($methodName, $args); + + return $this; + } + + throw new \BadFunctionCallException('Invalid method: '.$methodName); + } + + /** + * Serialization of operations + */ + public function serializeOperations() + { + $datas = array(); + + foreach ($this->operations as $operation) { + $method = $operation[0]; + $args = $operation[1]; + + foreach ($args as &$arg) { + if ($arg instanceof self) { + $arg = $arg->getHash(); + } + } + + $datas[] = array($method, $args); + } + + return serialize($datas); + } + + /** + * Generates the hash + */ + public function generateHash($type = 'guess', $quality = 80) + { + $inputInfos = $this->source->getInfos(); + + $datas = array( + $inputInfos, + $this->serializeOperations(), + $type, + $quality + ); + + $this->hash = sha1(serialize($datas)); + } + + /** + * Gets the hash + */ + public function getHash($type = 'guess', $quality = 80) + { + if (null === $this->hash) { + $this->generateHash($type, $quality); + } + + return $this->hash; + } + + /** + * Gets the cache file name and generate it if it does not exists. + * Note that if it exists, all the image computation process will + * not be done. + * + * @param string $type the image type + * @param int $quality the quality (for JPEG) + */ + public function cacheFile($type = 'jpg', $quality = 80, $actual = false) + { + if ($type == 'guess') { + $type = $this->guessType(); + } + + if (!count($this->operations) && $type == $this->guessType() && !$this->forceCache) { + return $this->getFilename($this->getFilePath()); + } + + // Computes the hash + $this->hash = $this->getHash($type, $quality); + + // Generates the cache file + $cacheFile = ''; + + if (!$this->prettyName || $this->prettyPrefix) { + $cacheFile .= $this->hash; + } + + if ($this->prettyPrefix) { + $cacheFile .= '-'; + } + + if ($this->prettyName) { + $cacheFile .= $this->prettyName; + } + + $cacheFile .= '.'.$type; + + // If the files does not exists, save it + $image = $this; + + // Target file should be younger than all the current image + // dependencies + $conditions = array( + 'younger-than' => $this->getDependencies() + ); + + // The generating function + $generate = function($target) use ($image, $type, $quality) { + $result = $image->save($target, $type, $quality); + + if ($result != $target) { + throw new GenerationError($result); + } + }; + + // Asking the cache for the cacheFile + try { + $file = $this->cache->getOrCreateFile($cacheFile, $conditions, $generate, $actual); + } catch (GenerationError $e) { + $file = $e->getNewFile(); + } + + if ($actual) { + return $file; + } else { + return $this->getFilename($file); + } + } + + /** + * Get cache data (to render the image) + * + * @param string $type the image type + * @param int $quality the quality (for JPEG) + */ + public function cacheData($type = 'jpg', $quality = 80) + { + return file_get_contents($this->cacheFile($type, $quality)); + } + + /** + * Hook to helps to extends and enhance this class + */ + protected function getFilename($filename) + { + return $filename; + } + + /** + * Generates and output a jpeg cached file + */ + public function jpeg($quality = 80) + { + return $this->cacheFile('jpg', $quality); + } + + /** + * Generates and output a gif cached file + */ + public function gif() + { + return $this->cacheFile('gif'); + } + + /** + * Generates and output a png cached file + */ + public function png() + { + return $this->cacheFile('png'); + } + + /** + * Generates and output an image using the same type as input + */ + public function guess($quality = 80) + { + return $this->cacheFile('guess', $quality); + } + + /** + * Get all the files that this image depends on + * + * @return string[] this is an array of strings containing all the files that the + * current Image depends on + */ + public function getDependencies() + { + $dependencies = array(); + + $file = $this->getFilePath(); + if ($file) { + $dependencies[] = $file; + } + + foreach ($this->operations as $operation) { + foreach ($operation[1] as $argument) { + if ($argument instanceof self) { + $dependencies = array_merge($dependencies, $argument->getDependencies()); + } + } + } + + return $dependencies; + } + + /** + * Applies the operations + */ + public function applyOperations() + { + // Renders the effects + foreach ($this->operations as $operation) { + call_user_func_array(array($this->adapter, $operation[0]), $operation[1]); + } + } + + /** + * Initialize the adapter + */ + public function init() + { + $this->getAdapter()->init(); + } + + /** + * Save the file to a given output + */ + public function save($file, $type = 'guess', $quality = 80) + { + if ($file) { + $directory = dirname($file); + + if (!is_dir($directory)) { + @mkdir($directory, 0777, true); + } + } + + if (is_int($type)) { + $quality = $type; + $type = 'jpeg'; + } + + if ($type == 'guess') { + $type = $this->guessType(); + } + + if (!isset(self::$types[$type])) { + throw new \InvalidArgumentException('Given type ('.$type.') is not valid'); + } + + $type = self::$types[$type]; + + try { + $this->init(); + $this->applyOperations(); + + $success = false; + + if (null == $file) { + ob_start(); + } + + if ($type == 'jpeg') { + $success = $this->getAdapter()->saveJpeg($file, $quality); + } + + if ($type == 'gif') { + $success = $this->getAdapter()->saveGif($file); + } + + if ($type == 'png') { + $success = $this->getAdapter()->savePng($file); + } + + if (!$success) { + return false; + } + + return (null === $file ? ob_get_clean() : $file); + + } catch (\Exception $e) { + if ($this->useFallbackImage) { + return (null === $file ? file_get_contents($this->fallback) : $this->getCacheFallback()); + } else { + throw $e; + } + } + } + + /** + * Get the contents of the image + */ + public function get($type = 'guess', $quality = 80) + { + return $this->save(null, $type, $quality); + } + + /* Image API */ + + /** + * Image width + */ + public function width() + { + return $this->getAdapter()->width(); + } + + /** + * Image height + */ + public function height() + { + return $this->getAdapter()->height(); + } + + /** + * Tostring defaults to jpeg + */ + public function __toString() + { + return $this->guess(); + } + + /** + * Returning basic html code for this image + */ + public function html($title = '', $type = 'jpg', $quality = 80) + { + return ''; + } + + /** + * Returns the Base64 inlinable representation + */ + public function inline($type = 'jpg', $quality = 80) + { + $mime = $type; + if ($mime == 'jpg') { + $mime = 'jpeg'; + } + + return 'data:image/'.$mime.';base64,'.base64_encode(file_get_contents($this->cacheFile($type, $quality, true))); + } + + /** + * Creates an instance, usefull for one-line chaining + */ + public static function open($file = '') + { + return new static($file); + } + + /** + * Creates an instance of a new resource + */ + public static function create($width, $height) + { + return new static(null, $width, $height); + } + + /** + * Creates an instance of image from its data + */ + public static function fromData($data) + { + $image = new static(); + $image->setData($data); + + return $image; + } + + /** + * Creates an instance of image from resource + */ + public static function fromResource($resource) + { + $image = new static(); + $image->setResource($resource); + + return $image; + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/ImageColor.php b/vendor/gregwar/image/Gregwar/Image/ImageColor.php new file mode 100644 index 0000000..2f79b91 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/ImageColor.php @@ -0,0 +1,93 @@ + 0x000000, + 'silver' => 0xc0c0c0, + 'gray' => 0x808080, + 'teal' => 0x008080, + 'aqua' => 0x00ffff, + 'blue' => 0x0000ff, + 'navy' => 0x000080, + 'green' => 0x008000, + 'lime' => 0x00ff00, + 'white' => 0xffffff, + 'fuschia' => 0xff00ff, + 'purple' => 0x800080, + 'olive' => 0x808000, + 'yellow' => 0xffff00, + 'orange' => 0xffA500, + 'red' => 0xff0000, + 'maroon' => 0x800000, + 'transparent' => 0x7fffffff + ); + + public static function gdAllocate($image, $color) + { + $colorRGBA = self::parse($color); + + $b = ($colorRGBA)&0xff; + $colorRGBA >>= 8; + $g = ($colorRGBA)&0xff; + $colorRGBA >>= 8; + $r = ($colorRGBA)&0xff; + $colorRGBA >>= 8; + $a = ($colorRGBA)&0xff; + + $c = imagecolorallocatealpha($image, $r, $g, $b, $a); + + if ($color == 'transparent') { + imagecolortransparent($image, $c); + } + + return $c; + } + + public static function parse($color) + { + // Direct color representation (ex: 0xff0000) + if (!is_string($color) && is_numeric($color)) + return $color; + + // Color name (ex: "red") + if (isset(self::$colors[$color])) + return self::$colors[$color]; + + if (is_string($color)) { + $color_string = str_replace(' ', '', $color); + + // Color string (ex: "ff0000", "#ff0000" or "0xfff") + if (preg_match('/^(#|0x|)([0-9a-f]{3,6})/i', $color_string, $matches)) { + $col = $matches[2]; + + if (strlen($col) == 6) + return hexdec($col); + + if (strlen($col) == 3) { + $r = ''; + for ($i=0; $i<3; $i++) + $r.= $col[$i].$col[$i]; + return hexdec($r); + } + } + + // Colors like "rgb(255, 0, 0)" + if (preg_match('/^rgb\(([0-9]+),([0-9]+),([0-9]+)\)/i', $color_string, $matches)) { + $r = $matches[1]; + $g = $matches[2]; + $b = $matches[3]; + if ($r>=0 && $r<=0xff && $g>=0 && $g<=0xff && $b>=0 && $b<=0xff) { + return ($r << 16) | ($g << 8) | ($b); + } + } + } + + throw new \InvalidArgumentException('Invalid color: '.$color); + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/LICENSE b/vendor/gregwar/image/Gregwar/Image/LICENSE new file mode 100644 index 0000000..1be4d12 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) <2012-2013> Grégoire Passault + +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. diff --git a/vendor/gregwar/image/Gregwar/Image/README.md b/vendor/gregwar/image/Gregwar/Image/README.md new file mode 100644 index 0000000..df6cd07 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/README.md @@ -0,0 +1,275 @@ +# Gregwar's Image class + +[![Build status](https://travis-ci.org/Gregwar/Image.svg?branch=master)](https://travis-ci.org/Gregwar/Image) + +The `Gregwar\Image` class purpose is to provide a simple object-oriented images handling and caching API. + +# Installation + +With composer : + +``` json +{ + ... + "require": { + "gregwar/image": "2.*" + } +} +``` + +# Usage + +## Basic handling + +Using methods chaining, you can open, transform and save a file in a single line: + +```php +resize(100, 100) + ->negate() + ->save('out.jpg'); +``` + +Here are the resize methods: + +* `resize($width, $height, $background)`: resizes the image, will preserve scale and never + enlarge it (background is `red` in order to understand what happens): + +![resize()](doc/resize.jpg) + +* `scaleResize($width, $height, $background)`: resizes the image, will preserve scale, can enlarge + it (background is `red` in order to understand what happens): + +![scaleResize()](doc/scaleResize.jpg) + +* `forceResize($width, $height, $background)`: resizes the image forcing it to + be exactly `$width` by `$height` + +![forceResize()](doc/forceResize.jpg) + +* `cropResize($width, $height, $background)`: resizes the image preserving scale (just like `resize()`) + and croping the whitespaces: + +![cropResize()](doc/cropResize.jpg) + +* `zoomCrop($width, $height, $background, $xPos, $yPos)`: resize and crop the image to fit to given dimensions: + +![zoomCrop()](doc/zoomCrop.jpg) + +* In `zoomCrop()`, You can change the position of the resized image using the `$xPos` (center, left or right) and `$yPos` (center, + top or bottom): + +![zoomCrop() with yPos=top](doc/zoomCropTop.jpg) + +The other methods available are: + +* `crop($x, $y, $w, $h)`: crops the image to a box located on coordinates $x,y and + which size is $w by $h + +* `negate()`: negates the image colors + +* `brighness($b)`: applies a brightness effect to the image (from -255 to +255) + +* `contrast($c)`: applies a contrast effect to the image (from -100 to +100) + +* `grayscale()`: converts the image to grayscale + +* `emboss()`: emboss the image + +* `smooth($p)`: smooth the image + +* `sharp()`: applies a mean removal filter on the image + +* `edge()`: applies an edge effect on the image + +* `colorize($red, $green, $blue)`: colorize the image (from -255 to +255 for each color) + +* `sepia()`: applies a sepia effect + +* `merge($image, $x, $y, $width, $height)`: merges two images + +* `fill($color, $x, $y)`: fills the image with the given color + +* `write($font, $text, $x, $y, $size, $angle, $color, $position)`: writes text over image, $position can be any of 'left', 'right', or 'center' + +* `rectangle($x1, $y1, $x2, $y2, $color, $filled=false)`: draws a rectangle + +* `rotate($angle, $background = 0xffffff)` : rotate the image to given angle + +* `roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled=false)`: draws a rounded rectangle ($radius can be anything from 0) + +* `line($x1, $y1, $x2, $y2, $color)`: draws a line + +* `ellipse($cx, $cy, $width, $height, $color, $filled=false)`: draws an ellipse + +* `circle($cx, $cy, $r, $color, $filled=false)`: draws a circle + +* `fillBackground($bg=0xffffff)`: fills the background of a transparent image to the 'bg' color + +* `fixOrientation()`: return the image rotated and flipped using image exif information + +* `html($title = '', $type = 'jpg')`: return the `` tag with the cache image + +* `flip($flipVertical, $flipHorizontal)`: flips the image in the given directions. Both params are boolean and at least one must be true. + +* `inline($type = 'jpg')`: returns the HTML inlinable base64 string (see `demo/inline.php`) + +You can also create image from scratch using: + +```php +save('output.jpg', 'jpg', 85); +``` + +You can also get the contents of the image using `get($type = 'jpg', $quality = 80)`, which will return the binary contents of the image + +## Using cache + +Each operation above is not actually applied on the opened image, but added in an operations +array. This operation array, the name, type and modification time of file are hashed using +`sha1()` and the hash is used to look up for a cache file. + +Once the cache directory configured, you can call the following methods: + +* `jpeg($quality = 80)`: lookup or create a jpeg cache file on-the-fly + +* `gif()`: lookup or create a gif cache file on-the-fly + +* `png()`: lookup or create a png cache file on-the-fly + +* `guess($quality = 80)`: guesses the type (use the same as input) and lookup or create a + cache file on-the-fly + +* `setPrettyName($prettyName, $prefix = true)`: sets a "pretty" name suffix for the file, if you want it to be more SEO-friendly. + for instance, if you call it "Fancy Image", the cache will look like something/something-fancy-image.jpg. + If `$prefix` is passed to `false` (default `true`), the pretty name won't have any hash prefix. + If you want to use non-latin1 pretty names, **behat/transliterator** package must be installed. + +For instance: + +```php +sepia() + ->jpeg(); + +//Outputs: cache/images/1/8/6/9/c/86e4532dbd9c073075ef08e9751fc9bc0f4.jpg +``` + +If the original file and operations do not change, the hashed value will be the same and the +cache will not be generated again. + +You can use this directly in an HTML document: + + +```php +resize(150, 150)->jpeg(); ?>" /> +// ... +``` + +This is powerful since if you change the original image or any of your code the cached hash +will change and the file will be regenerated. + +Writing image +------------- + +You can also create your own image on-the-fly using drawing functions: + + +```php +fill(0xffaaaa) // Filling with a light red + ->rectangle(0xff3333, 0, 100, 300, 200, true) // Drawing a red rectangle + // Writing "Hello $username !" on the picture using a custom TTF font file + ->write('./fonts/CaviarDreams.ttf', 'Hello '.$username.'!', 150, 150, 20, 0, 'white', 'center') + ->jpeg(); +?> + +``` + +## Using fallback image + +If the image file doesn't exists, you can configurate a fallback image that will be used +by the class (note that this require the cache directory to be available). + +A default "error" image which is used is in `images/error.jpg`, you can change it with: + +```php +setFallback('/path/to/my/fallback.jpg'); +``` + +## Garbage Collect + +To prevent the cache from growing forever, you can use the provided GarbageCollect class as below: + +```php +negate(); + $this->sepia(); + } +``` + +Which could be used on the Image + +```php +myFilter(); +``` + +You can also write your own adapter which could extend one of this repository and use it by calling `setAdapter()`: + +```php +setAdapter(new MyCustomAdapter); +``` + +# License + +`Gregwar\Image` is under MIT License, please read the LICENSE file for further details. +Do not hesitate to fork this repository and customize it ! diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Create.php b/vendor/gregwar/image/Gregwar/Image/Source/Create.php new file mode 100644 index 0000000..42d784d --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Source/Create.php @@ -0,0 +1,38 @@ +width = $width; + $this->height = $height; + } + + public function getWidth() + { + return $this->width; + } + + public function getHeight() + { + return $this->height; + } + + public function getInfos() + { + return array($this->width, $this->height); + } + + public function correct() + { + return $this->width > 0 && $this->height > 0; + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Data.php b/vendor/gregwar/image/Gregwar/Image/Source/Data.php new file mode 100644 index 0000000..a4d2555 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Source/Data.php @@ -0,0 +1,26 @@ +data = $data; + } + + public function getData() + { + return $this->data; + } + + public function getInfos() + { + return sha1($this->data); + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/File.php b/vendor/gregwar/image/Gregwar/Image/Source/File.php new file mode 100644 index 0000000..f090c6c --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Source/File.php @@ -0,0 +1,63 @@ +file = $file; + } + + public function getFile() + { + return $this->file; + } + + public function correct() + { + return false !== @exif_imagetype($this->file); + } + + public function guessType() + { + if (function_exists('exif_imagetype')) { + $type = @exif_imagetype($this->file); + + if (false !== $type) { + if ($type == IMAGETYPE_JPEG) { + return 'jpeg'; + } + + if ($type == IMAGETYPE_GIF) { + return 'gif'; + } + + if ($type == IMAGETYPE_PNG) { + return 'png'; + } + } + } + + $parts = explode('.', $this->file); + $ext = strtolower($parts[count($parts)-1]); + + if (isset(Image::$types[$ext])) { + return Image::$types[$ext]; + } + + return 'jpeg'; + } + + public function getInfos() + { + return $this->file; + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Resource.php b/vendor/gregwar/image/Gregwar/Image/Source/Resource.php new file mode 100644 index 0000000..fb1f6f1 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Source/Resource.php @@ -0,0 +1,21 @@ +resource = $resource; + } + + public function getResource() + { + return $this->resource; + } +} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Source.php b/vendor/gregwar/image/Gregwar/Image/Source/Source.php new file mode 100644 index 0000000..27321b4 --- /dev/null +++ b/vendor/gregwar/image/Gregwar/Image/Source/Source.php @@ -0,0 +1,34 @@ += 5.3.7` OR a version that has the `$2y` fix backported into it (such as RedHat provides). Note that Debian's 5.3.3 version is **NOT** supported. + +The runtime checks have been removed due to this version issue. To see if password_compat is available for your system, run the included `version-test.php`. If it outputs "Pass", you can safely use the library. If not, you cannot. + +If you attempt to use password-compat on an unsupported version, attempts to create or verify hashes will return `false`. You have been warned! + +The reason for this is that PHP prior to 5.3.7 contains a [security issue with its BCRYPT implementation](http://php.net/security/crypt_blowfish.php). Therefore, it's highly recommended that you upgrade to a newer version of PHP prior to using this layer. + +Installation +============ + +To install, simply `require` the `password.php` file under `lib`. + +You can also install it via `Composer` by using the [Packagist archive](http://packagist.org/packages/ircmaxell/password-compat). + +Usage +===== + +**Creating Password Hashes** + +To create a password hash from a password, simply use the `password_hash` function. +````PHP + $hash = password_hash($password, PASSWORD_BCRYPT); +```` +Note that the algorithm that we chose is `PASSWORD_BCRYPT`. That's the current strongest algorithm supported. This is the `BCRYPT` crypt algorithm. It produces a 60 character hash as the result. + +`BCRYPT` also allows for you to define a `cost` parameter in the options array. This allows for you to change the CPU cost of the algorithm: +````PHP + $hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10)); +```` +That's the same as the default. The cost can range from `4` to `31`. I would suggest that you use the highest cost that you can, while keeping response time reasonable (I target between 0.1 and 0.5 seconds for a hash, depending on use-case). + +Another algorithm name is supported: +````PHP + PASSWORD_DEFAULT +```` +This will use the strongest algorithm available to PHP at the current time. Presently, this is the same as specifying `PASSWORD_BCRYPT`. But in future versions of PHP, it may be updated to use a stronger algorithm if one is introduced. It can also be changed if a problem is identified with the BCRYPT algorithm. Note that if you use this option, you are **strongly** encouraged to store it in a `VARCHAR(255)` column to avoid truncation issues if a future algorithm increases the length of the generated hash. + +It is very important that you should check the return value of `password_hash` prior to storing it, because a `false` may be returned if it encountered an error. + +**Verifying Password Hashes** + +To verify a hash created by `password_hash`, simply call: +````PHP + if (password_verify($password, $hash)) { + /* Valid */ + } else { + /* Invalid */ + } +```` +That's all there is to it. + +**Rehashing Passwords** + +From time to time you may update your hashing parameters (algorithm, cost, etc). So a function to determine if rehashing is necessary is available: +````PHP + if (password_verify($password, $hash)) { + if (password_needs_rehash($hash, $algorithm, $options)) { + $hash = password_hash($password, $algorithm, $options); + /* Store new hash in db */ + } + } +```` diff --git a/vendor/ircmaxell/password-compat/lib/password.php b/vendor/ircmaxell/password-compat/lib/password.php new file mode 100644 index 0000000..cc6896c --- /dev/null +++ b/vendor/ircmaxell/password-compat/lib/password.php @@ -0,0 +1,314 @@ + + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @copyright 2012 The Authors + */ + +namespace { + + if (!defined('PASSWORD_BCRYPT')) { + /** + * PHPUnit Process isolation caches constants, but not function declarations. + * So we need to check if the constants are defined separately from + * the functions to enable supporting process isolation in userland + * code. + */ + define('PASSWORD_BCRYPT', 1); + define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); + define('PASSWORD_BCRYPT_DEFAULT_COST', 10); + } + + if (!function_exists('password_hash')) { + + /** + * Hash the password using the specified algorithm + * + * @param string $password The password to hash + * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) + * @param array $options The options for the algorithm to use + * + * @return string|false The hashed password, or false on error. + */ + function password_hash($password, $algo, array $options = array()) { + if (!function_exists('crypt')) { + trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); + return null; + } + if (is_null($password) || is_int($password)) { + $password = (string) $password; + } + if (!is_string($password)) { + trigger_error("password_hash(): Password must be a string", E_USER_WARNING); + return null; + } + if (!is_int($algo)) { + trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); + return null; + } + $resultLength = 0; + switch ($algo) { + case PASSWORD_BCRYPT: + $cost = PASSWORD_BCRYPT_DEFAULT_COST; + if (isset($options['cost'])) { + $cost = $options['cost']; + if ($cost < 4 || $cost > 31) { + trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); + return null; + } + } + // The length of salt to generate + $raw_salt_len = 16; + // The length required in the final serialization + $required_salt_len = 22; + $hash_format = sprintf("$2y$%02d$", $cost); + // The expected length of the final crypt() output + $resultLength = 60; + break; + default: + trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); + return null; + } + $salt_requires_encoding = false; + if (isset($options['salt'])) { + switch (gettype($options['salt'])) { + case 'NULL': + case 'boolean': + case 'integer': + case 'double': + case 'string': + $salt = (string) $options['salt']; + break; + case 'object': + if (method_exists($options['salt'], '__tostring')) { + $salt = (string) $options['salt']; + break; + } + case 'array': + case 'resource': + default: + trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); + return null; + } + if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) { + trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING); + return null; + } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { + $salt_requires_encoding = true; + } + } else { + $buffer = ''; + $buffer_valid = false; + if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { + $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); + if ($buffer) { + $buffer_valid = true; + } + } + if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { + $buffer = openssl_random_pseudo_bytes($raw_salt_len); + if ($buffer) { + $buffer_valid = true; + } + } + if (!$buffer_valid && @is_readable('/dev/urandom')) { + $f = fopen('/dev/urandom', 'r'); + $read = PasswordCompat\binary\_strlen($buffer); + while ($read < $raw_salt_len) { + $buffer .= fread($f, $raw_salt_len - $read); + $read = PasswordCompat\binary\_strlen($buffer); + } + fclose($f); + if ($read >= $raw_salt_len) { + $buffer_valid = true; + } + } + if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) { + $bl = PasswordCompat\binary\_strlen($buffer); + for ($i = 0; $i < $raw_salt_len; $i++) { + if ($i < $bl) { + $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); + } else { + $buffer .= chr(mt_rand(0, 255)); + } + } + } + $salt = $buffer; + $salt_requires_encoding = true; + } + if ($salt_requires_encoding) { + // encode string with the Base64 variant used by crypt + $base64_digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + $bcrypt64_digits = + './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + $base64_string = base64_encode($salt); + $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits); + } + $salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len); + + $hash = $hash_format . $salt; + + $ret = crypt($password, $hash); + + if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) { + return false; + } + + return $ret; + } + + /** + * Get information about the password hash. Returns an array of the information + * that was used to generate the password hash. + * + * array( + * 'algo' => 1, + * 'algoName' => 'bcrypt', + * 'options' => array( + * 'cost' => PASSWORD_BCRYPT_DEFAULT_COST, + * ), + * ) + * + * @param string $hash The password hash to extract info from + * + * @return array The array of information about the hash. + */ + function password_get_info($hash) { + $return = array( + 'algo' => 0, + 'algoName' => 'unknown', + 'options' => array(), + ); + if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) { + $return['algo'] = PASSWORD_BCRYPT; + $return['algoName'] = 'bcrypt'; + list($cost) = sscanf($hash, "$2y$%d$"); + $return['options']['cost'] = $cost; + } + return $return; + } + + /** + * Determine if the password hash needs to be rehashed according to the options provided + * + * If the answer is true, after validating the password using password_verify, rehash it. + * + * @param string $hash The hash to test + * @param int $algo The algorithm used for new password hashes + * @param array $options The options array passed to password_hash + * + * @return boolean True if the password needs to be rehashed. + */ + function password_needs_rehash($hash, $algo, array $options = array()) { + $info = password_get_info($hash); + if ($info['algo'] != $algo) { + return true; + } + switch ($algo) { + case PASSWORD_BCRYPT: + $cost = isset($options['cost']) ? $options['cost'] : PASSWORD_BCRYPT_DEFAULT_COST; + if ($cost != $info['options']['cost']) { + return true; + } + break; + } + return false; + } + + /** + * Verify a password against a hash using a timing attack resistant approach + * + * @param string $password The password to verify + * @param string $hash The hash to verify against + * + * @return boolean If the password matches the hash + */ + function password_verify($password, $hash) { + if (!function_exists('crypt')) { + trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); + return false; + } + $ret = crypt($password, $hash); + if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) { + return false; + } + + $status = 0; + for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) { + $status |= (ord($ret[$i]) ^ ord($hash[$i])); + } + + return $status === 0; + } + } + +} + +namespace PasswordCompat\binary { + + if (!function_exists('PasswordCompat\\binary\\_strlen')) { + + /** + * Count the number of bytes in a string + * + * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension. + * In this case, strlen() will count the number of *characters* based on the internal encoding. A + * sequence of bytes might be regarded as a single multibyte character. + * + * @param string $binary_string The input string + * + * @internal + * @return int The number of bytes + */ + function _strlen($binary_string) { + if (function_exists('mb_strlen')) { + return mb_strlen($binary_string, '8bit'); + } + return strlen($binary_string); + } + + /** + * Get a substring based on byte limits + * + * @see _strlen() + * + * @param string $binary_string The input string + * @param int $start + * @param int $length + * + * @internal + * @return string The substring + */ + function _substr($binary_string, $start, $length) { + if (function_exists('mb_substr')) { + return mb_substr($binary_string, $start, $length, '8bit'); + } + return substr($binary_string, $start, $length); + } + + /** + * Check if current PHP version is compatible with the library + * + * @return boolean the check result + */ + function check() { + static $pass = NULL; + + if (is_null($pass)) { + if (function_exists('crypt')) { + $hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG'; + $test = crypt("password", $hash); + $pass = $test == $hash; + } else { + $pass = false; + } + } + return $pass; + } + + } +} \ No newline at end of file diff --git a/vendor/maximebf/debugbar/.gitattributes b/vendor/maximebf/debugbar/.gitattributes new file mode 100644 index 0000000..bd075ec --- /dev/null +++ b/vendor/maximebf/debugbar/.gitattributes @@ -0,0 +1,12 @@ +* text=auto + +/docs export-ignore +/demo export-ignore +/tests export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml.dist export-ignore +/CHANGELOG.md export-ignore +/CONTRIBUTING.md export-ignore +/README.md export-ignore diff --git a/vendor/maximebf/debugbar/CHANGELOG.md b/vendor/maximebf/debugbar/CHANGELOG.md new file mode 100644 index 0000000..0e51a58 --- /dev/null +++ b/vendor/maximebf/debugbar/CHANGELOG.md @@ -0,0 +1,95 @@ +# Changelog + +2014-12 (1.10.2): + + - Use Symfony VarDumper instead of kintLite as DataFormatter (#179) + - Better resize handling (#185) + +2014-11 (1.10.1): + + - Add disableVendor() option to JavascriptRenderer to remove a specific vendor (#182) + - Fix macros in Twig Collector (#167, #177) + - Update Font Awesome to 4.2.0 + +2014-10 (1.10.0): + + - Add bindToXHR() as alternative to jQuery ajax handling. + - Extend TemplateWidget to show more information + parameters + - Extend TimeDataCollector to show parameters + collector source + +2014-08: + + - Replace image files with inline data in css + - Tweak OpenHandler display + +2014-06-10: + + - Add LocalizationCollector + +2014-03-29: + + - Add hasMeasure() method to TimeDataCollector + +2014-03-25: + + - Duplicate SQL detection + +2014-03-23: + + - Add syntax highlighting + +2014-03-22: + + - added AssetProvider interface + - added JavascriptRenderer::addAssets() + - added Memcached storage + +2014-01-04: + + - added DataFormatter + +2013-12-29: + + - display an error where the header is too large when sending data with an ajax request + - close button instead of minimize + +2013-12-27: + + - responsiveness of the debugbar in the browser + +2013-12-19: + + - use Bower to manage assets + +2013-10-24: + + - added option to render sql with params in PDO collector + +2013-10-06: + + - prefixed all css classes + - new PhpDebugBar.utils.csscls() function + - changed datetime to time in datasets selector + - close and open buttons now uses images instead of font-awesome + +2013-09-23: + + - send the request id in headers and use the open handler to retreive the dataset + - !! modified sendDataAsHeaders() to add $useOpenHandler as the first argument + - OpenHandler::handle() can now take any objects implementing ArrayAccess as request data + +2013-09-19: + + - added HttpDriver + - added jQuery.noConflict() managment + +2013-09-15 (1.6): + + - added sending data through HTTP headers + - added stacked data + - bug fixes + +1.5: + + - added storage + - added open handler diff --git a/vendor/maximebf/debugbar/CONTRIBUTING.md b/vendor/maximebf/debugbar/CONTRIBUTING.md new file mode 100644 index 0000000..15e8062 --- /dev/null +++ b/vendor/maximebf/debugbar/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing to PHP DebugBar + +First of all, thank you for contributing! + +All contributions are welcome as long as they come through pull requests. +Each PR will be reviewed and eventually accepted. Some changes may be required before integration. + +A contribution must follow the following guidelines: + + - PHP code convention must follow PSR-1 + - Javascript code convention described below + - Unit tests must be added/updated and pass + - Docs must be updated for new features + - Changelog must be updated (bug fix are not required to be added to the changelog) + - ensure that examples in demo/ folder are still working + +Javascript code convention: + + - based on: http://javascript.crockford.com/code.html + - blank lines between attributes of a class declaration + - jsdoc comments + - all code in a file must be wrapped into an anonymous function + - variables representing jquery objects must be prefixed with a dollar sign diff --git a/vendor/maximebf/debugbar/LICENSE b/vendor/maximebf/debugbar/LICENSE new file mode 100644 index 0000000..1344c98 --- /dev/null +++ b/vendor/maximebf/debugbar/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2013 Maxime Bouroumeau-Fuseau + +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. diff --git a/vendor/maximebf/debugbar/README.md b/vendor/maximebf/debugbar/README.md new file mode 100644 index 0000000..4122fb8 --- /dev/null +++ b/vendor/maximebf/debugbar/README.md @@ -0,0 +1,100 @@ +# PHP Debug Bar + +[![Latest Stable Version](https://poser.pugx.org/maximebf/debugbar/v/stable.png)](https://packagist.org/packages/maximebf/debugbar) [![Total Downloads](https://poser.pugx.org/maximebf/debugbar/downloads.svg)](https://packagist.org/packages/maximebf/debugbar) [![License](https://poser.pugx.org/maximebf/debugbar/license.svg)](https://packagist.org/packages/maximebf/debugbar) [![Build Status](https://travis-ci.org/maximebf/php-debugbar.png?branch=master)](https://travis-ci.org/maximebf/php-debugbar) + +Displays a debug bar in the browser with information from php. +No more `var_dump()` in your code! + +![Screenshot](https://raw.github.com/maximebf/php-debugbar/master/docs/screenshot.png) + +**Features:** + + - Generic debug bar + - Easy to integrate with any project + - Clean, fast and easy to use interface + - Handles AJAX request + - Includes generic data collectors and collectors for well known libraries + - The client side bar is 100% coded in javascript + - Easily create your own collectors and their associated view in the bar + - Save and re-open previous requests + - [Very well documented](http://phpdebugbar.com/docs) + +Includes collectors for: + + - [PDO](http://php.net/manual/en/book.pdo.php) + - [CacheCache](http://maximebf.github.io/CacheCache/) + - [Doctrine](http://doctrine-project.org) + - [Monolog](https://github.com/Seldaek/monolog) + - [Propel](http://propelorm.org/) + - [Slim](http://slimframework.com) + - [Swift Mailer](http://swiftmailer.org/) + - [Twig](http://twig.sensiolabs.org/) + +Checkout the [demo](https://github.com/maximebf/php-debugbar/tree/master/demo) for +examples and [phpdebugbar.com](http://phpdebugbar.com) for a live example. + +Integrations with other frameworks: + + - [Laravel](https://github.com/barryvdh/laravel-debugbar) + - [Atomik](http://atomikframework.com/docs/error-log-debug.html#debug-bar) + - [XOOPS](http://xoops.org/modules/news/article.php?storyid=6538) + - [Zend Framework 2](https://github.com/snapshotpl/ZfSnapPhpDebugBar) + - [Phalcon](https://github.com/snowair/phalcon-debugbar) + - Framework-agnostic middleware and PSR-7 with [php-middleware/phpdebugbar](https://github.com/php-middleware/phpdebugbar). + +*(drop me a message or submit a PR to add your DebugBar related project here)* + +## Installation + +The best way to install DebugBar is using [Composer](http://getcomposer.org) +with the following command: + +```composer require maximebf/debugbar``` + +## Quick start + +DebugBar is very easy to use and you can add it to any of your projects in no time. +The easiest way is using the `render()` functions + +```PHP +getJavascriptRenderer(); + +$debugbar["messages"]->addMessage("hello world!"); +?> + + + renderHead() ?> + + + ... + render() ?> + + +``` + +The DebugBar uses DataCollectors to collect data from your PHP code. Some of them are +automated but others are manual. Use the `DebugBar` like an array where keys are the +collector names. In our previous example, we add a message to the `MessagesCollector`: + +```PHP +$debugbar["messages"]->addMessage("hello world!"); +``` + +`StandardDebugBar` activates the following collectors: + + - `MemoryCollector` (*memory*) + - `MessagesCollector` (*messages*) + - `PhpInfoCollector` (*php*) + - `RequestDataCollector` (*request*) + - `TimeDataCollector` (*time*) + - `ExceptionsCollector` (*exceptions*) + +Learn more about DebugBar in the [docs](http://phpdebugbar.com/docs). diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/CacheCacheCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/CacheCacheCollector.php new file mode 100644 index 0000000..3d841c6 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/CacheCacheCollector.php @@ -0,0 +1,62 @@ + + * $debugbar->addCollector(new CacheCacheCollector(CacheManager::get('default'))); + * // or + * $debugbar->addCollector(new CacheCacheCollector()); + * $debugbar['cache']->addCache(CacheManager::get('default')); + * + */ +class CacheCacheCollector extends MonologCollector +{ + protected $logger; + + public function __construct(Cache $cache = null, Logger $logger = null, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct(null, $level, $bubble); + + if ($logger === null) { + $logger = new Logger('Cache'); + } + $this->logger = $logger; + + if ($cache !== null) { + $this->addCache($cache); + } + } + + public function addCache(Cache $cache) + { + $backend = $cache->getBackend(); + if (!($backend instanceof LoggingBackend)) { + $backend = new LoggingBackend($backend, $this->logger); + } + $cache->setBackend($backend); + $this->addLogger($backend->getLogger()); + } + + public function getName() + { + return 'cache'; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/DoctrineCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/DoctrineCollector.php new file mode 100644 index 0000000..6fa358e --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/DoctrineCollector.php @@ -0,0 +1,98 @@ + + * $debugStack = new Doctrine\DBAL\Logging\DebugStack(); + * $entityManager->getConnection()->getConfiguration()->setSQLLogger($debugStack); + * $debugbar->addCollector(new DoctrineCollector($debugStack)); + * + */ +class DoctrineCollector extends DataCollector implements Renderable, AssetProvider +{ + protected $debugStack; + + public function __construct($debugStackOrEntityManager) + { + if ($debugStackOrEntityManager instanceof EntityManager) { + $debugStackOrEntityManager = $debugStackOrEntityManager->getConnection()->getConfiguration()->getSQLLogger(); + } + if (!($debugStackOrEntityManager instanceof DebugStack)) { + throw new DebugBarException("'DoctrineCollector' requires an 'EntityManager' or 'DebugStack' object"); + } + $this->debugStack = $debugStackOrEntityManager; + } + + public function collect() + { + $queries = array(); + $totalExecTime = 0; + foreach ($this->debugStack->queries as $q) { + $queries[] = array( + 'sql' => $q['sql'], + 'params' => (object) $q['params'], + 'duration' => $q['executionMS'], + 'duration_str' => $this->formatDuration($q['executionMS']) + ); + $totalExecTime += $q['executionMS']; + } + + return array( + 'nb_statements' => count($queries), + 'accumulated_duration' => $totalExecTime, + 'accumulated_duration_str' => $this->formatDuration($totalExecTime), + 'statements' => $queries + ); + } + + public function getName() + { + return 'doctrine'; + } + + public function getWidgets() + { + return array( + "database" => array( + "icon" => "arrow-right", + "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget", + "map" => "doctrine", + "default" => "[]" + ), + "database:badge" => array( + "map" => "doctrine.nb_statements", + "default" => 0 + ) + ); + } + + public function getAssets() + { + return array( + 'css' => 'widgets/sqlqueries/widget.css', + 'js' => 'widgets/sqlqueries/widget.js' + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/MonologCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/MonologCollector.php new file mode 100644 index 0000000..609d5c5 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/MonologCollector.php @@ -0,0 +1,103 @@ + + * $debugbar->addCollector(new MonologCollector($logger)); + * + */ +class MonologCollector extends AbstractProcessingHandler implements DataCollectorInterface, Renderable, MessagesAggregateInterface +{ + protected $name; + + protected $records = array(); + + /** + * @param Logger $logger + * @param int $level + * @param boolean $bubble + * @param string $name + */ + public function __construct(Logger $logger = null, $level = Logger::DEBUG, $bubble = true, $name = 'monolog') + { + parent::__construct($level, $bubble); + $this->name = $name; + if ($logger !== null) { + $this->addLogger($logger); + } + } + + /** + * Adds logger which messages you want to log + * + * @param Logger $logger + */ + public function addLogger(Logger $logger) + { + $logger->pushHandler($this); + } + + protected function write(array $record) + { + $this->records[] = array( + 'message' => $record['formatted'], + 'is_string' => true, + 'label' => strtolower($record['level_name']), + 'time' => $record['datetime']->format('U') + ); + } + + public function getMessages() + { + return $this->records; + } + + public function collect() + { + return array( + 'count' => count($this->records), + 'records' => $this->records + ); + } + + public function getName() + { + return $this->name; + } + + public function getWidgets() + { + $name = $this->getName(); + return array( + $name => array( + "icon" => "suitcase", + "widget" => "PhpDebugBar.Widgets.MessagesWidget", + "map" => "$name.records", + "default" => "[]" + ), + "$name:badge" => array( + "map" => "$name.count", + "default" => "null" + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/Propel2Collector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Propel2Collector.php new file mode 100644 index 0000000..3df4dcc --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Propel2Collector.php @@ -0,0 +1,307 @@ + + * $debugbar->addCollector(new \DebugBar\Bridge\Propel2Collector(\Propel\Runtime\Propel::getServiceContainer()->getReadConnection())); + * + */ +class Propel2Collector extends DataCollector implements Renderable, AssetProvider +{ + /** + * @var null|TestHandler + */ + protected $handler = null; + + /** + * @var null|Logger + */ + protected $logger = null; + + /** + * @var array + */ + protected $config = array(); + + /** + * @var array + */ + protected $errors = array(); + + /** + * @var int + */ + protected $queryCount = 0; + + /** + * @param ConnectionInterface $connection Propel connection + */ + public function __construct( + ConnectionInterface $connection, + array $logMethods = array( + 'beginTransaction', + 'commit', + 'rollBack', + 'forceRollBack', + 'exec', + 'query', + 'execute' + ) + ) { + if ($connection instanceof ProfilerConnectionWrapper) { + $connection->setLogMethods($logMethods); + + $this->config = $connection->getProfiler()->getConfiguration(); + + $this->handler = new TestHandler(); + + if ($connection->getLogger() instanceof Logger) { + $this->logger = $connection->getLogger(); + $this->logger->pushHandler($this->handler); + } else { + $this->errors[] = 'Supported only monolog logger'; + } + } else { + $this->errors[] = 'You need set ProfilerConnectionWrapper'; + } + } + + /** + * @return TestHandler|null + */ + public function getHandler() + { + return $this->handler; + } + + /** + * @return array + */ + public function getConfig() + { + return $this->config; + } + + /** + * @return Logger|null + */ + public function getLogger() + { + return $this->logger; + } + + /** + * @return LoggerInterface + */ + protected function getDefaultLogger() + { + return Propel::getServiceContainer()->getLogger(); + } + + /** + * @return int + */ + protected function getQueryCount() + { + return $this->queryCount; + } + + /** + * @param array $records + * @param array $config + * @return array + */ + protected function getStatements($records, $config) + { + $statements = array(); + foreach ($records as $record) { + $duration = null; + $memory = null; + + $isSuccess = ( LogLevel::INFO === strtolower($record['level_name']) ); + + $detailsCount = count($config['details']); + $parameters = explode($config['outerGlue'], $record['message'], $detailsCount + 1); + if (count($parameters) === ($detailsCount + 1)) { + $parameters = array_map('trim', $parameters); + $_details = array(); + foreach (array_splice($parameters, 0, $detailsCount) as $string) { + list($key, $value) = array_map('trim', explode($config['innerGlue'], $string, 2)); + $_details[$key] = $value; + } + + $details = array(); + foreach ($config['details'] as $key => $detail) { + if (isset($_details[$detail['name']])) { + $value = $_details[$detail['name']]; + if ('time' === $key) { + if (substr_count($value, 'ms')) { + $value = (float)$value / 1000; + } else { + $value = (float)$value; + } + } else { + $suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); + $suffix = substr($value, -2); + $i = array_search($suffix, $suffixes, true); + $i = (false === $i) ? 0 : $i; + + $value = ((float)$value) * pow(1024, $i); + } + $details[$key] = $value; + } + } + + if (isset($details['time'])) { + $duration = $details['time']; + } + if (isset($details['memDelta'])) { + $memory = $details['memDelta']; + } + + $message = end($parameters); + + if ($isSuccess) { + $this->queryCount++; + } + + } else { + $message = $record['message']; + } + + $statement = array( + 'sql' => $message, + 'is_success' => $isSuccess, + 'duration' => $duration, + 'duration_str' => $this->getDataFormatter()->formatDuration($duration), + 'memory' => $memory, + 'memory_str' => $this->getDataFormatter()->formatBytes($memory), + ); + + if (false === $isSuccess) { + $statement['sql'] = ''; + $statement['error_code'] = $record['level']; + $statement['error_message'] = $message; + } + + $statements[] = $statement; + } + return $statements; + } + + /** + * @return array + */ + public function collect() + { + if (count($this->errors)) { + return array( + 'statements' => array_map(function ($message) { + return array('sql' => '', 'is_success' => false, 'error_code' => 500, 'error_message' => $message); + }, $this->errors), + 'nb_statements' => 0, + 'nb_failed_statements' => count($this->errors), + ); + } + + if ($this->getHandler() === null) { + return array(); + } + + $statements = $this->getStatements($this->getHandler()->getRecords(), $this->getConfig()); + + $failedStatement = count(array_filter($statements, function ($statement) { + return false === $statement['is_success']; + })); + $accumulatedDuration = array_reduce($statements, function ($accumulatedDuration, $statement) { + + $time = isset($statement['duration']) ? $statement['duration'] : 0; + return $accumulatedDuration += $time; + }); + $memoryUsage = array_reduce($statements, function ($memoryUsage, $statement) { + + $time = isset($statement['memory']) ? $statement['memory'] : 0; + return $memoryUsage += $time; + }); + + return array( + 'nb_statements' => $this->getQueryCount(), + 'nb_failed_statements' => $failedStatement, + 'accumulated_duration' => $accumulatedDuration, + 'accumulated_duration_str' => $this->getDataFormatter()->formatDuration($accumulatedDuration), + 'memory_usage' => $memoryUsage, + 'memory_usage_str' => $this->getDataFormatter()->formatBytes($memoryUsage), + 'statements' => $statements + ); + } + + /** + * @return string + */ + public function getName() + { + $additionalName = ''; + if ($this->getLogger() !== $this->getDefaultLogger()) { + $additionalName = ' ('.$this->getLogger()->getName().')'; + } + + return 'propel2'.$additionalName; + } + + /** + * @return array + */ + public function getWidgets() + { + return array( + $this->getName() => array( + 'icon' => 'bolt', + 'widget' => 'PhpDebugBar.Widgets.SQLQueriesWidget', + 'map' => $this->getName(), + 'default' => '[]' + ), + $this->getName().':badge' => array( + 'map' => $this->getName().'.nb_statements', + 'default' => 0 + ), + ); + } + + /** + * @return array + */ + public function getAssets() + { + return array( + 'css' => 'widgets/sqlqueries/widget.css', + 'js' => 'widgets/sqlqueries/widget.js' + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/PropelCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/PropelCollector.php new file mode 100644 index 0000000..93ad4ff --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/PropelCollector.php @@ -0,0 +1,253 @@ + + * $debugbar->addCollector(new PropelCollector($debugbar['messages'])); + * PropelCollector::enablePropelProfiling(); + * + */ +class PropelCollector extends DataCollector implements BasicLogger, Renderable, AssetProvider +{ + protected $logger; + + protected $statements = array(); + + protected $accumulatedTime = 0; + + protected $peakMemory = 0; + + /** + * Sets the needed configuration option in propel to enable query logging + * + * @param PropelConfiguration $config Apply profiling on a specific config + */ + public static function enablePropelProfiling(PropelConfiguration $config = null) + { + if ($config === null) { + $config = Propel::getConfiguration(PropelConfiguration::TYPE_OBJECT); + } + $config->setParameter('debugpdo.logging.details.method.enabled', true); + $config->setParameter('debugpdo.logging.details.time.enabled', true); + $config->setParameter('debugpdo.logging.details.mem.enabled', true); + $allMethods = array( + 'PropelPDO::__construct', // logs connection opening + 'PropelPDO::__destruct', // logs connection close + 'PropelPDO::exec', // logs a query + 'PropelPDO::query', // logs a query + 'PropelPDO::beginTransaction', // logs a transaction begin + 'PropelPDO::commit', // logs a transaction commit + 'PropelPDO::rollBack', // logs a transaction rollBack (watch out for the capital 'B') + 'DebugPDOStatement::execute', // logs a query from a prepared statement + ); + $config->setParameter('debugpdo.logging.methods', $allMethods, false); + } + + /** + * @param LoggerInterface $logger A logger to forward non-query log lines to + * @param PropelPDO $conn Bound this collector to a connection only + */ + public function __construct(LoggerInterface $logger = null, PropelPDO $conn = null) + { + if ($conn) { + $conn->setLogger($this); + } else { + Propel::setLogger($this); + } + $this->logger = $logger; + $this->logQueriesToLogger = false; + } + + public function setLogQueriesToLogger($enable = true) + { + $this->logQueriesToLogger = $enable; + return $this; + } + + public function isLogQueriesToLogger() + { + return $this->logQueriesToLogger; + } + + public function emergency($m) + { + $this->log($m, Propel::LOG_EMERG); + } + + public function alert($m) + { + $this->log($m, Propel::LOG_ALERT); + } + + public function crit($m) + { + $this->log($m, Propel::LOG_CRIT); + } + + public function err($m) + { + $this->log($m, Propel::LOG_ERR); + } + + public function warning($m) + { + $this->log($m, Propel::LOG_WARNING); + } + + public function notice($m) + { + $this->log($m, Propel::LOG_NOTICE); + } + + public function info($m) + { + $this->log($m, Propel::LOG_INFO); + } + + public function debug($m) + { + $this->log($m, Propel::LOG_DEBUG); + } + + public function log($message, $severity = null) + { + if (strpos($message, 'DebugPDOStatement::execute') !== false) { + list($sql, $duration_str) = $this->parseAndLogSqlQuery($message); + if (!$this->logQueriesToLogger) { + return; + } + $message = "$sql ($duration_str)"; + } + + if ($this->logger !== null) { + $this->logger->log($this->convertLogLevel($severity), $message); + } + } + + /** + * Converts Propel log levels to PSR log levels + * + * @param int $level + * @return string + */ + protected function convertLogLevel($level) + { + $map = array( + Propel::LOG_EMERG => LogLevel::EMERGENCY, + Propel::LOG_ALERT => LogLevel::ALERT, + Propel::LOG_CRIT => LogLevel::CRITICAL, + Propel::LOG_ERR => LogLevel::ERROR, + Propel::LOG_WARNING => LogLevel::WARNING, + Propel::LOG_NOTICE => LogLevel::NOTICE, + Propel::LOG_DEBUG => LogLevel::DEBUG + ); + return $map[$level]; + } + + /** + * Parse a log line to extract query information + * + * @param string $message + */ + protected function parseAndLogSqlQuery($message) + { + $parts = explode('|', $message, 4); + $sql = trim($parts[3]); + + $duration = 0; + if (preg_match('/([0-9]+\.[0-9]+)/', $parts[1], $matches)) { + $duration = (float) $matches[1]; + } + + $memory = 0; + if (preg_match('/([0-9]+\.[0-9]+) ([A-Z]{1,2})/', $parts[2], $matches)) { + $memory = (float) $matches[1]; + if ($matches[2] == 'KB') { + $memory *= 1024; + } elseif ($matches[2] == 'MB') { + $memory *= 1024 * 1024; + } + } + + $this->statements[] = array( + 'sql' => $sql, + 'is_success' => true, + 'duration' => $duration, + 'duration_str' => $this->formatDuration($duration), + 'memory' => $memory, + 'memory_str' => $this->formatBytes($memory) + ); + $this->accumulatedTime += $duration; + $this->peakMemory = max($this->peakMemory, $memory); + return array($sql, $this->formatDuration($duration)); + } + + public function collect() + { + return array( + 'nb_statements' => count($this->statements), + 'nb_failed_statements' => 0, + 'accumulated_duration' => $this->accumulatedTime, + 'accumulated_duration_str' => $this->formatDuration($this->accumulatedTime), + 'peak_memory_usage' => $this->peakMemory, + 'peak_memory_usage_str' => $this->formatBytes($this->peakMemory), + 'statements' => $this->statements + ); + } + + public function getName() + { + return 'propel'; + } + + public function getWidgets() + { + return array( + "propel" => array( + "icon" => "bolt", + "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget", + "map" => "propel", + "default" => "[]" + ), + "propel:badge" => array( + "map" => "propel.nb_statements", + "default" => 0 + ) + ); + } + + public function getAssets() + { + return array( + 'css' => 'widgets/sqlqueries/widget.css', + 'js' => 'widgets/sqlqueries/widget.js' + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/SlimCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/SlimCollector.php new file mode 100644 index 0000000..030a3ba --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/SlimCollector.php @@ -0,0 +1,66 @@ +slim = $slim; + if ($log = $slim->getLog()) { + $this->originalLogWriter = $log->getWriter(); + $log->setWriter($this); + $log->setEnabled(true); + } + } + + public function write($message, $level) + { + if ($this->originalLogWriter) { + $this->originalLogWriter->write($message, $level); + } + $this->addMessage($message, $this->getLevelName($level)); + } + + protected function getLevelName($level) + { + $map = array( + Log::EMERGENCY => LogLevel::EMERGENCY, + Log::ALERT => LogLevel::ALERT, + Log::CRITICAL => LogLevel::CRITICAL, + Log::ERROR => LogLevel::ERROR, + Log::WARN => LogLevel::WARNING, + Log::NOTICE => LogLevel::NOTICE, + Log::INFO => LogLevel::INFO, + Log::DEBUG => LogLevel::DEBUG + ); + return $map[$level]; + } + + public function getName() + { + return 'slim'; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php new file mode 100644 index 0000000..fdef79a --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftLogCollector.php @@ -0,0 +1,44 @@ +registerPlugin(new Swift_Plugins_LoggerPlugin($this)); + } + + public function add($entry) + { + $this->addMessage($entry); + } + + public function dump() + { + return implode(PHP_EOL, $this->_log); + } + + public function getName() + { + return 'swiftmailer_logs'; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php new file mode 100644 index 0000000..01a5e90 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/SwiftMailer/SwiftMailCollector.php @@ -0,0 +1,92 @@ +messagesLogger = new Swift_Plugins_MessageLogger(); + $mailer->registerPlugin($this->messagesLogger); + } + + public function collect() + { + $mails = array(); + foreach ($this->messagesLogger->getMessages() as $msg) { + $mails[] = array( + 'to' => $this->formatTo($msg->getTo()), + 'subject' => $msg->getSubject(), + 'headers' => $msg->getHeaders()->toString() + ); + } + return array( + 'count' => count($mails), + 'mails' => $mails + ); + } + + protected function formatTo($to) + { + if (!$to) { + return ''; + } + + $f = array(); + foreach ($to as $k => $v) { + $f[] = (empty($v) ? '' : "$v ") . "<$k>"; + } + return implode(', ', $f); + } + + public function getName() + { + return 'swiftmailer_mails'; + } + + public function getWidgets() + { + return array( + 'emails' => array( + 'icon' => 'inbox', + 'widget' => 'PhpDebugBar.Widgets.MailsWidget', + 'map' => 'swiftmailer_mails.mails', + 'default' => '[]', + 'title' => 'Mails' + ), + 'emails:badge' => array( + 'map' => 'swiftmailer_mails.count', + 'default' => 'null' + ) + ); + } + + public function getAssets() + { + return array( + 'css' => 'widgets/mails/widget.css', + 'js' => 'widgets/mails/widget.js' + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php new file mode 100644 index 0000000..0d4c957 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigEnvironment.php @@ -0,0 +1,417 @@ +twig = $twig; + $this->timeDataCollector = $timeDataCollector; + } + + public function __call($name, $arguments) + { + return call_user_func_array(array($this->twig, $name), $arguments); + } + + public function getRenderedTemplates() + { + return $this->renderedTemplates; + } + + public function addRenderedTemplate(array $info) + { + $this->renderedTemplates[] = $info; + } + + public function getTimeDataCollector() + { + return $this->timeDataCollector; + } + + public function getBaseTemplateClass() + { + return $this->twig->getBaseTemplateClass(); + } + + public function setBaseTemplateClass($class) + { + $this->twig->setBaseTemplateClass($class); + } + + public function enableDebug() + { + $this->twig->enableDebug(); + } + + public function disableDebug() + { + $this->twig->disableDebug(); + } + + public function isDebug() + { + return $this->twig->isDebug(); + } + + public function enableAutoReload() + { + $this->twig->enableAutoReload(); + } + + public function disableAutoReload() + { + $this->twig->disableAutoReload(); + } + + public function isAutoReload() + { + return $this->twig->isAutoReload(); + } + + public function enableStrictVariables() + { + $this->twig->enableStrictVariables(); + } + + public function disableStrictVariables() + { + $this->twig->disableStrictVariables(); + } + + public function isStrictVariables() + { + return $this->twig->isStrictVariables(); + } + + public function getCache() + { + return $this->twig->getCache(); + } + + public function setCache($cache) + { + $this->twig->setCache($cache); + } + + public function getCacheFilename($name) + { + return $this->twig->getCacheFilename($name); + } + + public function getTemplateClass($name, $index = null) + { + return $this->twig->getTemplateClass($name, $index); + } + + public function getTemplateClassPrefix() + { + return $this->twig->getTemplateClassPrefix(); + } + + public function render($name, array $context = array()) + { + return $this->loadTemplate($name)->render($context); + } + + public function display($name, array $context = array()) + { + $this->loadTemplate($name)->display($context); + } + + public function loadTemplate($name, $index = null) + { + $cls = $this->twig->getTemplateClass($name, $index); + + if (isset($this->twig->loadedTemplates[$cls])) { + return $this->twig->loadedTemplates[$cls]; + } + + if (!class_exists($cls, false)) { + if (false === $cache = $this->getCacheFilename($name)) { + eval('?>'.$this->compileSource($this->getLoader()->getSource($name), $name)); + } else { + if (!is_file($cache) || ($this->isAutoReload() && !$this->isTemplateFresh($name, filemtime($cache)))) { + $this->writeCacheFile($cache, $this->compileSource($this->getLoader()->getSource($name), $name)); + } + + require_once $cache; + } + } + + if (!$this->twig->runtimeInitialized) { + $this->initRuntime(); + } + + return $this->twig->loadedTemplates[$cls] = new TraceableTwigTemplate($this, new $cls($this)); + } + + public function isTemplateFresh($name, $time) + { + return $this->twig->isTemplateFresh($name, $time); + } + + public function resolveTemplate($names) + { + return $this->twig->resolveTemplate($names); + } + + public function clearTemplateCache() + { + $this->twig->clearTemplateCache(); + } + + public function clearCacheFiles() + { + $this->twig->clearCacheFiles(); + } + + public function getLexer() + { + return $this->twig->getLexer(); + } + + public function setLexer(Twig_LexerInterface $lexer) + { + $this->twig->setLexer($lexer); + } + + public function tokenize($source, $name = null) + { + return $this->twig->tokenize($source, $name); + } + + public function getParser() + { + return $this->twig->getParser(); + } + + public function setParser(Twig_ParserInterface $parser) + { + $this->twig->setParser($parser); + } + + public function parse(Twig_TokenStream $tokens) + { + return $this->twig->parse($tokens); + } + + public function getCompiler() + { + return $this->twig->getCompiler(); + } + + public function setCompiler(Twig_CompilerInterface $compiler) + { + $this->twig->setCompiler($compiler); + } + + public function compile(Twig_NodeInterface $node) + { + return $this->twig->compile($node); + } + + public function compileSource($source, $name = null) + { + return $this->twig->compileSource($source, $name); + } + + public function setLoader(Twig_LoaderInterface $loader) + { + $this->twig->setLoader($loader); + } + + public function getLoader() + { + return $this->twig->getLoader(); + } + + public function setCharset($charset) + { + $this->twig->setCharset($charset); + } + + public function getCharset() + { + return $this->twig->getCharset(); + } + + public function initRuntime() + { + $this->twig->initRuntime(); + } + + public function hasExtension($name) + { + return $this->twig->hasExtension($name); + } + + public function getExtension($name) + { + return $this->twig->getExtension($name); + } + + public function addExtension(Twig_ExtensionInterface $extension) + { + $this->twig->addExtension($extension); + } + + public function removeExtension($name) + { + $this->twig->removeExtension($name); + } + + public function setExtensions(array $extensions) + { + $this->twig->setExtensions($extensions); + } + + public function getExtensions() + { + return $this->twig->getExtensions(); + } + + public function addTokenParser(Twig_TokenParserInterface $parser) + { + $this->twig->addTokenParser($parser); + } + + public function getTokenParsers() + { + return $this->twig->getTokenParsers(); + } + + public function getTags() + { + return $this->twig->getTags(); + } + + public function addNodeVisitor(Twig_NodeVisitorInterface $visitor) + { + $this->twig->addNodeVisitor($visitor); + } + + public function getNodeVisitors() + { + return $this->twig->getNodeVisitors(); + } + + public function addFilter($name, $filter = null) + { + $this->twig->addFilter($name, $filter); + } + + public function getFilter($name) + { + return $this->twig->getFilter($name); + } + + public function registerUndefinedFilterCallback($callable) + { + $this->twig->registerUndefinedFilterCallback($callable); + } + + public function getFilters() + { + return $this->twig->getFilters(); + } + + public function addTest($name, $test = null) + { + $this->twig->addTest($name, $test); + } + + public function getTests() + { + return $this->twig->getTests(); + } + + public function getTest($name) + { + return $this->twig->getTest($name); + } + + public function addFunction($name, $function = null) + { + $this->twig->addFunction($name, $function); + } + + public function getFunction($name) + { + return $this->twig->getFunction($name); + } + + public function registerUndefinedFunctionCallback($callable) + { + $this->twig->registerUndefinedFunctionCallback($callable); + } + + public function getFunctions() + { + return $this->twig->getFunctions(); + } + + public function addGlobal($name, $value) + { + $this->twig->addGlobal($name, $value); + } + + public function getGlobals() + { + return $this->twig->getGlobals(); + } + + public function mergeGlobals(array $context) + { + return $this->twig->mergeGlobals($context); + } + + public function getUnaryOperators() + { + return $this->twig->getUnaryOperators(); + } + + public function getBinaryOperators() + { + return $this->twig->getBinaryOperators(); + } + + public function computeAlternatives($name, $items) + { + return $this->twig->computeAlternatives($name, $items); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php new file mode 100644 index 0000000..dab53d1 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TraceableTwigTemplate.php @@ -0,0 +1,131 @@ +env = $env; + $this->template = $template; + } + + public function __call($name, $arguments) + { + return call_user_func_array(array($this->template, $name), $arguments); + } + + public function getTemplateName() + { + return $this->template->getTemplateName(); + } + + public function getEnvironment() + { + return $this->template->getEnvironment(); + } + + public function getParent(array $context) + { + return $this->template->getParent($context); + } + + public function isTraitable() + { + return $this->template->isTraitable(); + } + + public function displayParentBlock($name, array $context, array $blocks = array()) + { + $this->template->displayParentBlock($name, $context, $blocks); + } + + public function displayBlock($name, array $context, array $blocks = array(), $useBlocks = true) + { + $this->template->displayBlock($name, $context, $blocks, $useBlocks); + } + + public function renderParentBlock($name, array $context, array $blocks = array()) + { + return $this->template->renderParentBlock($name, $context, $blocks); + } + + public function renderBlock($name, array $context, array $blocks = array(), $useBlocks = true) + { + return $this->template->renderBlock($name, $context, $blocks, $useBlocks); + } + + public function hasBlock($name) + { + return $this->template->hasBlock($name); + } + + public function getBlockNames() + { + return $this->template->getBlockNames(); + } + + public function getBlocks() + { + return $this->template->getBlocks(); + } + + public function display(array $context, array $blocks = array()) + { + $start = microtime(true); + $this->template->display($context, $blocks); + $end = microtime(true); + + if ($timeDataCollector = $this->env->getTimeDataCollector()) { + $name = sprintf("twig.render(%s)", $this->template->getTemplateName()); + $timeDataCollector->addMeasure($name, $start, $end); + } + + $this->env->addRenderedTemplate(array( + 'name' => $this->template->getTemplateName(), + 'render_time' => $end - $start + )); + } + + public function render(array $context) + { + $level = ob_get_level(); + ob_start(); + try { + $this->display($context); + } catch (Exception $e) { + while (ob_get_level() > $level) { + ob_end_clean(); + } + + throw $e; + } + + return ob_get_clean(); + } + + public static function clearCache() + { + Twig_Template::clearCache(); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TwigCollector.php b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TwigCollector.php new file mode 100644 index 0000000..fde5a3f --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Bridge/Twig/TwigCollector.php @@ -0,0 +1,87 @@ + + * $env = new TraceableTwigEnvironment(new Twig_Environment($loader)); + * $debugbar->addCollector(new TwigCollector($env)); + * + */ +class TwigCollector extends DataCollector implements Renderable, AssetProvider +{ + public function __construct(TraceableTwigEnvironment $twig) + { + $this->twig = $twig; + } + + public function collect() + { + $templates = array(); + $accuRenderTime = 0; + + foreach ($this->twig->getRenderedTemplates() as $tpl) { + $accuRenderTime += $tpl['render_time']; + $templates[] = array( + 'name' => $tpl['name'], + 'render_time' => $tpl['render_time'], + 'render_time_str' => $this->formatDuration($tpl['render_time']) + ); + } + + return array( + 'nb_templates' => count($templates), + 'templates' => $templates, + 'accumulated_render_time' => $accuRenderTime, + 'accumulated_render_time_str' => $this->formatDuration($accuRenderTime) + ); + } + + public function getName() + { + return 'twig'; + } + + public function getWidgets() + { + return array( + 'twig' => array( + 'icon' => 'leaf', + 'widget' => 'PhpDebugBar.Widgets.TemplatesWidget', + 'map' => 'twig', + 'default' => '[]' + ), + 'twig:badge' => array( + 'map' => 'twig.nb_templates', + 'default' => 0 + ) + ); + } + + public function getAssets() + { + return array( + 'css' => 'widgets/templates/widget.css', + 'js' => 'widgets/templates/widget.js' + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/AggregatedCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/AggregatedCollector.php new file mode 100644 index 0000000..6c8e711 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/AggregatedCollector.php @@ -0,0 +1,166 @@ + + * $aggcollector = new AggregateCollector('foobar'); + * $aggcollector->addCollector(new MessagesCollector('msg1')); + * $aggcollector->addCollector(new MessagesCollector('msg2')); + * $aggcollector['msg1']->addMessage('hello world'); + * + */ +class AggregatedCollector implements DataCollectorInterface, ArrayAccess +{ + protected $name; + + protected $mergeProperty; + + protected $sort; + + protected $collectors = array(); + + /** + * @param string $name + * @param string $mergeProperty + * @param boolean $sort + */ + public function __construct($name, $mergeProperty = null, $sort = false) + { + $this->name = $name; + $this->mergeProperty = $mergeProperty; + $this->sort = $sort; + } + + /** + * @param DataCollectorInterface $collector + */ + public function addCollector(DataCollectorInterface $collector) + { + $this->collectors[$collector->getName()] = $collector; + } + + /** + * @return array + */ + public function getCollectors() + { + return $this->collectors; + } + + /** + * Merge data from one of the key/value pair of the collected data + * + * @param string $property + */ + public function setMergeProperty($property) + { + $this->mergeProperty = $property; + } + + /** + * @return string + */ + public function getMergeProperty() + { + return $this->mergeProperty; + } + + /** + * Sorts the collected data + * + * If true, sorts using sort() + * If it is a string, sorts the data using the value from a key/value pair of the array + * + * @param bool|string $sort + */ + public function setSort($sort) + { + $this->sort = $sort; + } + + /** + * @return bool|string + */ + public function getSort() + { + return $this->sort; + } + + public function collect() + { + $aggregate = array(); + foreach ($this->collectors as $collector) { + $data = $collector->collect(); + if ($this->mergeProperty !== null) { + $data = $data[$this->mergeProperty]; + } + $aggregate = array_merge($aggregate, $data); + } + + return $this->sort($aggregate); + } + + /** + * Sorts the collected data + * + * @param array $data + * @return array + */ + protected function sort($data) + { + if (is_string($this->sort)) { + $p = $this->sort; + usort($data, function ($a, $b) use ($p) { + if ($a[$p] == $b[$p]) { + return 0; + } + return $a[$p] < $b[$p] ? -1 : 1; + }); + } elseif ($this->sort === true) { + sort($data); + } + return $data; + } + + public function getName() + { + return $this->name; + } + + // -------------------------------------------- + // ArrayAccess implementation + + public function offsetSet($key, $value) + { + throw new DebugBarException("AggregatedCollector[] is read-only"); + } + + public function offsetGet($key) + { + return $this->collectors[$key]; + } + + public function offsetExists($key) + { + return isset($this->collectors[$key]); + } + + public function offsetUnset($key) + { + throw new DebugBarException("AggregatedCollector[] is read-only"); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/AssetProvider.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/AssetProvider.php new file mode 100644 index 0000000..6910f73 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/AssetProvider.php @@ -0,0 +1,28 @@ +name = $name; + $this->data = $data; + } + + /** + * Sets the data + * + * @param array $data + */ + public function setData(array $data) + { + $this->data = $data; + } + + public function collect() + { + $data = array(); + foreach ($this->data as $k => $v) { + if (!is_string($v)) { + $v = $this->getDataFormatter()->formatVar($v); + } + $data[$k] = $v; + } + return $data; + } + + public function getName() + { + return $this->name; + } + + public function getWidgets() + { + $name = $this->getName(); + return array( + "$name" => array( + "icon" => "gear", + "widget" => "PhpDebugBar.Widgets.VariableListWidget", + "map" => "$name", + "default" => "{}" + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollector.php new file mode 100644 index 0000000..081f66e --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollector.php @@ -0,0 +1,90 @@ +dataFormater = $formater; + return $this; + } + + public function getDataFormatter() + { + if ($this->dataFormater === null) { + $this->dataFormater = self::getDefaultDataFormatter(); + } + return $this->dataFormater; + } + + /** + * @deprecated + */ + public function formatVar($var) + { + return $this->getDataFormatter()->formatVar($var); + } + + /** + * @deprecated + */ + public function formatDuration($seconds) + { + return $this->getDataFormatter()->formatDuration($seconds); + } + + /** + * @deprecated + */ + public function formatBytes($size, $precision = 2) + { + return $this->getDataFormatter()->formatBytes($size, $precision); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollectorInterface.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollectorInterface.php new file mode 100644 index 0000000..b7f234c --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/DataCollectorInterface.php @@ -0,0 +1,31 @@ +exceptions[] = $e; + if ($this->chainExceptions && $previous = $e->getPrevious()) { + $this->addException($previous); + } + } + + /** + * Configure whether or not all chained exceptions should be shown. + * + * @param bool $chainExceptions + */ + public function setChainExceptions($chainExceptions = true) + { + $this->chainExceptions = $chainExceptions; + } + + /** + * Returns the list of exceptions being profiled + * + * @return array[Exception] + */ + public function getExceptions() + { + return $this->exceptions; + } + + public function collect() + { + return array( + 'count' => count($this->exceptions), + 'exceptions' => array_map(array($this, 'formatExceptionData'), $this->exceptions) + ); + } + + /** + * Returns exception data as an array + * + * @param Exception $e + * @return array + */ + public function formatExceptionData(Exception $e) + { + $filePath = $e->getFile(); + if ($filePath && file_exists($filePath)) { + $lines = file($filePath); + $start = $e->getLine() - 4; + $lines = array_slice($lines, $start < 0 ? 0 : $start, 7); + } else { + $lines = array("Cannot open the file ($filePath) in which the exception occurred "); + } + + return array( + 'type' => get_class($e), + 'message' => $e->getMessage(), + 'code' => $e->getCode(), + 'file' => $filePath, + 'line' => $e->getLine(), + 'surrounding_lines' => $lines + ); + } + + public function getName() + { + return 'exceptions'; + } + + public function getWidgets() + { + return array( + 'exceptions' => array( + 'icon' => 'bug', + 'widget' => 'PhpDebugBar.Widgets.ExceptionsWidget', + 'map' => 'exceptions.exceptions', + 'default' => '[]' + ), + 'exceptions:badge' => array( + 'map' => 'exceptions.count', + 'default' => 'null' + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/LocalizationCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/LocalizationCollector.php new file mode 100644 index 0000000..98b9e63 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/LocalizationCollector.php @@ -0,0 +1,64 @@ + $this->getLocale(), + 'domain' => $this->getDomain(), + ); + } + + public function getName() + { + return 'localization'; + } + + public function getWidgets() + { + return array( + 'domain' => array( + 'icon' => 'bookmark', + 'map' => 'localization.domain', + ), + 'locale' => array( + 'icon' => 'flag', + 'map' => 'localization.locale', + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MemoryCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MemoryCollector.php new file mode 100644 index 0000000..1a27c40 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MemoryCollector.php @@ -0,0 +1,63 @@ +peakUsage; + } + + /** + * Updates the peak memory usage value + */ + public function updatePeakUsage() + { + $this->peakUsage = memory_get_peak_usage(true); + } + + public function collect() + { + $this->updatePeakUsage(); + return array( + 'peak_usage' => $this->peakUsage, + 'peak_usage_str' => $this->getDataFormatter()->formatBytes($this->peakUsage) + ); + } + + public function getName() + { + return 'memory'; + } + + public function getWidgets() + { + return array( + "memory" => array( + "icon" => "cogs", + "tooltip" => "Memory Usage", + "map" => "memory.peak_usage_str", + "default" => "'0B'" + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MessagesAggregateInterface.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MessagesAggregateInterface.php new file mode 100644 index 0000000..1e2d4d2 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MessagesAggregateInterface.php @@ -0,0 +1,21 @@ +name = $name; + } + + /** + * Sets the data formater instance used by this collector + * + * @param DataFormatterInterface $formater + */ + public function setDataFormatter(DataFormatterInterface $formater) + { + $this->dataFormater = $formater; + return $this; + } + + public function getDataFormatter() + { + if ($this->dataFormater === null) { + $this->dataFormater = DataCollector::getDefaultDataFormatter(); + } + return $this->dataFormater; + } + + /** + * Adds a message + * + * A message can be anything from an object to a string + * + * @param mixed $message + * @param string $label + */ + public function addMessage($message, $label = 'info', $isString = true) + { + if (!is_string($message)) { + $message = $this->getDataFormatter()->formatVar($message); + $isString = false; + } + $this->messages[] = array( + 'message' => $message, + 'is_string' => $isString, + 'label' => $label, + 'time' => microtime(true) + ); + } + + /** + * Aggregates messages from other collectors + * + * @param MessagesAggregateInterface $messages + */ + public function aggregate(MessagesAggregateInterface $messages) + { + $this->aggregates[] = $messages; + } + + public function getMessages() + { + $messages = $this->messages; + foreach ($this->aggregates as $collector) { + $msgs = array_map(function ($m) use ($collector) { + $m['collector'] = $collector->getName(); + return $m; + }, $collector->getMessages()); + $messages = array_merge($messages, $msgs); + } + + // sort messages by their timestamp + usort($messages, function ($a, $b) { + if ($a['time'] === $b['time']) { + return 0; + } + return $a['time'] < $b['time'] ? -1 : 1; + }); + + return $messages; + } + + public function log($level, $message, array $context = array()) + { + $this->addMessage($message, $level); + } + + /** + * Deletes all messages + */ + public function clear() + { + $this->messages = array(); + } + + public function collect() + { + $messages = $this->getMessages(); + return array( + 'count' => count($messages), + 'messages' => $messages + ); + } + + public function getName() + { + return $this->name; + } + + public function getWidgets() + { + $name = $this->getName(); + return array( + "$name" => array( + 'icon' => 'list-alt', + "widget" => "PhpDebugBar.Widgets.MessagesWidget", + "map" => "$name.messages", + "default" => "[]" + ), + "$name:badge" => array( + "map" => "$name.count", + "default" => "null" + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/PDOCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/PDOCollector.php new file mode 100644 index 0000000..37e7b02 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/PDOCollector.php @@ -0,0 +1,182 @@ +'; + + /** + * @param TraceablePDO $pdo + * @param TimeDataCollector $timeCollector + */ + public function __construct(TraceablePDO $pdo = null, TimeDataCollector $timeCollector = null) + { + $this->timeCollector = $timeCollector; + if ($pdo !== null) { + $this->addConnection($pdo, 'default'); + } + } + + /** + * Renders the SQL of traced statements with params embeded + * + * @param boolean $enabled + */ + public function setRenderSqlWithParams($enabled = true, $quotationChar = '<>') + { + $this->renderSqlWithParams = $enabled; + $this->sqlQuotationChar = $quotationChar; + } + + public function isSqlRenderedWithParams() + { + return $this->renderSqlWithParams; + } + + public function getSqlQuotationChar() + { + return $this->sqlQuotationChar; + } + + /** + * Adds a new PDO instance to be collector + * + * @param TraceablePDO $pdo + * @param string $name Optional connection name + */ + public function addConnection(TraceablePDO $pdo, $name = null) + { + if ($name === null) { + $name = spl_object_hash($pdo); + } + $this->connections[$name] = $pdo; + } + + /** + * Returns PDO instances to be collected + * + * @return array + */ + public function getConnections() + { + return $this->connections; + } + + public function collect() + { + $data = array( + 'nb_statements' => 0, + 'nb_failed_statements' => 0, + 'accumulated_duration' => 0, + 'memory_usage' => 0, + 'peak_memory_usage' => 0, + 'statements' => array() + ); + + foreach ($this->connections as $name => $pdo) { + $pdodata = $this->collectPDO($pdo, $this->timeCollector); + $data['nb_statements'] += $pdodata['nb_statements']; + $data['nb_failed_statements'] += $pdodata['nb_failed_statements']; + $data['accumulated_duration'] += $pdodata['accumulated_duration']; + $data['memory_usage'] += $pdodata['memory_usage']; + $data['peak_memory_usage'] = max($data['peak_memory_usage'], $pdodata['peak_memory_usage']); + $data['statements'] = array_merge($data['statements'], + array_map(function ($s) use ($name) { $s['connection'] = $name; return $s; }, $pdodata['statements'])); + } + + $data['accumulated_duration_str'] = $this->getDataFormatter()->formatDuration($data['accumulated_duration']); + $data['memory_usage_str'] = $this->getDataFormatter()->formatBytes($data['memory_usage']); + $data['peak_memory_usage_str'] = $this->getDataFormatter()->formatBytes($data['peak_memory_usage']); + + return $data; + } + + /** + * Collects data from a single TraceablePDO instance + * + * @param TraceablePDO $pdo + * @param TimeDataCollector $timeCollector + * @return array + */ + protected function collectPDO(TraceablePDO $pdo, TimeDataCollector $timeCollector = null) + { + $stmts = array(); + foreach ($pdo->getExecutedStatements() as $stmt) { + $stmts[] = array( + 'sql' => $this->renderSqlWithParams ? $stmt->getSqlWithParams($this->sqlQuotationChar) : $stmt->getSql(), + 'row_count' => $stmt->getRowCount(), + 'stmt_id' => $stmt->getPreparedId(), + 'prepared_stmt' => $stmt->getSql(), + 'params' => (object) $stmt->getParameters(), + 'duration' => $stmt->getDuration(), + 'duration_str' => $this->getDataFormatter()->formatDuration($stmt->getDuration()), + 'memory' => $stmt->getMemoryUsage(), + 'memory_str' => $this->getDataFormatter()->formatBytes($stmt->getMemoryUsage()), + 'end_memory' => $stmt->getEndMemory(), + 'end_memory_str' => $this->getDataFormatter()->formatBytes($stmt->getEndMemory()), + 'is_success' => $stmt->isSuccess(), + 'error_code' => $stmt->getErrorCode(), + 'error_message' => $stmt->getErrorMessage() + ); + if ($timeCollector !== null) { + $timeCollector->addMeasure($stmt->getSql(), $stmt->getStartTime(), $stmt->getEndTime()); + } + } + + return array( + 'nb_statements' => count($stmts), + 'nb_failed_statements' => count($pdo->getFailedExecutedStatements()), + 'accumulated_duration' => $pdo->getAccumulatedStatementsDuration(), + 'accumulated_duration_str' => $this->getDataFormatter()->formatDuration($pdo->getAccumulatedStatementsDuration()), + 'memory_usage' => $pdo->getMemoryUsage(), + 'memory_usage_str' => $this->getDataFormatter()->formatBytes($pdo->getPeakMemoryUsage()), + 'peak_memory_usage' => $pdo->getPeakMemoryUsage(), + 'peak_memory_usage_str' => $this->getDataFormatter()->formatBytes($pdo->getPeakMemoryUsage()), + 'statements' => $stmts + ); + } + + public function getName() + { + return 'pdo'; + } + + public function getWidgets() + { + return array( + "database" => array( + "icon" => "inbox", + "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget", + "map" => "pdo", + "default" => "[]" + ), + "database:badge" => array( + "map" => "pdo.nb_statements", + "default" => 0 + ) + ); + } + + public function getAssets() + { + return array( + 'css' => 'widgets/sqlqueries/widget.css', + 'js' => 'widgets/sqlqueries/widget.js' + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDO.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDO.php new file mode 100644 index 0000000..5f7688b --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDO.php @@ -0,0 +1,196 @@ +pdo = $pdo; + $this->pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DebugBar\DataCollector\PDO\TraceablePDOStatement', array($this))); + } + + public function beginTransaction() + { + return $this->pdo->beginTransaction(); + } + + public function commit() + { + return $this->pdo->commit(); + } + + public function errorCode() + { + return $this->pdo->errorCode(); + } + + public function errorInfo() + { + return $this->pdo->errorInfo(); + } + + public function exec($sql) + { + return $this->profileCall('exec', $sql, func_get_args()); + } + + public function getAttribute($attr) + { + return $this->pdo->getAttribute($attr); + } + + public function inTransaction() + { + return $this->pdo->inTransaction(); + } + + public function lastInsertId($name = null) + { + return $this->pdo->lastInsertId($name); + } + + public function prepare($sql, $driver_options = array()) + { + return $this->pdo->prepare($sql, $driver_options); + } + + public function query($sql) + { + return $this->profileCall('query', $sql, func_get_args()); + } + + public function quote($expr, $parameter_type = PDO::PARAM_STR) + { + return $this->pdo->quote($expr, $parameter_type); + } + + public function rollBack() + { + return $this->pdo->rollBack(); + } + + public function setAttribute($attr, $value) + { + return $this->pdo->setAttribute($attr, $value); + } + + /** + * Profiles a call to a PDO method + * + * @param string $method + * @param string $sql + * @param array $args + * @return mixed The result of the call + */ + protected function profileCall($method, $sql, array $args) + { + $trace = new TracedStatement($sql); + $trace->start(); + + $ex = null; + try { + $result = call_user_func_array(array($this->pdo, $method), $args); + } catch (PDOException $e) { + $ex = $e; + } + + if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) !== PDO::ERRMODE_EXCEPTION && $result === false) { + $error = $this->pdo->errorInfo(); + $ex = new PDOException($error[2], $error[0]); + } + + $trace->end($ex); + $this->addExecutedStatement($trace); + + if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) === PDO::ERRMODE_EXCEPTION && $ex !== null) { + throw $ex; + } + return $result; + } + + /** + * Adds an executed TracedStatement + * + * @param TracedStatement $stmt + */ + public function addExecutedStatement(TracedStatement $stmt) + { + $this->executedStatements[] = $stmt; + } + + /** + * Returns the accumulated execution time of statements + * + * @return int + */ + public function getAccumulatedStatementsDuration() + { + return array_reduce($this->executedStatements, function ($v, $s) { return $v + $s->getDuration(); }); + } + + /** + * Returns the peak memory usage while performing statements + * + * @return int + */ + public function getMemoryUsage() + { + return array_reduce($this->executedStatements, function ($v, $s) { return $v + $s->getMemoryUsage(); }); + } + + /** + * Returns the peak memory usage while performing statements + * + * @return int + */ + public function getPeakMemoryUsage() + { + return array_reduce($this->executedStatements, function ($v, $s) { $m = $s->getEndMemory(); return $m > $v ? $m : $v; }); + } + + /** + * Returns the list of executed statements as TracedStatement objects + * + * @return array + */ + public function getExecutedStatements() + { + return $this->executedStatements; + } + + /** + * Returns the list of failed statements + * + * @return array + */ + public function getFailedExecutedStatements() + { + return array_filter($this->executedStatements, function ($s) { return !$s->isSuccess(); }); + } + + public function __get($name) + { + return $this->pdo->$name; + } + + public function __set($name, $value) + { + $this->pdo->$name = $value; + } + + public function __call($name, $args) + { + return call_user_func_array(array($this->pdo, $name), $args); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php new file mode 100644 index 0000000..4eb75fd --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TraceablePDOStatement.php @@ -0,0 +1,74 @@ +pdo = $pdo; + } + + public function bindColumn($column, &$param, $type = null, $maxlen = null, $driverdata = null) + { + $this->boundParameters[$column] = $param; + $args = array_merge(array($column, &$param), array_slice(func_get_args(), 2)); + return call_user_func_array(array("parent", 'bindColumn'), $args); + } + + public function bindParam($param, &$var, $data_type = PDO::PARAM_STR, $length = null, $driver_options = null) + { + $this->boundParameters[$param] = $var; + $args = array_merge(array($param, &$var), array_slice(func_get_args(), 2)); + return call_user_func_array(array("parent", 'bindParam'), $args); + } + + public function bindValue($param, $value, $data_type = PDO::PARAM_STR) + { + $this->boundParameters[$param] = $value; + return call_user_func_array(array("parent", 'bindValue'), func_get_args()); + } + + public function execute($params = null) + { + $preparedId = spl_object_hash($this); + $boundParameters = $this->boundParameters; + if (is_array($params)) { + $boundParameters = array_merge($boundParameters, $params); + } + + $trace = new TracedStatement($this->queryString, $boundParameters, $preparedId); + $trace->start(); + + $ex = null; + try { + $result = parent::execute($params); + } catch (PDOException $e) { + $ex = $e; + } + + if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) !== PDO::ERRMODE_EXCEPTION && $result === false) { + $error = $this->errorInfo(); + $ex = new PDOException($error[2], (int) $error[0]); + } + + $trace->end($ex, $this->rowCount()); + $this->pdo->addExecutedStatement($trace); + + if ($this->pdo->getAttribute(PDO::ATTR_ERRMODE) === PDO::ERRMODE_EXCEPTION && $ex !== null) { + throw $ex; + } + return $result; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TracedStatement.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TracedStatement.php new file mode 100644 index 0000000..ae58a07 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PDO/TracedStatement.php @@ -0,0 +1,240 @@ +sql = $sql; + $this->parameters = $this->checkParameters($params); + $this->preparedId = $preparedId; + } + + public function start($startTime = null, $startMemory = null) + { + $this->startTime = $startTime ?: microtime(true); + $this->startMemory = $startMemory ?: memory_get_usage(true); + } + + public function end(\Exception $exception = null, $rowCount = 0, $endTime = null, $endMemory = null) + { + $this->endTime = $endTime ?: microtime(true); + $this->duration = $this->endTime - $this->startTime; + $this->endMemory = $endMemory ?: memory_get_usage(true); + $this->memoryDelta = $this->endMemory - $this->startMemory; + $this->exception = $exception; + $this->rowCount = $rowCount; + } + + /** + * Check parameters for illegal (non UTF-8) strings, like Binary data. + * + * @param $params + * @return mixed + */ + public function checkParameters($params) + { + foreach ($params as &$param) { + if (!mb_check_encoding($param, 'UTF-8')) { + $param = '[BINARY DATA]'; + } + } + return $params; + } + + /** + * Returns the SQL string used for the query + * + * @return string + */ + public function getSql() + { + return $this->sql; + } + + /** + * Returns the SQL string with any parameters used embedded + * + * @param string $quotationChar + * @return string + */ + public function getSqlWithParams($quotationChar = '<>') + { + if (($l = strlen($quotationChar)) > 1) { + $quoteLeft = substr($quotationChar, 0, $l / 2); + $quoteRight = substr($quotationChar, $l / 2); + } else { + $quoteLeft = $quoteRight = $quotationChar; + } + + $sql = $this->sql; + foreach ($this->parameters as $k => $v) { + $v = "$quoteLeft$v$quoteRight"; + if (!is_numeric($k)) { + $sql = str_replace($k, $v, $sql); + } else { + $p = strpos($sql, '?'); + $sql = substr($sql, 0, $p) . $v. substr($sql, $p + 1); + } + } + return $sql; + } + + /** + * Returns the number of rows affected/returned + * + * @return int + */ + public function getRowCount() + { + return $this->rowCount; + } + + /** + * Returns an array of parameters used with the query + * + * @return array + */ + public function getParameters() + { + $params = array(); + foreach ($this->parameters as $name => $param) { + $params[$name] = htmlentities($param, ENT_QUOTES, 'UTF-8', false); + } + return $params; + } + + /** + * Returns the prepared statement id + * + * @return string + */ + public function getPreparedId() + { + return $this->preparedId; + } + + /** + * Checks if this is a prepared statement + * + * @return boolean + */ + public function isPrepared() + { + return $this->preparedId !== null; + } + + public function getStartTime() + { + return $this->startTime; + } + + public function getEndTime() + { + return $this->endTime; + } + + /** + * Returns the duration in seconds of the execution + * + * @return int + */ + public function getDuration() + { + return $this->duration; + } + + public function getStartMemory() + { + return $this->startMemory; + } + + public function getEndMemory() + { + return $this->endMemory; + } + + /** + * Returns the memory usage during the execution + * + * @return int + */ + public function getMemoryUsage() + { + return $this->memoryDelta; + } + + /** + * Checks if the statement was successful + * + * @return boolean + */ + public function isSuccess() + { + return $this->exception === null; + } + + /** + * Returns the exception triggered + * + * @return \Exception + */ + public function getException() + { + return $this->exception; + } + + /** + * Returns the exception's code + * + * @return string + */ + public function getErrorCode() + { + return $this->exception !== null ? $this->exception->getCode() : 0; + } + + /** + * Returns the exception's message + * + * @return string + */ + public function getErrorMessage() + { + return $this->exception !== null ? $this->exception->getMessage() : ''; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PhpInfoCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PhpInfoCollector.php new file mode 100644 index 0000000..e323ccc --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/PhpInfoCollector.php @@ -0,0 +1,29 @@ + PHP_VERSION + ); + } + + public function getName() + { + return 'php'; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/Renderable.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/Renderable.php new file mode 100644 index 0000000..1a6a833 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/Renderable.php @@ -0,0 +1,25 @@ +getDataFormatter()->formatVar($GLOBALS[$var]); + } + } + + return $data; + } + + public function getName() + { + return 'request'; + } + + public function getWidgets() + { + return array( + "request" => array( + "icon" => "tags", + "widget" => "PhpDebugBar.Widgets.VariableListWidget", + "map" => "request", + "default" => "{}" + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataCollector/TimeDataCollector.php b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/TimeDataCollector.php new file mode 100644 index 0000000..19e5a63 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataCollector/TimeDataCollector.php @@ -0,0 +1,228 @@ +requestStartTime = $requestStartTime; + } + + /** + * Starts a measure + * + * @param string $name Internal name, used to stop the measure + * @param string|null $label Public name + * @param string|null $collector The source of the collector + */ + public function startMeasure($name, $label = null, $collector = null) + { + $start = microtime(true); + $this->startedMeasures[$name] = array( + 'label' => $label ?: $name, + 'start' => $start, + 'collector' => $collector + ); + } + + /** + * Check a measure exists + * + * @param string $name + * @return bool + */ + public function hasStartedMeasure($name) + { + return isset($this->startedMeasures[$name]); + } + + /** + * Stops a measure + * + * @param string $name + * @param array $params + * @throws DebugBarException + */ + public function stopMeasure($name, $params = array()) + { + $end = microtime(true); + if (!$this->hasStartedMeasure($name)) { + throw new DebugBarException("Failed stopping measure '$name' because it hasn't been started"); + } + $this->addMeasure( + $this->startedMeasures[$name]['label'], + $this->startedMeasures[$name]['start'], + $end, + $params, + $this->startedMeasures[$name]['collector'] + ); + unset($this->startedMeasures[$name]); + } + + /** + * Adds a measure + * + * @param string $label + * @param float $start + * @param float $end + * @param array $params + * @param string|null $collector + */ + public function addMeasure($label, $start, $end, $params = array(), $collector = null) + { + $this->measures[] = array( + 'label' => $label, + 'start' => $start, + 'relative_start' => $start - $this->requestStartTime, + 'end' => $end, + 'relative_end' => $end - $this->requestEndTime, + 'duration' => $end - $start, + 'duration_str' => $this->getDataFormatter()->formatDuration($end - $start), + 'params' => $params, + 'collector' => $collector + ); + } + + /** + * Utility function to measure the execution of a Closure + * + * @param string $label + * @param \Closure $closure + * @param string|null $collector + */ + public function measure($label, \Closure $closure, $collector = null) + { + $name = spl_object_hash($closure); + $this->startMeasure($name, $label, $collector); + $result = $closure(); + $params = is_array($result) ? $result : array(); + $this->stopMeasure($name, $params); + } + + /** + * Returns an array of all measures + * + * @return array + */ + public function getMeasures() + { + return $this->measures; + } + + /** + * Returns the request start time + * + * @return float + */ + public function getRequestStartTime() + { + return $this->requestStartTime; + } + + /** + * Returns the request end time + * + * @return float + */ + public function getRequestEndTime() + { + return $this->requestEndTime; + } + + /** + * Returns the duration of a request + * + * @return float + */ + public function getRequestDuration() + { + if ($this->requestEndTime !== null) { + return $this->requestEndTime - $this->requestStartTime; + } + return microtime(true) - $this->requestStartTime; + } + + public function collect() + { + $this->requestEndTime = microtime(true); + foreach (array_keys($this->startedMeasures) as $name) { + $this->stopMeasure($name); + } + + return array( + 'start' => $this->requestStartTime, + 'end' => $this->requestEndTime, + 'duration' => $this->getRequestDuration(), + 'duration_str' => $this->getDataFormatter()->formatDuration($this->getRequestDuration()), + 'measures' => array_values($this->measures) + ); + } + + public function getName() + { + return 'time'; + } + + public function getWidgets() + { + return array( + "time" => array( + "icon" => "clock-o", + "tooltip" => "Request Duration", + "map" => "time.duration_str", + "default" => "'0ms'" + ), + "timeline" => array( + "icon" => "tasks", + "widget" => "PhpDebugBar.Widgets.TimelineWidget", + "map" => "time", + "default" => "{}" + ) + ); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatter.php b/vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatter.php new file mode 100644 index 0000000..41e2775 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatter.php @@ -0,0 +1,61 @@ +cloner = new VarCloner(); + $this->dumper = new CliDumper(); + } + + public function formatVar($data) + { + $output = ''; + + $this->dumper->dump( + $this->cloner->cloneVar($data), + function ($line, $depth) use (&$output) { + // A negative depth means "end of dump" + if ($depth >= 0) { + // Adds a two spaces indentation to the line + $output .= str_repeat(' ', $depth).$line."\n"; + } + } + ); + + return trim($output); + } + + public function formatDuration($seconds) + { + if ($seconds < 0.001) { + return round($seconds * 1000000) . 'μs'; + } elseif ($seconds < 1) { + return round($seconds * 1000, 2) . 'ms'; + } + return round($seconds, 2) . 's'; + } + + public function formatBytes($size, $precision = 2) + { + if ($size === 0 || $size === null) { + return "0B"; + } + $base = log($size) / log(1024); + $suffixes = array('B', 'KB', 'MB', 'GB', 'TB'); + return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)]; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatterInterface.php b/vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatterInterface.php new file mode 100644 index 0000000..cb7b426 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DataFormatter/DataFormatterInterface.php @@ -0,0 +1,42 @@ + + * $debugbar = new DebugBar(); + * $debugbar->addCollector(new DataCollector\MessagesCollector()); + * $debugbar['messages']->addMessage("foobar"); + * + */ +class DebugBar implements ArrayAccess +{ + public static $useOpenHandlerWhenSendingDataHeaders = false; + + protected $collectors = array(); + + protected $data; + + protected $jsRenderer; + + protected $requestIdGenerator; + + protected $requestId; + + protected $storage; + + protected $httpDriver; + + protected $stackSessionNamespace = 'PHPDEBUGBAR_STACK_DATA'; + + protected $stackAlwaysUseSessionStorage = false; + + /** + * Adds a data collector + * + * @param DataCollectorInterface $collector + * + * @throws DebugBarException + * @return $this + */ + public function addCollector(DataCollectorInterface $collector) + { + if ($collector->getName() === '__meta') { + throw new DebugBarException("'__meta' is a reserved name and cannot be used as a collector name"); + } + if (isset($this->collectors[$collector->getName()])) { + throw new DebugBarException("'{$collector->getName()}' is already a registered collector"); + } + $this->collectors[$collector->getName()] = $collector; + return $this; + } + + /** + * Checks if a data collector has been added + * + * @param string $name + * @return boolean + */ + public function hasCollector($name) + { + return isset($this->collectors[$name]); + } + + /** + * Returns a data collector + * + * @param string $name + * @return DataCollectorInterface + */ + public function getCollector($name) + { + if (!isset($this->collectors[$name])) { + throw new DebugBarException("'$name' is not a registered collector"); + } + return $this->collectors[$name]; + } + + /** + * Returns an array of all data collectors + * + * @return array[DataCollectorInterface] + */ + public function getCollectors() + { + return $this->collectors; + } + + /** + * Sets the request id generator + * + * @param RequestIdGeneratorInterface $generator + */ + public function setRequestIdGenerator(RequestIdGeneratorInterface $generator) + { + $this->requestIdGenerator = $generator; + return $this; + } + + /** + * @return RequestIdGeneratorInterface + */ + public function getRequestIdGenerator() + { + if ($this->requestIdGenerator === null) { + $this->requestIdGenerator = new RequestIdGenerator(); + } + return $this->requestIdGenerator; + } + + /** + * Returns the id of the current request + * + * @return string + */ + public function getCurrentRequestId() + { + if ($this->requestId === null) { + $this->requestId = $this->getRequestIdGenerator()->generate(); + } + return $this->requestId; + } + + /** + * Sets the storage backend to use to store the collected data + * + * @param StorageInterface $storage + */ + public function setStorage(StorageInterface $storage = null) + { + $this->storage = $storage; + return $this; + } + + /** + * @return StorageInterface + */ + public function getStorage() + { + return $this->storage; + } + + /** + * Checks if the data will be persisted + * + * @return boolean + */ + public function isDataPersisted() + { + return $this->storage !== null; + } + + /** + * Sets the HTTP driver + * + * @param HttpDriverInterface $driver + */ + public function setHttpDriver(HttpDriverInterface $driver) + { + $this->httpDriver = $driver; + return $this; + } + + /** + * Returns the HTTP driver + * + * If no http driver where defined, a PhpHttpDriver is automatically created + * + * @return HttpDriverInterface + */ + public function getHttpDriver() + { + if ($this->httpDriver === null) { + $this->httpDriver = new PhpHttpDriver(); + } + return $this->httpDriver; + } + + /** + * Collects the data from the collectors + * + * @return array + */ + public function collect() + { + $this->data = array( + '__meta' => array( + 'id' => $this->getCurrentRequestId(), + 'datetime' => date('Y-m-d H:i:s'), + 'utime' => microtime(true), + 'method' => isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : null, + 'uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null, + 'ip' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null + ) + ); + + foreach ($this->collectors as $name => $collector) { + $this->data[$name] = $collector->collect(); + } + + // Remove all invalid (non UTF-8) characters + array_walk_recursive($this->data, function (&$item) { + if (is_string($item) && !mb_check_encoding($item, 'UTF-8')) { + $item = mb_convert_encoding($item, 'UTF-8', 'UTF-8'); + } + }); + + if ($this->storage !== null) { + $this->storage->save($this->getCurrentRequestId(), $this->data); + } + + return $this->data; + } + + /** + * Returns collected data + * + * Will collect the data if none have been collected yet + * + * @return array + */ + public function getData() + { + if ($this->data === null) { + $this->collect(); + } + return $this->data; + } + + /** + * Returns an array of HTTP headers containing the data + * + * @param string $headerName + * @param integer $maxHeaderLength + * @return array + */ + public function getDataAsHeaders($headerName = 'phpdebugbar', $maxHeaderLength = 4096, $maxTotalHeaderLength = 250000) + { + $data = rawurlencode(json_encode(array( + 'id' => $this->getCurrentRequestId(), + 'data' => $this->getData() + ))); + + if (strlen($data) > $maxTotalHeaderLength) { + $data = rawurlencode(json_encode(array( + 'error' => 'Maximum header size exceeded' + ))); + } + + $chunks = array(); + + while (strlen($data) > $maxHeaderLength) { + $chunks[] = substr($data, 0, $maxHeaderLength); + $data = substr($data, $maxHeaderLength); + } + $chunks[] = $data; + + $headers = array(); + for ($i = 0, $c = count($chunks); $i < $c; $i++) { + $name = $headerName . ($i > 0 ? "-$i" : ''); + $headers[$name] = $chunks[$i]; + } + + return $headers; + } + + /** + * Sends the data through the HTTP headers + * + * @param bool $useOpenHandler + * @param string $headerName + * @param integer $maxHeaderLength + */ + public function sendDataInHeaders($useOpenHandler = null, $headerName = 'phpdebugbar', $maxHeaderLength = 4096) + { + if ($useOpenHandler === null) { + $useOpenHandler = self::$useOpenHandlerWhenSendingDataHeaders; + } + if ($useOpenHandler && $this->storage !== null) { + $this->getData(); + $headerName .= '-id'; + $headers = array($headerName => $this->getCurrentRequestId()); + } else { + $headers = $this->getDataAsHeaders($headerName, $maxHeaderLength); + } + $this->getHttpDriver()->setHeaders($headers); + return $this; + } + + /** + * Stacks the data in the session for later rendering + */ + public function stackData() + { + $http = $this->initStackSession(); + + $data = null; + if (!$this->isDataPersisted() || $this->stackAlwaysUseSessionStorage) { + $data = $this->getData(); + } elseif ($this->data === null) { + $this->collect(); + } + + $stack = $http->getSessionValue($this->stackSessionNamespace); + $stack[$this->getCurrentRequestId()] = $data; + $http->setSessionValue($this->stackSessionNamespace, $stack); + return $this; + } + + /** + * Checks if there is stacked data in the session + * + * @return boolean + */ + public function hasStackedData() + { + try { + $http = $this->initStackSession(); + } catch (DebugBarException $e) { + return false; + } + return count($http->getSessionValue($this->stackSessionNamespace)) > 0; + } + + /** + * Returns the data stacked in the session + * + * @param boolean $delete Whether to delete the data in the session + * @return array + */ + public function getStackedData($delete = true) + { + $http = $this->initStackSession(); + $stackedData = $http->getSessionValue($this->stackSessionNamespace); + if ($delete) { + $http->deleteSessionValue($this->stackSessionNamespace); + } + + $datasets = array(); + if ($this->isDataPersisted() && !$this->stackAlwaysUseSessionStorage) { + foreach ($stackedData as $id => $data) { + $datasets[$id] = $this->getStorage()->get($id); + } + } else { + $datasets = $stackedData; + } + + return $datasets; + } + + /** + * Sets the key to use in the $_SESSION array + * + * @param string $ns + */ + public function setStackDataSessionNamespace($ns) + { + $this->stackSessionNamespace = $ns; + return $this; + } + + /** + * Returns the key used in the $_SESSION array + * + * @return string + */ + public function getStackDataSessionNamespace() + { + return $this->stackSessionNamespace; + } + + /** + * Sets whether to only use the session to store stacked data even + * if a storage is enabled + * + * @param boolean $enabled + */ + public function setStackAlwaysUseSessionStorage($enabled = true) + { + $this->stackAlwaysUseSessionStorage = $enabled; + return $this; + } + + /** + * Checks if the session is always used to store stacked data + * even if a storage is enabled + * + * @return boolean + */ + public function isStackAlwaysUseSessionStorage() + { + return $this->stackAlwaysUseSessionStorage; + } + + /** + * Initializes the session for stacked data + * + * @return HttpDriverInterface + */ + protected function initStackSession() + { + $http = $this->getHttpDriver(); + if (!$http->isSessionStarted()) { + throw new DebugBarException("Session must be started before using stack data in the debug bar"); + } + + if (!$http->hasSessionValue($this->stackSessionNamespace)) { + $http->setSessionValue($this->stackSessionNamespace, array()); + } + + return $http; + } + + /** + * Returns a JavascriptRenderer for this instance + * + * @param string $baseUrl + * @param string $basePathng + * @return JavascriptRenderer + */ + public function getJavascriptRenderer($baseUrl = null, $basePath = null) + { + if ($this->jsRenderer === null) { + $this->jsRenderer = new JavascriptRenderer($this, $baseUrl, $basePath); + } + return $this->jsRenderer; + } + + // -------------------------------------------- + // ArrayAccess implementation + + public function offsetSet($key, $value) + { + throw new DebugBarException("DebugBar[] is read-only"); + } + + public function offsetGet($key) + { + return $this->getCollector($key); + } + + public function offsetExists($key) + { + return $this->hasCollector($key); + } + + public function offsetUnset($key) + { + throw new DebugBarException("DebugBar[] is read-only"); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/DebugBarException.php b/vendor/maximebf/debugbar/src/DebugBar/DebugBarException.php new file mode 100644 index 0000000..32ffe25 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/DebugBarException.php @@ -0,0 +1,16 @@ + 'vendor/font-awesome/css/font-awesome.min.css', + 'highlightjs' => 'vendor/highlightjs/styles/github.css' + ); + + protected $jsVendors = array( + 'jquery' => 'vendor/jquery/dist/jquery.min.js', + 'highlightjs' => 'vendor/highlightjs/highlight.pack.js' + ); + + protected $includeVendors = true; + + protected $cssFiles = array('debugbar.css', 'widgets.css', 'openhandler.css'); + + protected $jsFiles = array('debugbar.js', 'widgets.js', 'openhandler.js'); + + protected $additionalAssets = array(); + + protected $javascriptClass = 'PhpDebugBar.DebugBar'; + + protected $variableName = 'phpdebugbar'; + + protected $enableJqueryNoConflict = true; + + protected $initialization; + + protected $controls = array(); + + protected $ignoredCollectors = array(); + + protected $ajaxHandlerClass = 'PhpDebugBar.AjaxHandler'; + + protected $ajaxHandlerBindToJquery = true; + + protected $ajaxHandlerBindToXHR = false; + + protected $openHandlerClass = 'PhpDebugBar.OpenHandler'; + + protected $openHandlerUrl; + + /** + * @param \DebugBar\DebugBar $debugBar + * @param string $baseUrl + * @param string $basePath + */ + public function __construct(DebugBar $debugBar, $baseUrl = null, $basePath = null) + { + $this->debugBar = $debugBar; + + if ($baseUrl === null) { + $baseUrl = '/vendor/maximebf/debugbar/src/DebugBar/Resources'; + } + $this->baseUrl = $baseUrl; + + if ($basePath === null) { + $basePath = __DIR__ . DIRECTORY_SEPARATOR . 'Resources'; + } + $this->basePath = $basePath; + + // bitwise operations cannot be done in class definition :( + $this->initialization = self::INITIALIZE_CONSTRUCTOR | self::INITIALIZE_CONTROLS; + } + + /** + * Sets options from an array + * + * Options: + * - base_path + * - base_url + * - include_vendors + * - javascript_class + * - variable_name + * - initialization + * - enable_jquery_noconflict + * - controls + * - disable_controls + * - ignore_collectors + * - ajax_handler_classname + * - ajax_handler_bind_to_jquery + * - open_handler_classname + * - open_handler_url + * + * @param array $options [description] + */ + public function setOptions(array $options) + { + if (array_key_exists('base_path', $options)) { + $this->setBasePath($options['base_path']); + } + if (array_key_exists('base_url', $options)) { + $this->setBaseUrl($options['base_url']); + } + if (array_key_exists('include_vendors', $options)) { + $this->setIncludeVendors($options['include_vendors']); + } + if (array_key_exists('javascript_class', $options)) { + $this->setJavascriptClass($options['javascript_class']); + } + if (array_key_exists('variable_name', $options)) { + $this->setVariableName($options['variable_name']); + } + if (array_key_exists('initialization', $options)) { + $this->setInitialization($options['initialization']); + } + if (array_key_exists('enable_jquery_noconflict', $options)) { + $this->setEnableJqueryNoConflict($options['enable_jquery_noconflict']); + } + if (array_key_exists('controls', $options)) { + foreach ($options['controls'] as $name => $control) { + $this->addControl($name, $control); + } + } + if (array_key_exists('disable_controls', $options)) { + foreach ((array) $options['disable_controls'] as $name) { + $this->disableControl($name); + } + } + if (array_key_exists('ignore_collectors', $options)) { + foreach ((array) $options['ignore_collectors'] as $name) { + $this->ignoreCollector($name); + } + } + if (array_key_exists('ajax_handler_classname', $options)) { + $this->setAjaxHandlerClass($options['ajax_handler_classname']); + } + if (array_key_exists('ajax_handler_bind_to_jquery', $options)) { + $this->setBindAjaxHandlerToJquery($options['ajax_handler_bind_to_jquery']); + } + if (array_key_exists('open_handler_classname', $options)) { + $this->setOpenHandlerClass($options['open_handler_classname']); + } + if (array_key_exists('open_handler_url', $options)) { + $this->setOpenHandlerUrl($options['open_handler_url']); + } + } + + /** + * Sets the path which assets are relative to + * + * @param string $path + */ + public function setBasePath($path) + { + $this->basePath = $path; + return $this; + } + + /** + * Returns the path which assets are relative to + * + * @return string + */ + public function getBasePath() + { + return $this->basePath; + } + + /** + * Sets the base URL from which assets will be served + * + * @param string $url + */ + public function setBaseUrl($url) + { + $this->baseUrl = $url; + return $this; + } + + /** + * Returns the base URL from which assets will be served + * + * @return string + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * Whether to include vendor assets + * + * You can only include js or css vendors using + * setIncludeVendors('css') or setIncludeVendors('js') + * + * @param boolean $enabled + */ + public function setIncludeVendors($enabled = true) + { + if (is_string($enabled)) { + $enabled = array($enabled); + } + $this->includeVendors = $enabled; + + if (!$enabled || (is_array($enabled) && !in_array('js', $enabled))) { + // no need to call jQuery.noConflict() if we do not include our own version + $this->enableJqueryNoConflict = false; + } + + return $this; + } + + /** + * Checks if vendors assets are included + * + * @return boolean + */ + public function areVendorsIncluded() + { + return $this->includeVendors !== false; + } + + /** + * Disable a specific vendor's assets. + * + * @param string $name "jquery", "fontawesome", "highlightjs" + * + * @return void + */ + public function disableVendor($name) + { + if (array_key_exists($name, $this->cssVendors)) { + unset($this->cssVendors[$name]); + } + if (array_key_exists($name, $this->jsVendors)) { + unset($this->jsVendors[$name]); + } + } + + /** + * Sets the javascript class name + * + * @param string $className + */ + public function setJavascriptClass($className) + { + $this->javascriptClass = $className; + return $this; + } + + /** + * Returns the javascript class name + * + * @return string + */ + public function getJavascriptClass() + { + return $this->javascriptClass; + } + + /** + * Sets the variable name of the class instance + * + * @param string $name + */ + public function setVariableName($name) + { + $this->variableName = $name; + return $this; + } + + /** + * Returns the variable name of the class instance + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Sets what should be initialized + * + * - INITIALIZE_CONSTRUCTOR: only initializes the instance + * - INITIALIZE_CONTROLS: initializes the controls and data mapping + * - INITIALIZE_CONSTRUCTOR | INITIALIZE_CONTROLS: initialize everything (default) + * + * @param integer $init + */ + public function setInitialization($init) + { + $this->initialization = $init; + return $this; + } + + /** + * Returns what should be initialized + * + * @return integer + */ + public function getInitialization() + { + return $this->initialization; + } + + /** + * Sets whether to call jQuery.noConflict() + * + * @param boolean $enabled + */ + public function setEnableJqueryNoConflict($enabled = true) + { + $this->enableJqueryNoConflict = $enabled; + return $this; + } + + /** + * Checks if jQuery.noConflict() will be called + * + * @return boolean + */ + public function isJqueryNoConflictEnabled() + { + return $this->enableJqueryNoConflict; + } + + /** + * Adds a control to initialize + * + * Possible options: + * - icon: icon name + * - tooltip: string + * - widget: widget class name + * - title: tab title + * - map: a property name from the data to map the control to + * - default: a js string, default value of the data map + * + * "icon" or "widget" are at least needed + * + * @param string $name + * @param array $options + */ + public function addControl($name, array $options) + { + if (count(array_intersect(array_keys($options), array('icon', 'widget', 'tab', 'indicator'))) === 0) { + throw new DebugBarException("Not enough options for control '$name'"); + } + $this->controls[$name] = $options; + return $this; + } + + /** + * Disables a control + * + * @param string $name + */ + public function disableControl($name) + { + $this->controls[$name] = null; + return $this; + } + + /** + * Returns the list of controls + * + * This does not include controls provided by collectors + * + * @return array + */ + public function getControls() + { + return $this->controls; + } + + /** + * Ignores widgets provided by a collector + * + * @param string $name + */ + public function ignoreCollector($name) + { + $this->ignoredCollectors[] = $name; + return $this; + } + + /** + * Returns the list of ignored collectors + * + * @return array + */ + public function getIgnoredCollectors() + { + return $this->ignoredCollectors; + } + + /** + * Sets the class name of the ajax handler + * + * Set to false to disable + * + * @param string $className + */ + public function setAjaxHandlerClass($className) + { + $this->ajaxHandlerClass = $className; + return $this; + } + + /** + * Returns the class name of the ajax handler + * + * @return string + */ + public function getAjaxHandlerClass() + { + return $this->ajaxHandlerClass; + } + + /** + * Sets whether to call bindToJquery() on the ajax handler + * + * @param boolean $bind + */ + public function setBindAjaxHandlerToJquery($bind = true) + { + $this->ajaxHandlerBindToJquery = $bind; + return $this; + } + + /** + * Checks whether bindToJquery() will be called on the ajax handler + * + * @return boolean + */ + public function isAjaxHandlerBoundToJquery() + { + return $this->ajaxHandlerBindToJquery; + } + + /** + * Sets whether to call bindToXHR() on the ajax handler + * + * @param boolean $bind + */ + public function setBindAjaxHandlerToXHR($bind = true) + { + $this->ajaxHandlerBindToXHR = $bind; + return $this; + } + + /** + * Checks whether bindToXHR() will be called on the ajax handler + * + * @return boolean + */ + public function isAjaxHandlerBoundToXHR() + { + return $this->ajaxHandlerBindToXHR; + } + + /** + * Sets the class name of the js open handler + * + * @param string $className + */ + public function setOpenHandlerClass($className) + { + $this->openHandlerClass = $className; + return $this; + } + + /** + * Returns the class name of the js open handler + * + * @return string + */ + public function getOpenHandlerClass() + { + return $this->openHandlerClass; + } + + /** + * Sets the url of the open handler + * + * @param string $url + */ + public function setOpenHandlerUrl($url) + { + $this->openHandlerUrl = $url; + return $this; + } + + /** + * Returns the url for the open handler + * + * @return string + */ + public function getOpenHandlerUrl() + { + return $this->openHandlerUrl; + } + + /** + * Add assets to render in the head + * + * @param array $cssFiles An array of filenames + * @param array $jsFiles An array of filenames + * @param string $basePath Base path of those files + * @param string $baseUrl Base url of those files + */ + public function addAssets($cssFiles, $jsFiles, $basePath = null, $baseUrl = null) + { + $this->additionalAssets[] = array( + 'base_path' => $basePath, + 'base_url' => $baseUrl, + 'css' => (array) $cssFiles, + 'js' => (array) $jsFiles + ); + return $this; + } + + /** + * Returns the list of asset files + * + * @param string $type Only return css or js files + * @param string $relativeTo The type of path to which filenames must be relative (path, url or null) + * @return array + */ + public function getAssets($type = null, $relativeTo = self::RELATIVE_PATH) + { + $cssFiles = $this->cssFiles; + $jsFiles = $this->jsFiles; + + if ($this->includeVendors !== false) { + if ($this->includeVendors === true || in_array('css', $this->includeVendors)) { + $cssFiles = array_merge($this->cssVendors, $cssFiles); + } + if ($this->includeVendors === true || in_array('js', $this->includeVendors)) { + $jsFiles = array_merge($this->jsVendors, $jsFiles); + } + } + + if ($relativeTo) { + $root = $this->getRelativeRoot($relativeTo, $this->basePath, $this->baseUrl); + $cssFiles = $this->makeUriRelativeTo($cssFiles, $root); + $jsFiles = $this->makeUriRelativeTo($jsFiles, $root); + } + + $additionalAssets = $this->additionalAssets; + // finds assets provided by collectors + foreach ($this->debugBar->getCollectors() as $collector) { + if (($collector instanceof AssetProvider) && !in_array($collector->getName(), $this->ignoredCollectors)) { + $additionalAssets[] = $collector->getAssets(); + } + } + + foreach ($additionalAssets as $assets) { + $basePath = isset($assets['base_path']) ? $assets['base_path'] : null; + $baseUrl = isset($assets['base_url']) ? $assets['base_url'] : null; + $root = $this->getRelativeRoot($relativeTo, + $this->makeUriRelativeTo($basePath, $this->basePath), + $this->makeUriRelativeTo($baseUrl, $this->baseUrl)); + $cssFiles = array_merge($cssFiles, $this->makeUriRelativeTo((array) $assets['css'], $root)); + $jsFiles = array_merge($jsFiles, $this->makeUriRelativeTo((array) $assets['js'], $root)); + } + + return $this->filterAssetArray(array($cssFiles, $jsFiles), $type); + } + + /** + * Returns the correct base according to the type + * + * @param string $relativeTo + * @param string $basePath + * @param string $baseUrl + * @return string + */ + protected function getRelativeRoot($relativeTo, $basePath, $baseUrl) + { + if ($relativeTo === self::RELATIVE_PATH) { + return $basePath; + } + if ($relativeTo === self::RELATIVE_URL) { + return $baseUrl; + } + return null; + } + + /** + * Makes a URI relative to another + * + * @param string|array $uri + * @param string $root + * @return string + */ + protected function makeUriRelativeTo($uri, $root) + { + if (!$root) { + return $uri; + } + + if (is_array($uri)) { + $uris = array(); + foreach ($uri as $u) { + $uris[] = $this->makeUriRelativeTo($u, $root); + } + return $uris; + } + + if (substr($uri, 0, 1) === '/' || preg_match('/^([a-zA-Z]+:\/\/|[a-zA-Z]:\/|[a-zA-Z]:\\\)/', $uri)) { + return $uri; + } + return rtrim($root, '/') . "/$uri"; + } + + /** + * Filters a tuple of (css, js) assets according to $type + * + * @param array $array + * @param string $type 'css', 'js' or null for both + * @return array + */ + protected function filterAssetArray($array, $type = null) + { + $type = strtolower($type); + if ($type === 'css') { + return $array[0]; + } + if ($type === 'js') { + return $array[1]; + } + return $array; + } + + /** + * Returns a tuple where the both items are Assetic AssetCollection, + * the first one being css files and the second js files + * + * @param string $type Only return css or js collection + * @return array or \Assetic\Asset\AssetCollection + */ + public function getAsseticCollection($type = null) + { + list($cssFiles, $jsFiles) = $this->getAssets(); + return $this->filterAssetArray(array( + $this->createAsseticCollection($cssFiles), + $this->createAsseticCollection($jsFiles) + ), $type); + } + + /** + * Create an Assetic AssetCollection with the given files. + * Filenames will be converted to absolute path using + * the base path. + * + * @param array $files + * @return \Assetic\Asset\AssetCollection + */ + protected function createAsseticCollection($files) + { + $assets = array(); + foreach ($files as $file) { + $assets[] = new \Assetic\Asset\FileAsset($file); + } + return new \Assetic\Asset\AssetCollection($assets); + } + + /** + * Write all CSS assets to standard output or in a file + * + * @param string $targetFilename + */ + public function dumpCssAssets($targetFilename = null) + { + $this->dumpAssets($this->getAssets('css'), $targetFilename); + } + + /** + * Write all JS assets to standard output or in a file + * + * @param string $targetFilename + */ + public function dumpJsAssets($targetFilename = null) + { + $this->dumpAssets($this->getAssets('js'), $targetFilename); + } + + /** + * Write assets to standard output or in a file + * + * @param array $files + * @param string $targetFilename + */ + protected function dumpAssets($files, $targetFilename = null) + { + $content = ''; + foreach ($files as $file) { + $content .= file_get_contents($file) . "\n"; + } + if ($targetFilename !== null) { + file_put_contents($targetFilename, $content); + } else { + echo $content; + } + } + + /** + * Renders the html to include needed assets + * + * Only useful if Assetic is not used + * + * @return string + */ + public function renderHead() + { + list($cssFiles, $jsFiles) = $this->getAssets(null, self::RELATIVE_URL); + $html = ''; + + foreach ($cssFiles as $file) { + $html .= sprintf('' . "\n", $file); + } + + foreach ($jsFiles as $file) { + $html .= sprintf('' . "\n", $file); + } + + if ($this->enableJqueryNoConflict) { + $html .= '' . "\n"; + } + + return $html; + } + + /** + * Register shutdown to display the debug bar + * + * @param boolean $here Set position of HTML. True if is to current position or false for end file + * @param boolean $initialize Whether to render the de bug bar initialization code + * @return string Return "{--DEBUGBAR_OB_START_REPLACE_ME--}" or return an empty string if $here == false + */ + public function renderOnShutdown($here = true, $initialize = true, $renderStackedData = true, $head = false) + { + register_shutdown_function(array($this, "replaceTagInBuffer"), $here, $initialize, $renderStackedData, $head); + + if (ob_get_level() === 0) { + ob_start(); + } + + return ($here) ? self::REPLACEABLE_TAG : ""; + } + + /** + * Same as renderOnShutdown() with $head = true + * + * @param boolean $here + * @param boolean $initialize + * @param boolean $renderStackedData + * @return string + */ + public function renderOnShutdownWithHead($here = true, $initialize = true, $renderStackedData = true) + { + return $this->renderOnShutdown($here, $initialize, $renderStackedData, true); + } + + /** + * Is callback function for register_shutdown_function(...) + * + * @param boolean $here Set position of HTML. True if is to current position or false for end file + * @param boolean $initialize Whether to render the de bug bar initialization code + */ + public function replaceTagInBuffer($here = true, $initialize = true, $renderStackedData = true, $head = false) + { + $render = ($head ? $this->renderHead() : "") + . $this->render($initialize, $renderStackedData); + + $current = ($here && ob_get_level() > 0) ? ob_get_clean() : self::REPLACEABLE_TAG; + + echo str_replace(self::REPLACEABLE_TAG, $render, $current, $count); + + if ($count === 0) { + echo $render; + } + } + + /** + * Returns the code needed to display the debug bar + * + * AJAX request should not render the initialization code. + * + * @param boolean $initialize Whether to render the de bug bar initialization code + * @return string + */ + public function render($initialize = true, $renderStackedData = true) + { + $js = ''; + + if ($initialize) { + $js = $this->getJsInitializationCode(); + } + + if ($renderStackedData && $this->debugBar->hasStackedData()) { + foreach ($this->debugBar->getStackedData() as $id => $data) { + $js .= $this->getAddDatasetCode($id, $data, '(stacked)'); + } + } + + $suffix = !$initialize ? '(ajax)' : null; + $js .= $this->getAddDatasetCode($this->debugBar->getCurrentRequestId(), $this->debugBar->getData(), $suffix); + + return "\n"; + } + + /** + * Returns the js code needed to initialize the debug bar + * + * @return string + */ + protected function getJsInitializationCode() + { + $js = ''; + + if (($this->initialization & self::INITIALIZE_CONSTRUCTOR) === self::INITIALIZE_CONSTRUCTOR) { + $js .= sprintf("var %s = new %s();\n", $this->variableName, $this->javascriptClass); + } + + if (($this->initialization & self::INITIALIZE_CONTROLS) === self::INITIALIZE_CONTROLS) { + $js .= $this->getJsControlsDefinitionCode($this->variableName); + } + + if ($this->ajaxHandlerClass) { + $js .= sprintf("%s.ajaxHandler = new %s(%s);\n", $this->variableName, $this->ajaxHandlerClass, $this->variableName); + if ($this->ajaxHandlerBindToXHR) { + $js .= sprintf("%s.ajaxHandler.bindToXHR();\n", $this->variableName); + } elseif ($this->ajaxHandlerBindToJquery) { + $js .= sprintf("if (jQuery) %s.ajaxHandler.bindToJquery(jQuery);\n", $this->variableName); + } + } + + if ($this->openHandlerUrl !== null) { + $js .= sprintf("%s.setOpenHandler(new %s(%s));\n", $this->variableName, + $this->openHandlerClass, + json_encode(array("url" => $this->openHandlerUrl))); + } + + return $js; + } + + /** + * Returns the js code needed to initialized the controls and data mapping of the debug bar + * + * Controls can be defined by collectors themselves or using {@see addControl()} + * + * @param string $varname Debug bar's variable name + * @return string + */ + protected function getJsControlsDefinitionCode($varname) + { + $js = ''; + $dataMap = array(); + $excludedOptions = array('indicator', 'tab', 'map', 'default', 'widget', 'position'); + + // finds controls provided by collectors + $widgets = array(); + foreach ($this->debugBar->getCollectors() as $collector) { + if (($collector instanceof Renderable) && !in_array($collector->getName(), $this->ignoredCollectors)) { + if ($w = $collector->getWidgets()) { + $widgets = array_merge($widgets, $w); + } + } + } + $controls = array_merge($widgets, $this->controls); + + foreach (array_filter($controls) as $name => $options) { + $opts = array_diff_key($options, array_flip($excludedOptions)); + + if (isset($options['tab']) || isset($options['widget'])) { + if (!isset($opts['title'])) { + $opts['title'] = ucfirst(str_replace('_', ' ', $name)); + } + $js .= sprintf("%s.addTab(\"%s\", new %s({%s%s}));\n", + $varname, + $name, + isset($options['tab']) ? $options['tab'] : 'PhpDebugBar.DebugBar.Tab', + substr(json_encode($opts, JSON_FORCE_OBJECT), 1, -1), + isset($options['widget']) ? sprintf('%s"widget": new %s()', count($opts) ? ', ' : '', $options['widget']) : '' + ); + } elseif (isset($options['indicator']) || isset($options['icon'])) { + $js .= sprintf("%s.addIndicator(\"%s\", new %s(%s), \"%s\");\n", + $varname, + $name, + isset($options['indicator']) ? $options['indicator'] : 'PhpDebugBar.DebugBar.Indicator', + json_encode($opts, JSON_FORCE_OBJECT), + isset($options['position']) ? $options['position'] : 'right' + ); + } + + if (isset($options['map']) && isset($options['default'])) { + $dataMap[$name] = array($options['map'], $options['default']); + } + } + + // creates the data mapping object + $mapJson = array(); + foreach ($dataMap as $name => $values) { + $mapJson[] = sprintf('"%s": ["%s", %s]', $name, $values[0], $values[1]); + } + $js .= sprintf("%s.setDataMap({\n%s\n});\n", $varname, implode(",\n", $mapJson)); + + // activate state restoration + $js .= sprintf("%s.restoreState();\n", $varname); + + return $js; + } + + /** + * Returns the js code needed to add a dataset + * + * @param string $requestId + * @param array $data + * @return string + */ + protected function getAddDatasetCode($requestId, $data, $suffix = null) + { + $js = sprintf("%s.addDataSet(%s, \"%s\"%s);\n", + $this->variableName, + json_encode($data), + $requestId, + $suffix ? ", " . json_encode($suffix) : '' + ); + return $js; + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/OpenHandler.php b/vendor/maximebf/debugbar/src/DebugBar/OpenHandler.php new file mode 100644 index 0000000..cbabea2 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/OpenHandler.php @@ -0,0 +1,107 @@ +isDataPersisted()) { + throw new DebugBarException("DebugBar must have a storage backend to use OpenHandler"); + } + $this->debugBar = $debugBar; + } + + /** + * Handles the current request + * + * @param array $request Request data + */ + public function handle($request = null, $echo = true, $sendHeader = true) + { + if ($request === null) { + $request = $_REQUEST; + } + + $op = 'find'; + if (isset($request['op'])) { + $op = $request['op']; + if (!in_array($op, array('find', 'get', 'clear'))) { + throw new DebugBarException("Invalid operation '{$request['op']}'"); + } + } + + if ($sendHeader) { + $this->debugBar->getHttpDriver()->setHeaders(array( + 'Content-Type' => 'application/json' + )); + } + + $response = json_encode(call_user_func(array($this, $op), $request)); + if ($echo) { + echo $response; + } + return $response; + } + + /** + * Find operation + */ + protected function find($request) + { + $max = 20; + if (isset($request['max'])) { + $max = $request['max']; + } + + $offset = 0; + if (isset($request['offset'])) { + $offset = $request['offset']; + } + + $filters = array(); + foreach (array('utime', 'datetime', 'ip', 'uri', 'method') as $key) { + if (isset($request[$key])) { + $filters[$key] = $request[$key]; + } + } + + return $this->debugBar->getStorage()->find($filters, $max, $offset); + } + + /** + * Get operation + */ + protected function get($request) + { + if (!isset($request['id'])) { + throw new DebugBarException("Missing 'id' parameter in 'get' operation"); + } + return $this->debugBar->getStorage()->get($request['id']); + } + + /** + * Clear operation + */ + protected function clear($request) + { + $this->debugBar->getStorage()->clear(); + return array('success' => true); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/PhpHttpDriver.php b/vendor/maximebf/debugbar/src/DebugBar/PhpHttpDriver.php new file mode 100644 index 0000000..af07060 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/PhpHttpDriver.php @@ -0,0 +1,49 @@ + $value) { + header("$name: $value"); + } + } + + function isSessionStarted() + { + return isset($_SESSION); + } + + function setSessionValue($name, $value) + { + $_SESSION[$name] = $value; + } + + function hasSessionValue($name) + { + return array_key_exists($name, $_SESSION); + } + + function getSessionValue($name) + { + return $_SESSION[$name]; + } + + function deleteSessionValue($name) + { + unset($_SESSION[$name]); + } +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/RequestIdGenerator.php b/vendor/maximebf/debugbar/src/DebugBar/RequestIdGenerator.php new file mode 100644 index 0000000..934f407 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/RequestIdGenerator.php @@ -0,0 +1,22 @@ + div > * { + padding: 5px 5px; + font-size: 14px; + color: #555; + text-decoration: none; +} +div.phpdebugbar-header-left > * { + float: left; +} +div.phpdebugbar-header-right > * { + float: right; +} +div.phpdebugbar-header-right > select { + padding: 0; +} + +/* -------------------------------------- */ + +span.phpdebugbar-indicator, +a.phpdebugbar-indicator, +a.phpdebugbar-close-btn { + border-right: 1px solid #ddd; +} + +a.phpdebugbar-tab.phpdebugbar-active { + background: #ccc; + color: #444; + background-image: linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%); + background-image: -o-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%); + background-image: -moz-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%); + background-image: -webkit-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%); + background-image: -ms-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.41, rgb(173,173,173)), color-stop(0.71, rgb(209,209,209))); +} + a.phpdebugbar-tab span.phpdebugbar-badge { + display: none; + margin-left: 5px; + font-size: 11px; + line-height: 14px; + padding: 0px 6px; + background: #ccc; + border-radius: 4px; + color: #555; + font-weight: normal; + text-shadow: none; + vertical-align: middle; + } + a.phpdebugbar-tab i { + display: none; + vertical-align: middle; + } + a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-important { + background: #ed6868; + color: white; + } + +a.phpdebugbar-close-btn, a.phpdebugbar-open-btn, a.phpdebugbar-restore-btn, a.phpdebugbar-minimize-btn , a.phpdebugbar-maximize-btn { + width: 16px; + height: 16px; +} + +a.phpdebugbar-minimize-btn , a.phpdebugbar-maximize-btn { + padding-right: 0px !important; +} + +a.phpdebugbar-maximize-btn { display: none} + +a.phpdebugbar-minimize-btn { display: block} + +div.phpdebugbar-minimized a.phpdebugbar-maximize-btn { display: block} + +div.phpdebugbar-minimized a.phpdebugbar-minimize-btn { display: none} + +a.phpdebugbar-minimize-btn { + background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAZklEQVR4nM3OMQ4CIRAF0HcFVyvXErl/6VWM7eo11gYSQiBC5f5mksl/meFfCXggznSueGNPs4UDttT5YIUznmnZwvcC7XjhUl5t4Vh8k9GtfqeFf6IeHkI9PIRqPIVyTlhm0QHzBSfMK4g2snfEAAAAAElFTkSuQmCC) no-repeat 6px 6px; +} + +a.phpdebugbar-maximize-btn { + background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAZklEQVR4nM3OsQmAMBCF4Z+kcA13sUxhq9sZcAHBLVzIIqBNAuG4aNLlwVXvvuOglxhgbEUW2IEbcK3oiVOFJarCEgXg+sMaWoABOL/wJtCadRqeUnkUkIYDMOeFj++Vkna0w73nBRurK28mVdKbAAAAAElFTkSuQmCC) no-repeat 6px 6px; +} + +a.phpdebugbar-close-btn { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuM4zml1AAAADDSURBVDhPxZCxCsIwFEUzuGdwCvQD7BIIcehUXDqVfGM/wsG/iG4ifkzMlRuSPLo4eeFBue8c6Iv6b4wxW557Hs0KnWa3seqDxTiOyVqbhmF4UND4Rofdruyce3rvE6bIRSo9GOI1McbLPM/vVm4l7MAQr0kpHaQsJTDE+6zrepym6SVFdNgR69M+hBTLzWCI10gJvydvBkO8ZlmWayvhJnkzGOI1+fBTCOHWPkT7YNiBId4HizxnCKy+r81uX/otSn0A7dioI/vYX+8AAAAASUVORK5CYII=) no-repeat 9px 6px; +} + +a.phpdebugbar-open-btn { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAOCAYAAADJ7fe0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfdCgYULwwNKp3GAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjOM5pdQAAAA1UlEQVQ4T2OgKpCUlOQH4vdA/B8Jv4dKEwYgDdLS0v8NDQ3/GxsbwzGIj2YoGEO1oQJkjcRgqDZUAJKwsrJ6/v//fwdiMFQbKgAZkpGR0QR0ajy60wlgRJhBXSGhpqb2CNnZhHBkZORcqBEMDFBX2BsYGGBVjAv39vZaQ41gYIC6Ygs2hbiwr6/vdqA+DqgR4CiW19bWxqoYF87Ly4uFaocAZWXlydgU4sJ2dna3ga4QgGqHAC0trY/YFOPCKSkpDVCtCAA01QaIsaYJHFgCqpVagIEBACGlF2c3r4ViAAAAAElFTkSuQmCC) no-repeat 8px 6px; +} + +.phpdebugbar-indicator { + position: relative; + cursor: pointer; +} + .phpdebugbar-indicator span.phpdebugbar-text { + margin-left: 5px; + } + .phpdebugbar-indicator span.phpdebugbar-tooltip { + display: none; + position: absolute; + top: -30px; + background: #efefef; + opacity: .7; + border: 1px solid #ccc; + color: #555; + font-size: 11px; + padding: 2px 3px; + z-index: 1000; + text-align: center; + width: 200%; + right: 0; + } + .phpdebugbar-indicator:hover span.phpdebugbar-tooltip:not(.phpdebugbar-disabled) { + display: block; + } + +select.phpdebugbar-datasets-switcher { + float: right; + display: none; + margin: 2px 0 0 7px; + max-width: 200px; + max-height: 23px; + padding: 0; +} + +/* -------------------------------------- */ + +div.phpdebugbar-body { + border-top: 1px solid #ccc; + display: none; + position: relative; + height: 300px; +} + +/* -------------------------------------- */ + +div.phpdebugbar-panel { + display: none; + height: 100%; + overflow: auto; + width: 100%; +} +div.phpdebugbar-panel.phpdebugbar-active { + display: block; +} + +/* -------------------------------------- */ + +div.phpdebugbar-mini-design a.phpdebugbar-tab { + position: relative; + border-right: 1px solid #ddd; +} + div.phpdebugbar-mini-design a.phpdebugbar-tab span.phpdebugbar-text { + display: none; + } + div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text { + display: block; + position: absolute; + top: -30px; + background: #efefef; + opacity: .7; + border: 1px solid #ccc; + color: #555; + font-size: 11px; + padding: 2px 3px; + z-index: 1000; + text-align: center; + right: 0; + } + div.phpdebugbar-mini-design a.phpdebugbar-tab i { + display:inline-block; + } diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/debugbar.js b/vendor/maximebf/debugbar/src/DebugBar/Resources/debugbar.js new file mode 100644 index 0000000..4c9b1f1 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Resources/debugbar.js @@ -0,0 +1,1129 @@ +if (typeof(PhpDebugBar) == 'undefined') { + // namespace + var PhpDebugBar = {}; + PhpDebugBar.$ = jQuery; +} + +(function($) { + + if (typeof(localStorage) == 'undefined') { + // provide mock localStorage object for dumb browsers + localStorage = { + setItem: function(key, value) {}, + getItem: function(key) { return null; } + }; + } + + if (typeof(PhpDebugBar.utils) == 'undefined') { + PhpDebugBar.utils = {}; + } + + /** + * Returns the value from an object property. + * Using dots in the key, it is possible to retrieve nested property values + * + * @param {Object} dict + * @param {String} key + * @param {Object} default_value + * @return {Object} + */ + var getDictValue = PhpDebugBar.utils.getDictValue = function(dict, key, default_value) { + var d = dict, parts = key.split('.'); + for (var i = 0; i < parts.length; i++) { + if (!d[parts[i]]) { + return default_value; + } + d = d[parts[i]]; + } + return d; + } + + /** + * Counts the number of properties in an object + * + * @param {Object} obj + * @return {Integer} + */ + var getObjectSize = PhpDebugBar.utils.getObjectSize = function(obj) { + if (Object.keys) { + return Object.keys(obj).length; + } + var count = 0; + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + count++; + } + } + return count; + } + + /** + * Returns a prefixed css class name + * + * @param {String} cls + * @return {String} + */ + PhpDebugBar.utils.csscls = function(cls, prefix) { + if (cls.indexOf(' ') > -1) { + var clss = cls.split(' '), out = []; + for (var i = 0, c = clss.length; i < c; i++) { + out.push(PhpDebugBar.utils.csscls(clss[i], prefix)); + } + return out.join(' '); + } + if (cls.indexOf('.') === 0) { + return '.' + prefix + cls.substr(1); + } + return prefix + cls; + }; + + /** + * Creates a partial function of csscls where the second + * argument is already defined + * + * @param {string} prefix + * @return {Function} + */ + PhpDebugBar.utils.makecsscls = function(prefix) { + var f = function(cls) { + return PhpDebugBar.utils.csscls(cls, prefix); + }; + return f; + } + + var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-'); + + + // ------------------------------------------------------------------ + + /** + * Base class for all elements with a visual component + * + * @param {Object} options + * @constructor + */ + var Widget = PhpDebugBar.Widget = function(options) { + this._attributes = $.extend({}, this.defaults); + this._boundAttributes = {}; + this.$el = $('<' + this.tagName + ' />'); + if (this.className) { + this.$el.addClass(this.className); + } + this.initialize.apply(this, [options || {}]); + this.render.apply(this); + }; + + $.extend(Widget.prototype, { + + tagName: 'div', + + className: null, + + defaults: {}, + + /** + * Called after the constructor + * + * @param {Object} options + */ + initialize: function(options) { + this.set(options); + }, + + /** + * Called after the constructor to render the element + */ + render: function() {}, + + /** + * Sets the value of an attribute + * + * @param {String} attr Can also be an object to set multiple attributes at once + * @param {Object} value + */ + set: function(attr, value) { + if (typeof(attr) != 'string') { + for (var k in attr) { + this.set(k, attr[k]); + } + return; + } + + this._attributes[attr] = value; + if (typeof(this._boundAttributes[attr]) !== 'undefined') { + for (var i = 0, c = this._boundAttributes[attr].length; i < c; i++) { + this._boundAttributes[attr][i].apply(this, [value]); + } + } + }, + + /** + * Checks if an attribute exists and is not null + * + * @param {String} attr + * @return {[type]} [description] + */ + has: function(attr) { + return typeof(this._attributes[attr]) !== 'undefined' && this._attributes[attr] !== null; + }, + + /** + * Returns the value of an attribute + * + * @param {String} attr + * @return {Object} + */ + get: function(attr) { + return this._attributes[attr]; + }, + + /** + * Registers a callback function that will be called whenever the value of the attribute changes + * + * If cb is a jQuery element, text() will be used to fill the element + * + * @param {String} attr + * @param {Function} cb + */ + bindAttr: function(attr, cb) { + if ($.isArray(attr)) { + for (var i = 0, c = attr.length; i < c; i++) { + this.bindAttr(attr[i], cb); + } + return; + } + + if (typeof(this._boundAttributes[attr]) == 'undefined') { + this._boundAttributes[attr] = []; + } + if (typeof(cb) == 'object') { + var el = cb; + cb = function(value) { el.text(value || ''); }; + } + this._boundAttributes[attr].push(cb); + if (this.has(attr)) { + cb.apply(this, [this._attributes[attr]]); + } + } + + }); + + + /** + * Creates a subclass + * + * Code from Backbone.js + * + * @param {Array} props Prototype properties + * @return {Function} + */ + Widget.extend = function(props) { + var parent = this; + + var child = function() { return parent.apply(this, arguments); }; + $.extend(child, parent); + + var Surrogate = function(){ this.constructor = child; }; + Surrogate.prototype = parent.prototype; + child.prototype = new Surrogate; + $.extend(child.prototype, props); + + child.__super__ = parent.prototype; + + return child; + }; + + // ------------------------------------------------------------------ + + /** + * Tab + * + * A tab is composed of a tab label which is always visible and + * a tab panel which is visible only when the tab is active. + * + * The panel must contain a widget. A widget is an object which has + * an element property containing something appendable to a jQuery object. + * + * Options: + * - title + * - badge + * - widget + * - data: forward data to widget data + */ + var Tab = Widget.extend({ + + className: csscls('panel'), + + render: function() { + this.$tab = $('').addClass(csscls('tab')); + + this.$icon = $('').appendTo(this.$tab); + this.bindAttr('icon', function(icon) { + if (icon) { + this.$icon.attr('class', 'fa fa-' + icon); + } else { + this.$icon.attr('class', ''); + } + }); + + this.bindAttr('title', $('').addClass(csscls('text')).appendTo(this.$tab)); + + this.$badge = $('').addClass(csscls('badge')).appendTo(this.$tab); + this.bindAttr('badge', function(value) { + if (value !== null) { + this.$badge.text(value); + this.$badge.show(); + } else { + this.$badge.hide(); + } + }); + + this.bindAttr('widget', function(widget) { + this.$el.empty().append(widget.$el); + }); + + this.bindAttr('data', function(data) { + if (this.has('widget')) { + this.get('widget').set('data', data); + } + }) + } + + }); + + // ------------------------------------------------------------------ + + /** + * Indicator + * + * An indicator is a text and an icon to display single value information + * right inside the always visible part of the debug bar + * + * Options: + * - icon + * - title + * - tooltip + * - data: alias of title + */ + var Indicator = Widget.extend({ + + tagName: 'span', + + className: csscls('indicator'), + + render: function() { + this.$icon = $('').appendTo(this.$el); + this.bindAttr('icon', function(icon) { + if (icon) { + this.$icon.attr('class', 'fa fa-' + icon); + } else { + this.$icon.attr('class', ''); + } + }); + + this.bindAttr(['title', 'data'], $('').addClass(csscls('text')).appendTo(this.$el)); + + this.$tooltip = $('').addClass(csscls('tooltip disabled')).appendTo(this.$el); + this.bindAttr('tooltip', function(tooltip) { + if (tooltip) { + this.$tooltip.text(tooltip).removeClass(csscls('disabled')); + } else { + this.$tooltip.addClass(csscls('disabled')); + } + }); + } + + }); + + // ------------------------------------------------------------------ + + /** + * Dataset title formater + * + * Formats the title of a dataset for the select box + */ + var DatasetTitleFormater = PhpDebugBar.DatasetTitleFormater = function(debugbar) { + this.debugbar = debugbar; + }; + + $.extend(DatasetTitleFormater.prototype, { + + /** + * Formats the title of a dataset + * + * @this {DatasetTitleFormater} + * @param {String} id + * @param {Object} data + * @param {String} suffix + * @return {String} + */ + format: function(id, data, suffix) { + if (suffix) { + suffix = ' ' + suffix; + } else { + suffix = ''; + } + + var nb = getObjectSize(this.debugbar.datasets) + 1; + + if (typeof(data['__meta']) === 'undefined') { + return "#" + nb + suffix; + } + + var filename = data['__meta']['uri'].substr(data['__meta']['uri'].lastIndexOf('/') + 1); + var label = "#" + nb + " " + filename + suffix + ' (' + data['__meta']['datetime'].split(' ')[1] + ')'; + return label; + } + + }); + + // ------------------------------------------------------------------ + + + /** + * DebugBar + * + * Creates a bar that appends itself to the body of your page + * and sticks to the bottom. + * + * The bar can be customized by adding tabs and indicators. + * A data map is used to fill those controls with data provided + * from datasets. + */ + var DebugBar = PhpDebugBar.DebugBar = Widget.extend({ + + className: "phpdebugbar " + csscls('minimized'), + + options: { + bodyPaddingBottom: true + }, + + initialize: function() { + this.controls = {}; + this.dataMap = {}; + this.datasets = {}; + this.firstTabName = null; + this.activePanelName = null; + this.datesetTitleFormater = new DatasetTitleFormater(this); + this.registerResizeHandler(); + }, + + /** + * Register resize event, for resize debugbar with reponsive css. + * + * @this {DebugBar} + */ + registerResizeHandler: function() { + if (typeof this.resize.bind == 'undefined') return; + + var f = this.resize.bind(this); + this.respCSSSize = 0; + $(window).resize(f); + setTimeout(f, 20); + }, + + /** + * Resizes the debugbar to fit the current browser window + */ + resize: function() { + var contentSize = this.respCSSSize; + if (this.respCSSSize == 0) { + this.$header.find("> div > *:visible").each(function () { + contentSize += $(this).outerWidth(); + }); + } + + var currentSize = this.$header.width(); + var cssClass = "phpdebugbar-mini-design"; + var bool = this.$header.hasClass(cssClass); + + if (currentSize <= contentSize && !bool) { + this.respCSSSize = contentSize; + this.$header.addClass(cssClass); + } else if (contentSize < currentSize && bool) { + this.respCSSSize = 0; + this.$header.removeClass(cssClass); + } + + // Reset height to ensure bar is still visible + this.setHeight(this.$body.height()); + }, + + /** + * Initialiazes the UI + * + * @this {DebugBar} + */ + render: function() { + var self = this; + this.$el.appendTo('body'); + this.$dragCapture = $('
      ').addClass(csscls('drag-capture')).appendTo(this.$el); + this.$resizehdle = $('
      ').addClass(csscls('resize-handle')).appendTo(this.$el); + this.$header = $('
      ').addClass(csscls('header')).appendTo(this.$el); + this.$headerLeft = $('
      ').addClass(csscls('header-left')).appendTo(this.$header); + this.$headerRight = $('
      ').addClass(csscls('header-right')).appendTo(this.$header); + var $body = this.$body = $('
      ').addClass(csscls('body')).appendTo(this.$el); + this.recomputeBottomOffset(); + + // dragging of resize handle + var pos_y, orig_h; + this.$resizehdle.on('mousedown', function(e) { + orig_h = $body.height(), pos_y = e.pageY; + $body.parents().on('mousemove', mousemove).on('mouseup', mouseup); + self.$dragCapture.show(); + e.preventDefault(); + }); + var mousemove = function(e) { + var h = orig_h + (pos_y - e.pageY); + self.setHeight(h); + }; + var mouseup = function() { + $body.parents().off('mousemove', mousemove).off('mouseup', mouseup); + self.$dragCapture.hide(); + }; + + // close button + this.$closebtn = $('').addClass(csscls('close-btn')).appendTo(this.$headerRight); + this.$closebtn.click(function() { + self.close(); + }); + + // minimize button + this.$minimizebtn = $('').addClass(csscls('minimize-btn') ).appendTo(this.$headerRight); + this.$minimizebtn.click(function() { + self.minimize(); + }); + + // maximize button + this.$maximizebtn = $('').addClass(csscls('maximize-btn') ).appendTo(this.$headerRight); + this.$maximizebtn.click(function() { + self.restore(); + }); + + // restore button + this.$restorebtn = $('').addClass(csscls('restore-btn')).hide().appendTo(this.$el); + this.$restorebtn.click(function() { + self.restore(); + }); + + // open button + this.$openbtn = $('').addClass(csscls('open-btn')).appendTo(this.$headerRight).hide(); + this.$openbtn.click(function() { + self.openHandler.show(function(id, dataset) { + self.addDataSet(dataset, id, "(opened)"); + self.showTab(); + }); + }); + + // select box for data sets + this.$datasets = $('
      ') + .append('Uri:
      ') + .append('IP:
      ') + .append(searchBtn) + .appendTo(this.$actions); + }, + + handleFind: function(data) { + var self = this; + $.each(data, function(i, meta) { + var a = $('
      ') + .text('Load dataset') + .on('click', function(e) { + self.hide(); + self.load(meta['id'], function(data) { + self.callback(meta['id'], data); + }); + e.preventDefault(); + }); + + var method = $('') + .text(meta['method']) + .on('click', function(e) { + self.$table.empty(); + self.find({method: meta['method']}, 0, self.handleFind.bind(self)); + e.preventDefault(); + }); + + var uri = $('') + .text(meta['uri']) + .on('click', function(e) { + self.hide(); + self.load(meta['id'], function(data) { + self.callback(meta['id'], data); + }); + e.preventDefault(); + }); + + var ip = $('') + .text(meta['ip']) + .on('click', function(e) { + self.$table.empty(); + self.find({ip: meta['ip']}, 0, self.handleFind.bind(self)); + e.preventDefault(); + }); + + var search = $('') + .text('Show URL') + .on('click', function(e) { + self.$table.empty(); + self.find({uri: meta['uri']}, 0, self.handleFind.bind(self)); + e.preventDefault(); + }); + + $('') + .append('' + meta['datetime'] + '') + .append('' + meta['method'] + '') + .append($('').append(uri)) + .append($('').append(ip)) + .append($('').append(search)) + .appendTo(self.$table); + }); + if (data.length < this.get('items_per_page')) { + this.$loadmorebtn.hide(); + } + }, + + show: function(callback) { + this.callback = callback; + this.$el.show(); + this.$overlay.show(); + this.refresh(); + }, + + hide: function() { + this.$el.hide(); + this.$overlay.hide(); + }, + + find: function(filters, offset, callback) { + var data = $.extend({}, filters, {max: this.get('items_per_page'), offset: offset || 0}); + this.last_find_request = data; + this.ajax(data, callback); + }, + + load: function(id, callback) { + this.ajax({op: "get", id: id}, callback); + }, + + clear: function(callback) { + this.ajax({op: "clear"}, callback); + }, + + ajax: function(data, callback) { + $.ajax({ + dataType: 'json', + url: this.get('url'), + data: data, + success: callback, + ignoreDebugBarAjaxHandler: true + }); + } + + }); + +})(PhpDebugBar.$); diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000..24fcc04 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..f7936cc1e789eea5438d576d6b12de20191da09d GIT binary patch literal 93888 zcmd42d0dmn)&M*q$&>IrNkAnE2~UDcwN|Yni)&k3x3<=`)U}E%VTWK6K=vJEku~ff z2)NYU>b2EsrK`4fm-cq?_I9~#Z?y|}wUaPGzcWvW^}g?Y-{1TDe%~J-50jZW&zUo4 zX3m_MIdh)XAt9@gJIX_1M)9VUdz`uQb8Cb_l^S0PqmA-jMExFexU{vQzhlR}Dh)B@ki~!*(XS z`L2Oi$OeH)3QIIRkak-N^tU4<(I*?t7T^Q^JdePSpHQs?y@k$QoE7S^@HP_5=u32E z?cZn7_@f`|4&A+b=dQbmp$v+V8->Cjus2ojnB|;FePMLxE6B0EAihaDre) zB>+~KzzgNkfTDy_e!z(l@GQ_y+PeSLcFKPQV7TZaD6}IU zU||5I@K_WM?fa8T5|pC32*5Uv^ot1~v?uTHng7)DbWAMJOY>ox&V-gY>ks?4at{mq z{@*cYLJv8)NfLUAssor4LJ&|h; zHLz#k*uaYe9}Ijw@Y}$hLDiscaLV9=gAWfrI=E_Z+hEdQ&S2Hxp21^-uMU1N`1Rm# zgLiJKZt8A6dK=aYsLKx>{4aH&0ndT)1B(XM3~V2W9*7%A9>^Q08R!}~G0->g(ZDwY z1A}PLbI=d!m^wIXaM9qJ!R>>|gL#8BgI$9s2Kxp-8vJH(;3m51d2>9i{OT$azXU#hz}SB2VOT*W{eKyVC;yjs z|JPRxtUO{^mE6R6C|T48Yi=G&mFB@piclzBssB@;??>QUsc=IXS6)cdynqAo{qLYm zI>3`CObEzXj?$p`0MiKcC_E3%cHy{S_s6t;NuE%C5yhhuPy#VcyZEE{KnGxV@51Il zc<0PJaiEO?-vZu9`aiW-fKfVtL(8~g3Kw{UcLG0r9nP{!S9uC^wVS40c~{-8G7xVTLf(D6LmK*T5yg>1xSuA4(LSTG z3odr$A*L`1#P{AqTEH8LDNjN`_u$j1Y`JhKZC76jbpao+@4GvazE`KK?thE(kecGT z+D+fN$_X*hhW2}ojCqvn9pFpur!xZgps@gVmeWEWco~7wI1l+zT2uyTaLYrBAW--{ z7=_=X<4iv|LSKN30atiG61(t)J_eZ3S0nELZ_)kzbMGD0E6@ZysQVs|Kx+mBr6don zqyc!F0pVWWRR_GI^AWZ|Ui{@Rt2{0$z34?b6KE(B~q7%309i(GjZ z9akReTS8$_oe(H41fiXj-UuFZuN*?tX`1rpY8T)?L}9cnl<|{+o})AbygUI{?J9pS z1~^SiAf|Q5A-MRbWoe)~fF3dcFA?f9LOR4%UKqO(914^Dfu_3N33+EZ$|vQCwoPak zrRUNuE*>HFq_7dVA1zPYHd431=l!(*hx8N|&omwhqiHJ+&pd#Qrgb@S?%s9L zgZ!iL-rJQQDd(bfe@qwlNO=F;2;UDmX`yEz-a+~PPXTaMG`Pn8ztVT{n#ax|vzUE%&bO}p~<(s_T5DZs|iaxR*bcc3Y>kH+-fNP7^KB}&7EL(?u?7Y@b0 zznrU18oT&&(FBn5j|%+%@+YD*P$Uv5?mHUN{9>CY8hS`HG|g>jn%L$osZfY36q0h% z;OmZj8Ie@ig`Ud`zFSdoFQJh6PX5EgcZzP*J|2mlTr=8jlp7KOV;mZVeBd-a0ZoUa zPas-|9z{#xxV937pyyF295Z6zSh52SZrLaw?M4l#4RxWz=p=d>^`SS>W%LQUhJHc= z=npguW(kQ%F7gzqMOu+wG*L8F6exOB^rR?66e>y(C5tjerJ@E=yQo`qMD(KQjOd)` zqUcT0Wznai??l%{zlr`O!lFBFtlL;Ot=km0K(|NSmblkx!K$tVu@HO_7UsElf~1;0pfY$#p2cC_2LMzQJf(z6Ss)uc|+ zEa{Q#m%Jc3Dfx?}Px7whs^m+__mW#uMyi%hmQIuUOM|5grAwu&r5mK7(imx?bcZxm znkCJZ7D{(ZYo%?{ZfUP{zx0&!y!18c+tMr2e(878o6=#%jZrXOjEtly%7t$d1ZR$u7#S$Uc>QBl}7AtL&!CAy>$?@(1Mp@?iM_ z`J?is@|E)Epx5&HY2jxfPFUen*Uy*+(|4ROY{9kgryUg9&UFSZ@ zJ;;5z`+E0i_XPK3_f+>h_g(I7?nm5DxSw^u=>ER@=kDLQUw6OdKFo?(jvdWv*vafe z>`GIli^%0{p$Yz5oQzQ7)3PqG)-H`&YV$L!zOf3Sn>5QjK1 zC*#zdmYd84aZhk-xiBt@OXMtEI+w>4bJbh}*T!{n`?!PL5$+UshI^U2z`em;;y&fR z;C|z7Dv&~=@Kksy#w#9BOjXQK_$z`G^AwLL9#=f6ct){C5u(_rcwVtx5vhn#Bq)*< z7R63QmLgA4s;E#@E9wR6{MP{ zdPMcOYN_gJ)hg9G)q2%t)izbQDoPcnN>Z6rsj3WBj;cUaqAFKasp?dXs#et=Rkv!t z>X7P~>P6KV)j8Fxs$W&M=!7t{IWff?8(}ttnId8gNvVbeW3mAZqb7^l5@ww4?-xDa@5lNv4q4q;TWTuDLi>8L%1YEZmq78EXjx8<@qg(-InEpw>SjnHC#q ziGdfvV@fzD)HirEqyl}>q%O^O5@p~y&5z>5ltFwhWOqpZCOa>UQhV+LOs)ForN*$zVXdhd7cJD2${HabRc!+Nma^vw5zxz-)3tiaC^yY+`KENXj|> z0?-&QL_1QTBCu5onb@Q#qmVF1m<(V|j4{GEQnp8i7RorsI6MqGQ5fwolgXIo>{=n^ z>`oz>lI(m*2Uh3>DhMDHu^EQYsFZ|+k)$~>EFr%9xnhnq;NwG=M0;kYjNrs591Vd6J)CQJbV`79cF%bqYF)TXCaIbe#l3jg6 z*)bU`X$Av~jWIcyQi^~{6a_M5Fga@&Nz+p()A2RC8u1e>5vhXb{~f zVTwDaHXTivu?ewB@gQ5yK}$|C$3P=M?hPiG#4yv7;wc`;pUIdUlO7!lwS)_tI47(y zA7NONgo!AKrjxpBayfItTcOxU%Uq3e5=;Sg5D^b@0y0kfFVbW-$3#Yk!@xr4B!wFi z5+Z1yMM1Aw3^6b=p@M7(DLNH}L`t#{(Kb8fDfCZ)`Zs`3_TL~dqJjjDl%OP{6O7@8 zG!x9n7)zKr-V90%Iwjl`Ylw;fb3GM0r(}cG-LNACW_?mrY*MTxJ;7i$3xH^o5jqKa z5CknHGTaab^Eo2L5&<^~$zjQYc*G`~;Z}k6aA-IPALvx02?Qr4!I)qMyM8?ATObl0 zlL9Kl1f)QHg(raFKN_@!DJ3Ev#tN8%S$8iXbaJ%O7!4}--lV-R4?_iF18T$)Ds+^P zg60b`?Mi3L*+o>XCYjA}oj`+7KuDy3EIXGBVf;rV2$(b`7^1@xB0=wm8(|nnM3W-9 zq?D#X!&=O-7HCH@h^z@lH!K;{mjQHW3@EXbgm9R`FqY8FVIjIR%d{OreR9 zP|6ZxggKCGFsH-<^JW8;7H5r7Q3gYl(HJSLKY|9Qm8Zmleou;qQpr@!hb2OVVM!5& zL_=hJtR;%_0Hos#mT-f?6eIL!)T}5&q%j4$J`}iuU)oXs1`zt|-ykW;|CXhl{byNc zN+{$^f_@VSQ?y8fIUe*ibPD_m18zw)hSN3FImw)oD#*)@6c9dv8)r(O2<=Kr0#S3V zpb4&N3$4FjG0{%CPdU-7VJGk*tjiHbIx1#i-8Lsetw0`v>T4u$0?9`pgo zROswE^X}8-W{^4)Ou5)(i#a9SnFyUdHy}ABBZKx$tO3R_meQenfi8aRL!Z&C>wA)Jmd=-+VAD*?0T-GhzXPJ&9L3WQ?agHY~W zP(kbcTZX<34G0K?5R?wfR7$u(Xvj!?=P9|e)B*=5h&Pcea1s!6JPfrHDlwvZ&vO!mJ7H>%)yJ`NFyw( zBMThu);V)iVdDwgGl7B7fVs1rONBFQ1i)+v0T7`7=LSIthA;=hTnO`0l46(nKRzqU zKg>TgU>=~(3xG7B&I8nWfI1IQ=K<=xd7*)`C|)?kvmpdP2o#Dx;Sb4R2y-CJg#f7j zvmgN6A5i@P)jtqI5Cp*U2Rwhk^LN(1c$PqAF<{RI?Ad@l8?a{s_H4kO4cM~*dp1xF z0IC6i7XWwxfEVCoV2P8$5`Tfv68aJf1UShr335V%oe@wAgpz?!Lm<=;2sH#!7!(L} z7FY_E1VJT1Kqm-Lg8(%MP=f$92vCCnH3*mq2E1Uv3kJMkzzcRVvy6fPHF!>xe-s4+ z>KuU00n|BwItO5LfaDw?IVTu!A|M8ma{zBH;LQa*7_&eavp^WLKp3+?7_&eavp^WL zz`1}o5Afyz9t>FEJiwb57&V*r_`G0lFFkC?}TtP5gLHB3 zFi=4-P(d(IK`>B3Fi=4-P(d(IK`{A)0st=n@B#o2#wRFX-k+Wkf4VmO-yAYT5!5=y zqOoWadJs(mXNAY$l7Bf`fmWl9Xe-#nN>K%>Mz5l;(f8;k*uI9)9g!Qj?XV)1XtZdY zXo6^#C`hzi6fQ~;Wr^}c6`~rERkT;MPjpK3w&*?4HPN@Cf4a?fd)#fA+X}a5!N#@K zEd^{`Ic^1D=i29XR4fup#VpvgW`aGdM*Ok(SMe<|0h`q_$x6vOuu~;UQY9IZd`Y>a z3M^D7B>j>fq_d@Kz!J3uY*EqDU0{FOFFhttpC$ zXN+KBdXYK9T$8b~F*0x2DzGJm${J+NU`0A9ds%it_NMHz>?_%CGAu`Ocll`fSh+^7 zlg|Si(i8HhIbiwOsxT|c6b*`2#a_ie#UZfmyb0Ev-xU8+%9P$w?y6XohiaVaL9nwtty-vBhJ% zN0di`N3utXN4iIjM}qa z!N1rR>QoEa70hy8zhXUmWjoKQC-B_Z@%&1@hX3TvbxU*{4!~-70`%NGR>wWa>bU@3 z -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 E0UHWiZ2$lO literal 0 HcmV?d00001 diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..33b2bb80055cc480e797de704925acaba4ba7d7d GIT binary patch literal 60767 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%0DKehr}RFC`2XTB_?==0w^)u1m5PYii@6f)6_5Ydu zv+NIZ_(Rt}Q++LT5!n8!J4x!>sE&v_3*cXat{Zq5;17w;B6$epw}$Rg`0nFJg5D-L zYvw@(goc5TeJjM($AJAZxZHZN}RzBcP0=_>ZI6WVGU zO#Nk-YqZTa3{!84P0K~GsI#32<+_AsXU43wILwZS(8n%S9)lP!Dg$$e2$$9$E?^Nj zql4do#+a8qEP(bD2)DpP|$dp<`TZ#bY6^~7Xv_Lle)77^OsVhMOm(@ z??8O8kA%}ZWpR&2v!7qFSw@TF6d*=9YT^Rtk(n8p=CQWvt1Om=n&5uP;GiT6 zMRvbm39kbp*KB`qoVg12w52Z)T}`X41P>D|q_%K#zuhwb+BpEogY0E)KnSy#@+(m5 z20@LG@LUEvk`I|OIUV^^0_YtG9AElBS!Dsh%k^P9r0moJ25Lkm-gh#igwBDhAOj0!EF&8MxV^-m1U1MEd?H7} zL;r;tfFIT|ei3-Z@gyM=!%Ba7Pa626JRAA`V<2D<{RLRT@0o=bE)XF)nFtUL67`2L z{?_Qz_`Yy2t+I)?9&z#z__Q%L3pnhN}U z_rN#WU)kD59D4whbSYERHY01jM7id50EuI1ctl?<_IT=Y5vP>(sNNkB&U5&F&^kBhm5y{o!y!F+4wdxXoy;!4$W`?_nL(+bK_QDAMUV1O0AwZ| z6j)s}9YEZbY-C^Y)9Ej`aS&~{sXCG2SS3ce$EY;Yv-c8TlrD$C85ATlLZpGP_YWfi z`RQ?z1@zIfa{yqfsUDMEPpwuX%XHdO+ASb3EPi1fBPocvfgsC0xa^CG2SWBPWQ&GS zpCXPti8b>WkYbf#Vg%A?&_UwUsUQE_t4GX?7QqUpKJ2Iw#%)Q4Ft(`9Ja&Yk{C@38 z@%T`)#wWy(kKfEH;ZBQ(m*Iq&L=<)4D7tNO{SsA4Fp4D?(Ex6nQS&f3TK|atgj`fE z2|OX0(&(ZqxJd~IANX&dvX?U14_<~h2(lP6k^H8ep;2HW6oPo?U%v{M>|{sU~;p zLTv$OTx3H^4zNUn4wUfo>j{CEvTC@C+cw+cW*ABH6u@!M2EdBL?1GbL_#e;7YDBas zic?MTazk(khXSyPeDom_I~wkLv?Wr8<%egEfM!*M9^kl$>zsVzaP}S!gcD3;Czy#58RTm?`p)RTS8I<-sC3+*n{A)P*rU!@Npj`e{x9xsif2v zTW`{q3p^?A!Mk60Q{(FLt(&TVe9z z0-!PiOV02JcNeq?AbJaI+B9xC;LB=}Ho0vH(@;Qe0zq~-8ckOa!(u@Wou`p_TR|QT z38H`lJE$G{q1egUX@&v$x7wNLWD#j*!D58GLv^bT+jpdKBrK#SsQsWK(+RO40VA^w z0nA7MN1Y1Fc#5JkwD5TtHG1t;lo=i)U+kFG?1Jh11h9382!marrRE2eZh;JGh`wNO zQA_~n?%97HOKLA^#oG(5*bgSllS%rOc(S%Yj00cYR;!D9G_90{pfq7D4I*$k?byOV zR|epi%oIJ{ou`5zS!-_dnxOa{uNv)(luMo^5TCOItq}2}sxCztLEzBGS)Mf6dzaw< z!GweAgvFYJu&mH(Vl9HJBV%=Jz~~i%nDGIF9ncTET-AQ=fv{L11&K_;ei!iht(!De;ym|y7ksL|^5Ko~B-vSh80++s?unD}bZaYa@ zPH4M$&fw;xEGN3_H1vHW><%-+dg7dfW)F8$bB+h7sThoOtteO(v{&-+iK}r$%G))# z*Nhx^!ZMj1VeG?EkWg+0CYQSX1t96fV9^3c+9C393LU&CHsFCa1q99$`zTMsEWwLc zxsw1|A?k8-m8HCrk6;K7dhNDJN3R9iws%6vTq_}PtR2CZ8TG;ltZ4I}sU+^s8`P3F5QxrypG1-{ zGlr^7$Wsy(lo=xfC~BpKfg<2z4OEeEF@~x{Pi7O#CvqMJy+f+}=CB_$&IuEslB@s# J000000038FvZ??8 literal 0 HcmV?d00001 diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..1ee89d4 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ed9372f8ea0fbaa04f42630a48887e4b38945345 GIT binary patch literal 122092 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 +|+&Vdls@0SAya!5R?! ziVniRxeJP4Y;H*nR85uKLQ+b)snu%yXP=4xXp%p*V(|Ms+&!Ts<#?NwEy!5pm*V^D z-Dg(@-2T08jZHJMJ;tBX$}KEx30j?M*HUJ5Mb<~Bq@%FJ=7BOwx*lFd+F$0K&xW1pdHaQkd=Bs^f@3fK$p_V zG9Hv2&)O0|T2OPy!GKHF0X#SXs4z0Taeg=3QC~5u`}}#6=S3N37Oi2%(w*yCCSSO< zyLqvN<$urJ`x3fcQz5`fWSUx3WgYwdE#Xz6*&n-Zbw~V+{iC zvns#ZXmMIqg)QTL7MZ;K`UR~kCQXi&)xL25g^ye`E2@RW`phY`J}1GhPoTK=wg^jS zns~aMSW_T9(k1JEf z?H?bX?7T1k`f}^KrDwT)O2xQ#Ilv(aC0M;dm(kt|>3YmubBNSoB<_T?25ll$8=6Rh z5r8U~Rhl9!p)LqJks|QabdX~_-6T^Vh;0oAU$ux&w zujJkfnis{aOi@)^-BSrwuIVv;KOM6ud(XYJ%&#%7$o2=~I|BZyc%;FVOGX}x;4i62 z#nhmr3{_xm8B?8h#BmmRlFiViv2+8B>%c?Q8O1dDL_H+<36jQ)hFz84vhc zn6)AnaW$~B*0cN8Z{ro=Xh3n4xt!ZC<`EwQQ%qwl3*E+A>3#@s3*(qj!l5yPn88L_ z7(_^#A%s8eICk+?(7#06W3w+ENk(Qvq%6VGX~IBf;(<^An=lx=tdS801ZTsp8Wn^&D$b;III8>|cq?v&%ITV+`EV8j&r1NHBD%&}Fg9G&f1 zB@$7x?VS#%Ta^bTS%o@e%vFW1syAZHIppB6k|AF>n>jVk6?IAb!PfQ{9-DjWA@^+k zw_86a>y;LL{@f*Ps-wd0*uFuG`SGFjxHdW15tQ4;rGts;TFz^$6Twqn6uiqAd4|xe zmC7B)$|*i7uS3T40ob)v1O`<>;P*W4}nzfnD?w$^S>~ zHq8}fG)A;rG)l!$Sn7xz$MJu=-DB+&J}N(Yyh}&BbgXe*wD_MM>3?XfKdOym?~iTs z2)vZSPHFm|8s!g_(~Z>}Q`<=FZEAFyLu2!&g7?z$WABgc>)1S#p!guN_B00#_m7Kv zYS!sLUQ&AWozhaJ>4D*T*;S`X4*qrcsxnfbY(R7AGx|D|8$Y*Rmv^}5Qe(2D4-oO12yVqCYaHdH>)ZkV9?A|Af zcMffTg6;RK&;popG4Lj!uXOmXR7p*^CU}#!X0TKlhJgex3ob?Qws>(WOu#fO7KENG zx212(mOf?6@f^$caZnQmJm^z`0R3rNL71-Im3y528}vY6j_f{Hm6JQ6!WmWtg9 zSuIL}$Ac_mlca&eD~G00inpirU`vp-fSRd~Vw+a|c~y>I z9kS{9-|9H>D!q;M4fY$o>YtNO8of^@+A^s>CsArsPVNg)DO-q2ec$LE>}P#^Ad`HO z^*xbF{Rxr|!7B-RS%c_7oc@7wjse z&9euO$5W}etj*s13L9s8%m!=~2pQ=|0jf%lC~@L-#6KQz6HXovb%R zn`vUze(*aadj+Q>r&Be8qz}Sqr7cN%axzJg!2m!GQzeIC9T8xap{TBa&x=BS9f0@; zQnXi$bBtG(XjhzjS=8Fx+G2@bcJ3A05|&HES!29C?D2%#uEYggFSu z66gc+2e}`T#gyxqaGLLcykqOZt-V}|d5y=sF)v%QbE(| zJQgc^&By^?H1yxH$9Oty=T2A6#l5>aCNA$?ylnd9bVwi=6lpE?{YK37cwsd-8d(&k zmDIB*Pb^_F^k3{##MTuoC`-FLJfk+J4AEQZoZ6h47Wl*9Ps+N>jHP8|m*LEGek)Fw zmGL#kw~Adfr_#oUr_#Vw+GGoR1<#hTFNg=qj1TZARYLR0z#joUVm@aeC+r14h{VZA zKxAlRC3Z9p7%uLzqymZ)gGyVjm^5Nhp*5q7F8PNf=uRM`hU$cpbb!S5 zR%OHU$ENpD+T8uDA)W-yTz;@GWOkoe+dhgWL$;%PxBg4sI6Ta ze%s0KVz;~o3C;PB5Hpm;6y4xFeUaC zf&0l8j&}GG9ARoXOVFWd6Clwzlas(8_%&lVr)J4)0=%0zmZa%D1iQdQSdZ?L-$IrK zBjrccQ+#%(rkP_G9`0Hg@>A*|5I1_O>1WW;@fT?5FfcTH7&?Lwbl8Ec#m-+435*$5b$5>rzv_XF+v9zD9cb4RpaM=)FLWJ1^ixm1HFmk zzgd6^(pU_`BgavgIrd=XRG{$2!ldH>F zZcOX@ickCa7tT4b^k-$h3pK~gva;5AswouRHX}im`=|PS!HMJNPaV@GX{1lYdrdC( zsbEHAHXCF_VM#Q%!AxRQmq%G9N-$F{8ngEH3L`!=uB3zfq{jETd|aZENErR%YvxN8bVKsfz~13CUchHa`O3fzesD>u+~Ivd1!`)v{1o;^71x6v7= zQTdljtS(P7DrMh0^+Uszlz*6!;;6n9?54@dh=^IU2c~8va9RV(dySQ}ynp5QUxYL4 z5OKW7zw^VI%zuh!;Ls~dibv>KGPM2>6YAkH{}?<0eZo%|CIndFU0fA5l>jQ>Mbkf~ z;ODKzR^(lK`Y!+8{<8L{8l)^RI$mdl2Vvv*rjDaM=g+I$N+k4 zR%IJTiV`f<(+UqHmZI@nkmUWix0S||WIPL!N#j=-Yq*h?_-b&+|1I^h_egXwv zE&~MXf(J=h=zYmXfv4eU)$WV8pa~|wW)MR*ulH!23~($Pq_%+gaQC*0;~pYOU^o*BZf2S^4CPyV<=&iJ(*|4G<<8h*|(rENCWLnX)nm%SYk z<%bP&sXU6$6Lz@t0Ln+i11N&#fJSo;-J$+fy$Vt~46MT|WEg-jVk+!4jNXpAemE5L3J-%mkzuggkjZoQq^qKQ z;ayx(VIU%SDDkf18Z_%Yk);Y1R3d5;^}?2wNt>~z{D5!r;H!f3g$srg!_8DR({1Mr zXh^4lbPB7(?M=491_VBSs`~w=ibytcag*`BfOO;iri+oUXks=b&0EZ7E&^NOmhnD& z6Hi=*+aEVx65iG=AIBq?;r@dU7VoeYx?{XFe5Z78BOV2kLs)Ran$h%>Au7F;){_0L zX}SO!)o&8&d^|bG92q8$_?LW8p9BIp__)tzbG_!W*$@)s>n;q*a4BeZ@zjaGJn!-c zoX*f#>n;G zs$)-spz5eQfr;%E)YR9`yXBViHcidtrf#AX`VaK~eRZkOp&ztjl-Hv$rgK;)#Vg`G^N9=rDqatUz*Qn2|s#h#rA-CCf7yo4_|k zlS~;P2rU;(Q$Q_|rEC|_lQ2Ogb2SBjP?~di(nLOIy!N}DSoCGViZy{fO#f~ezqqYic~5t&8gQeY@6&?X4+aZSN-IX?FpY- zwx*M|v^Q*By=$xB^RR9pH*>>6R3aZenhtaKf{l1UAl-CW2sl+>@Nl|HAzjjlW^G8C zcxG?!nGyQ-x($5{RHtv7vcUGd7An+sQH z$U(o+xGOpMW5p#3l9NiqNJJ9yaQJZo*u`AXL^Ojb1DpWIX}C|;32iuswcNosrkXKf zroM6TW9%OG3cDx&Of+!)m!oyjoo5H+O9T6ibpBl@L%rZ*|)ZBxaR8= zbmr^VY}oeJOMm?V< zPdPlTW=LlN^4noS*9sdQ-`I90shuW80#XCT%ofL+g-0pL`2FC8V19&h=I-3#)&qcW2a}_UB}J|1U}AQV9s+_wb^`XBvBQYJ;{e} zW@Q%EA4tzWU~K!%{8!i|*If1KY3Kjjr0?A^t$!2s(=hmDBi;Oq&Y#OW4xj6pjcON6 z|HYo_p6Wj{k9V!d0lyku{K3wJp{kaa1>**2=NdS! zYVhMDeRgbP$I8~8=I++X6;ldD$Q!!o>PJO}qzQ{U8_Hr$mGv{Gt~hVUOtX$L7mH6R z)vKR5qkV3Dr4W-0x}f&%huXWJF8_2ojL!nhG42N@r4SDcS?ob_$Kq#jt5Ax^&dI@V(g! zUNDYNobIhqWR=^tcW!iz8-~QbC&zkdwm7?Y#`DzhfyupB=ii$fKBpp>UqIebaA1%%QuJNcb z*Ld{1AkQIo7~i?HsiA3U=Xf(q!H39Y+ssj5qLCc$&wbB${+VZ3_xD5zKy50dC?R5m z@C3hTq-g15G;kQll~Pc9Qi+j#I0=yj`HmO3%7TvSUJ}@zEDe6?iK2A(34g}V-++|A z!cRv3ROiru_N4r0A#*N~9}H{nG!g`x@@A@hSQ^ZKfjX$Jj32d|f@#!_I!)Rrr{tjZ z2PPZ(y5VXd)SLtpb_|&gIA_?gV=U*6s$h!>QrF71JEDf337mC@}GvhFHx|zPzq=A z7}Qm=TLsfnpkG1nwUec>*&!uN44@gcL;j%%-tohD*@?HDW%5A+nn5X&@^~uv7k?-~ zNb;1s9E#4AFGf8lQ=^a9LaLWHe7 zU}h{_L&Zr^>UOO@kzKuO*J_3%?_0e~?#qk3+)r0yyHG=6PFG+J`K1Qb1Y~CJ%QTy& z)jJD9^p7Aquo?v;L|m?@UtdveJl*(-?i2krnQFEeDJ5HzF%Av(uQ@W+_&1dmUL3>A z=T_GmTU+Kts;X<*KAhR)zVqiATQ$Y2lr)B9ITG*Jgl!G1T>wPH4FLBF=@+&o0y7fn z0Lpkj1dCW&rD|Hr7SyuJuUaWsSc%pa>s9D$@c{k-cd@K4$^E3|6ZoA_b{wEPN>dD2 zHRTLKFMP@hN3^~ruLr4LXdG$>Pz~iQgr{gvcY?wV(wxCQhJHaPtj!d1Jckj$PnG^I z0T|5;IZtu?ho!M}A_t6jJSXS!sEp-KrLCT_LO^3=>2jc=_ISg`>PAN!% zVK5F14Z4y}U}w6(v83C^0uO>SO`lmleb&^~E3Q><`t6yOtHx(8oL3ogMuMAWZoMZ` zcHbAad}rVKiQtVJVD2F7nq=5@$PbrW>lUV*-Pf+D^y^#KHg{Y(m6h`a+gui9+ETVs zUNdL=Ck`$5SUz#pLu#xQn*Jx@YlBT=Jx1nkN*av>XSR=%w!SVoAt-K3De|U)0x8=Xw_& zwg+ArJV5b3m0TgV-{9-yJBP^|{7yE1ot9gWIWECC2eQk|0{*3_Z%sGR19cr15$e4cY@OF>(-tp3car=xOvn~D)cf(UI2)38U96^w9@59ljQ2C%5#t0)c?5$HI3iEk4Kn_dC5Uiqh3lxY1ItDLa%Fuk-$YwtOLs(U2g* z0l=`G0yU0=arf74epXgnKVgQ==FqFQ>nr_^OUIYFZ6CJ<&($p-tFYQ!i$dd4Wz1_I zE^4{)lavoeWM^=!naC>m0GE6t% z1AZQE&8g?J>0Y?fEg$_?o+9`q9DJjog_A;Vl(X#z)r8@Nn>lT?I=fa2X^Vd_;% zxJo0qC8y=IRvV)gn*gi=DN~4`=ZtUs``Ih6doa-~+x;9wJ6C0msR>VI(01LO&#_tT z1~!X#-g%uZSm{Zqa0Z00B8mkZ&4~xETY0u|?0b`|9%Xe~uiqWM>41E@@u#=;c+RP_ zg7bt6k*4S}Hr7-ySywjqC);m-YtNqio*h4)TUM70rZk3|il*tZ%fobQ-8r6J%F5-d zkM3T$V9u+ds6T%jbo{~5a{py0vBi%-#9ZQ6k3H>w# zz2Jh`aZ=`!zJ}yz8MywELvT}TQ zg8I{2uIX2+YJHi2JJy(+Xib4S{oEai^LoE=?beVnKnR!l66+^VEDNU^(=E$)&z|t~ zhJ#O1)hV89SvdIzQ`W7CT>Y`e@JzKimZ?qn@;Oa+TfBVUrz2IKdGlk+3Li( z^W%wyGlHS@3vYk)jK;bJ8J^25D7$4rru>>+4awf$YTSj3t zi~?=I7!Dc}U@hIH3Yw=%B^N&)CP7y!Lw>A84AD>t>_b+g_#ZC{Pf0FGid;Q7Jfg$H z)fjUJGQQd>b=`{GEkA|P)A-7yGZyot>l5S3Q%ZZNK3NvQc(UH+MY)3;o}N%!yL)*{ zx~9%v=ASTSeZqK0j9DzSHTV1_TlRgPb;>F0L`6(S%8+VTGw;;$SzuX#57B#b-X3 zLjYypX<{qOpIdU>ye3b}!Wq#}C^}GPcbxWT5M*d|!{<)_pz_RaDp_dEo#by`- z$yg_4iN^{-ygV|~m|*il!9;a3uaXPYE9`NK0AXs!cn;oIZbXqH!iXYD6|yA#U@@Q| zuVz!^K7W3IOdhj>Dd{JbS*%xy1tU(=Tpc#xlv&fAhe(Dix}7(JX&fL0R?K9CSqx-% zexP8pE?`{-b(JLTN_&g97FbX0*rrB+EGTO9mP~C(h87Qy+tNHLS_$zNZ~x&B@3Yxk z=gpbKrp)E@{;+??ZS(jaWcd%eyK~%D_DU()xs!kO)z+CaTU%z$8vHc7^TCI=t?$n7 zW4ltm+KCVGt4b+N!qJkF!&z^( z-{q3Y;~CO-G1+Jjp-|w_G{rR-ONf)52Bv=47`bTwN##K542uYgy2lagV=fv%6J}ag zoAJ|fnA@lGTTLA#-}f}8kc<|2uL&VC$YxQnXk|>Q5ud!&KpF9zP({*nq>2=6$6P}Y zDP_?Ov4X%Lj)p<&aGzQs4#L#7p%cLK4G6Uk)Fv*4lv9BqyXw$(a$pxQ%S2Bg(KBJT za1B&GRJ*4FMb<*@7Q>Ls`%TETm|!h%a!&Bh8o04}7QyQcS2bDXvn1ekw!mTk7EX0yUS z+`3b7W7qI>;^PNwhwr`AzSODRcoi$pP4)(x-p$P?}hU`nJX*DCC{wS zu3a^$&KjK1Jw5E75(or6nnTw^jW(OJYwipRU=a!p2+MLHzpq&xb_;$Phpt6beLS?c zx+<&ny3G#Zt9_e8Q$mXBf%&|h%Qj1y%;hf<+TfO;_b+SD(8}7*yydKG&RTVawXUoz z60yh5uwJnW7j9nMR;DFDwKmqr>J-`Pa>3WNBOFeRcf#j4b+a4_%O>Lq&J(&)Az$jp zf_Iziy%?9Tcpe>-s)`~Gw6z1az_i7OHKuVe9|g1!aP zOtQ!vk|=l?>qp2w)?aOI;pP#Nc<53Kp|R)Ag{rl;uDBy0bQ$Z16=1dsphoK+u|kJ{ zLnk6u2li9);l?5Wlo0O;ViyWg*j~Xu8>H z^=p>JV*vYrSak!9ebwt-Z-&5R2C{*TR!RaNzYt-)6cf& z_6>gGy6;c=Z3nK+TOTS<%*&m<=)rI8?EJ%Ie@|e^d>dC3D*{XM7slOQQ58KS0uTSB zk69;#%R+4v=l%CzZmR3653d+k8LCd4@pBfq{R!h6C)&qVR$e}@?3{4jqxF~n?8sNA zPno)Cf^Gfs@XD~w>$Qcnx`${?7#&0$189taqtJT{gh{1AJ&70v;1KCU668ribX^t3 zhQ^1I3|>BFcq~f71v?Crh=4t~e$DENmTdK6>$-(G<1c4UsFkbiKE0)*xqL;1OZU~< zQ!%$(>6$cSl1&e?p6~48HLeP)ucNs$;Hqp;$|ueC&(>sCSFxhJxuZq**{kH*31>2I zZs9uX;_7Tm#p*TdgZ2Qtp8T^Xl`9REu0UsVhtFE!s^NRS)5C(g4RyOJWp^xPuk}H0 zV&Z(!Pt!Jj^xkxm1Deu1;s>(kH$~4F+GbR#xW|y+PhZh12n$xgml>x-6ZWhSkhO=I z|3d?oD`661FCVwY?{jU?pULJ}C45vYoSRng|# zEdTpMXLqt>+Axj`NkcDx{$BMx)}xk&bvsSDXX zCw^?2{GjV5eiHOf5*c%Mr_C9HG!Yb#oEt`X4BR zL&i7WD2KIEMD1gVE3UkiI}z3+dRHXL9AAP#>-9e`uMPMjGSk?9J^PJUnMZip8sCiu zg7NY<*sKswl;2wE^Ez+6@(Sa%$0`DW+VY>XTUh0noGe*>7nlv_tKWFmh|^e-fD|X9 z9jXzj2;4%kFGc+n+;Tuzk8letE;pH>i%YOkNu*cBGroKL_-=+D{vIiH_&w3AeDWcs z%r*F~t4vY8XpXe!yWZ99va5Zy_q!gpmYym69W4echN_*t&3^0jdY$?4UVqB4?X3juAaWchB-l(S+N z&&yw}28{P7to-=1A742^=|@MhSYSpLTK}czOilmkc?&GmEYJTbJ@uTWPsh%h;_=M8 zm`z~gc%bFdbC3C4-oB!pwPyNgSWr?nR{2G z{cPy(LpwB!x<~Lga770JPsi~@n}Ir^GleIoBU#6r$99OXiD4i^Jo6Za!6Pvc^faDV zd-qn^9CgoS9MzTe&rYz_JM`+nt+z%S>TMIAt*@+hWS*;Y*sAu9DOF#2>#ddbqs#Ez zn8$dC9<$evRNfFBU3I<9QGNUERd(B`GA2JK;7W(gVZ&H?q%g`O_Y?EKDPaRGRw|Dy z%GgX%>3BKb*(S$*|6R(HOANCuxSwK)y;86q#k7&c7 zYg6PVLK|^h9HG}I8W#pHQ0(`{Vztvd>nb@!({t-wWz6pj1ub*V#fatmn-?Lh;Q~`S zsjOYG{DtS)2EmOyxgcWBNT$VMyBpU+N9Z!X)&S+egnG{$ETiRjqWLfO2rP-{>?@-*y%z`Pi zKCw^jxhNEz)OGNZiw}0r+_}3p+qE>7g*$*`O9#WF z>4ba<_hMAVSkhvl|6+R+!fq1d6nEJswZIjCd?9yAA!LC12)Q3uG^;5T(`}?=GHNDEkw~%X7MZ_ac%){Ey`)Yww7e- z%367<7~1?y6I8484+qr(U}M-!K3dSD)q*l2A}HS8R&d|bHFy~^iqKD2fSgMG3(20? zupRcpcMq}m55R+O72Aj;5{KFQ z<^-JC*)Mn*u9W%?KvF}21xel37RHxKx?t3yrP2Y|`e@{BBbZ&{d{bD>C=5ZM-j+(Y zh+8_ue!&p!5OfQ1`=FTskkF0-BPA+{A5>hZme+<*cY7OzS|LPa6(zKA$^{0RrE93l zHl$Du2|y^cpBB=I?_^3AcyBDc}_p;dmGc$W7WqdK)2JJcftcfl~A^ z&Im>!1TL_72~n^_A!C6Y6q_DPL(zjikPN1lf~}AwhK_`p+E7)yc`pnmHv~UmEe(o8W#$c2Xelv|;b;;BkYBb#;Ye#XFgJgv-3|?EB#)!@-xs6zIo z-jwNR3H1dnLtI7t@iAT?@=Wg5xC*_o$Caw_@-T!DGI!XS2D@gP4S^5coXN7PS@022 z4V$ZMm)#zlW|ei7xdXDL6=$6}qlz4nRbA&yQxPiBujtmWrY6ecnx;D-O0_bFF4wwM zr((7FRhMjaSXJ5Kw%C~0V_{a+Vv(aZe}!Iw2%L7Clf#hOX~P>;)gtRLn^NXg6@|$# ztZtfsmiT;A%*fofs$1tQxmN1j9&eUZW%S78LRhM4Lq8F^o)a)ZDtt)iSwU zmC-ZR#_bl}f*6R5xpnx2xx7jcU#4XkZYw0zsuj{|wOZD>tc18%mVHi}M|N0cFL#H$ zhmYJN`(+>W^j43|ZHisfX{tC2x>bi2!Av<8lPbHdF2%_)cQEc$WZhrEAzO!O!5DOB ze3yBd&B1hwrdj+v!~hl{=5Yd~IELO@CaZRe+)nip;O>=0n3nRJsPMt9i zx?pEfuYx&qVH#O1tuV(KvRsFl&UUM&)@oW5A5C)6Gd$2xuBbsp#@qCuC&aaifX$N7 zbf<p8wz${B-7w04J^;`tTQ$2A`s@my4C52btm?8salpNH-2%;s>_gx+)uQ-4R=mlM zuYg1HZP5|#6{D(Jm|cN}0uBm|Hat$lj z&aE;&Dvmj^H9M=leEK>O*BDAp7ZHHP1HlZZ@M2L3K zsT3kq4Tgoi6EjIG{+ayQlP`2vIHcaAUufIySFJMEV;!1;&&dawLSJ2Q~H45fpPMOMioq3YgZrII=fSmm&Te zG0ov~A_-eh#3e6=iUVD1eru^&y%yh3@{0&@ur4+H^bsXhYEXWO?;{}$hzJfR`6KL2 z_BOsFgQ0*9iN-_B9N8{n#zv0;DKSZFgfLY>#E64HjrcOboE40AVG|%3k^<=&eTSM< z*$iU7UZ};T4mFf+ zXvIbb<2Q3oNTNXAHQ*IVGD2SiA;%hG9mPk0Xue3UU=L+paP(P
      6YuX1v{q9=vI}{pN+P4FW!CI?#11< z!e^rg&DeJG*#!$zIlg7-?u#E=qIS=ivSWdEooPVGbLzEA7O}Mrjp1bF?RnQ}J~6E} z3%gUJy6~mx{3DB&T&r%oy)qeYY+xJ3O#(kz@(kUrZGoL;93B^!U=)aD0V`YuE)P@N zB$K(Z2=oEUrEn8eVc}YP(Zog$w@IcqyNPGgcor!NaUlHlA!i|exSFX?M_+~sX_Xwa z`}K}GcX`B7EytrrD(dT^_eS&6qer53>B@Vf(U&Xg$Ci?BJnPURjs68fEJ0j)ox(?lMM;f-SKdOlAkMchv5v|xCO`}jn_2@$R*N-mSzwE3Z zE!%PJ+2@>tnn!18U0|)|fLkjtMuPK)%0L*40*xxvH>8( zX&o=nps<}+Ssd}hp(hEdf9sgF@kDOptPb`!tRK_v0|I{IE#oNv594Scch0#t-gvHD z&h9dCv~k5uV;TE=b&}m>T#*!A8G0Y`d>QymmljE@rH#@KX}7cww@8W$OBuvZCmAEH zZme+-=b%9;Bfi*x-jZc3s8+f}=cY(lhn)tx9njL0a{-UQ zoEZ^IPzlwHKRlI&mXZj3SRb%_k*nt8z|{*Ogy%nMDCjyl&a9du}^> zrCndQbl3i6Gp){@JDt{<%l7YDx=vT?8_(Kv&#q z%0QyllLg6lOSi%%PFQ$HX8EG!*Y@0*Szhh5&YNd-Rxi)o*)!$R^qI?B?_4-xB2&8A zEfziNsZ9j-HtcGdlAuF=O3SW>ggEfN$@WCRGCm@EKo+t8j`3{PSaL1<9YD9EM!ZHM3W+1Wp@aAbEXnZaMI%f-|KX&Ft8~69f zmT60~%cteP5vi$6m9qz7RPC@C7frhol6pSt!UwiJe4%W)>XVQB=8F7dHiu`bji0~p zz{X2@2LCo~d3NbEKC3KM8LKcZ!o4mVdk_-+D^b}x+QSRBIx^PoL}`}!jSL1`I0P*P z2RJ+@_`*#=eGL1!qA0=i<0LQoVI>;oD@;^cPL|*klFJ2b#vg1G+@@A8hvAknO$Y)x z95R`{VqW;RXCFSD!OEg_L9y)dBret zYL3v{adD({zev%6y?Lr6Esmjn(3)Av)Ul=E2?~m)=mq90?9h;lk7`{}3pe)q$&s1K zF{1FN9xc_j9XHjAqc4^gcv(Eg?iQzfAB^J6xs-o5_6i$`PK{|npWL+W)xW_atW)X% z*1lA_4(LFv8XDbvzQ z)TXAVVd**c{z-#y{pKYbyC+SYRM~h*#4<7A_e}R}WDC!4>Ey-%ZG3n4_{#F8+Ox{e zpFHovnM-G}8`VFV7CNiTE2L7_c>=&MzfX<+l+c2 z*V`A z?~!cTNq~F*_y0kBmd<$R^FH(U^phXp7u*|=J(KGjd--Kds@^$qv(aRg&GW6*b&D_B z*3mw3;#-q?nxcPWx9P_C#zv=hb$0FEHs_jgHa*FWYi;>9IZ|HQ*4&wxKC`@XPN4u8 zGS$P->P$q+&sq9-@)DQ1DAu*R#TkT5c~j%k=BCA+?d@&uid_FmO}uXNnue-K#aO4u zS8O-yt(Hw=^JCF6p>SGEKQ3D2@dg7etsV0_^T4NM=)x+pI=P_nBD$;Ask%Yu^Pt)~ zkY=yP=gO+BT4VCNL6ZS^ub~DSG#*sLn~LuD5(aOkbDrEMOsH)T|YLe z7cIe-+5?3P=kCaF%x6MNq6N8tm{nUIX)+{5?o+||B6rI?Y=^MDhlRu1x`*EnWl8^vaXefW?b(*7~oTKXQ7Y+c|;p_ z?a-kzd?*gV4mz{0W*wgXhOC#dS=kvni4F%(-j>F6a6ul3K#x&FsI+lb#Qmm8@FAzp z0v7cVrGSy(414K2EV>a$WhKrNCtx>t-szOJv_J9U%9Z)~_+uA8`)o@K{>0y>ucW?} zJ`jJvpM9&Ip2ef}^sMvw>-lr}E0sb1T+6em<>@Oze)<5zPDvy7@oQ!dYl|3s zvB)~)84A_|n2;2U(2@y{YTAMUQw2XTGHvh?rg)XKS|S}Vt-QpN-?A89; z;*gQQ1pPrhX0ZA&n^{6%@2w0L;w6DT@C2wIj&bys_D3D0gpYz3@MKcKz|%^-o-~ zw6tqxz8=^IT1U<6_uqW~RU2EUS@luG54J7LS>=#kQ8HQ0=WvTo=eD0J zUfA2zz31}wo^OTBA>CN$^;^%n`R%*+fA`}>t&yEe3aTe=ThLjhET6n_DZBVD+y^YX zZa}*j;`=kTbE?U;(v_pDupxX&<+y1Ubys6>Q>6=hhBD9kmdF1*dG`|=dLG|%R_W}S z7LR0k%H<-B!Otqc4s{f;Mz|I5VbUbMLIp?D*U|8f2u7j};8-hJ7` zwYP_4qqWT8bG0o#^449K-uJgfErmN56;w^wI&W%~vU2sUL&3Zx*Ce@Z%Ll1u9;by| z)`k_He2PiH)QQwVWR^j1zitXs=mdb;m;P=ms~4*2>4A=Gm@k38h?%QSReOqnb`hAk@KZMmg2u zWEfLN3)Wt0HkaCLTHtf<-dg|Wo9l)5iYB#pC1;&A@1pJVx?85qIao2*S&|r2R3-iR#<{oF zPfRQxf6ZA_w@+zKw1tD?);3+fXKp;)yryE^y1BK3HwS8$x8;mQV#5maSV6EBHJ;r( zd1G^)xM|aGf4k{zlF_*CMuRMdx$uo8X_==-g-VJ7nu_4OjUk2+h7rXOCPY+@LWGbU ztA6yVM^XC8Z8y#=v5@YyWai!@duNuYJE3I5k%1)9CMkL3L#Uxa%VGf?wk+Ar`mXAV zx|RO-uQ_z_tXUTyQg=!T@;BoFg>S{gK$0GzyhI>kpkXY5>{v-ewZK16jcHTCDS)n| zB;WynO)P+bc6B47$cs8LvI}}C4Q5S>+FEgAs@HB<`WC{VwBVzA0`nn-bP4AoU$!dwyv?1hASSK`J-FGbeMbr*x zLu7|m%lH+2hkjSvGt+mRM~954(F6$fWSH1_eTYvMng#A35UnSOG7VgL5UC3lZ;X6n ziKIgLpo86jj0t7q*oG^{O*y}Yv6}OzjQcK|I<9nOr*h>oC1}n<@8ASRpnIzE5nK7^sT*fn{SFiidYUw)V$vF$hFYuU@Cm|ZKPFMq{tQ-HpYvOf-Vet>Fx^v~q&S~eIGx)pI z3xad~u1PidHK|{*>)5Ab#~uoeZ7ldxy6w|z5IkDJH&EDj5!9Qc$0p4rEi62FB}~>M zO(6s%D0#J-i(XOQyZu4s=jZB}{wkx*uIqerSI-X*&Y5%YhdnDFn|xK4)nngA=DOi_ zmivmB3%K0(Ub*P{1I8TvL4#mi(SzGx!&6fx9?Y_CT)Jj6Kysl(gPrfM@~;WoDxATP z1$if(DF8u0%3&=|Ytj&aBa3 zrj#^!8>4m6P0=VL>tQLwx2!Oo;C*&u4DU914F*z07F+ODQxM;WO;+*<_zb>v>a8f% zX>Q$nQd5e$#EH`df5GPl>4YdlELnfx6qsRjGkfN$uYffO@uTDugGDlyv7~11$aoDh zJKB$8xEz`6@{IhGr*B{;b@%Tz+F*5sZcWQ_ySwYwgKm47u#*3hdXevh^nF)Gm6<1~Q(7ndM|`@ink(0xv%Ft@C3*7R>O;~jUTzD4*9$G-x_L2mk5=ndCO$(~2n z&b_6valYGCV6^r;^3o$8T=loFfOHu6{HxI%c3<#1Y}JD&HR2U=lB`LTdmB?6^u57F zk@qm*xQGel<|;7?+92+9no{ps@+8E-NzW-8B)!w(lz%4q?QAMij6A@ufe(ZDbGLtB zca9+E+Qs5E%w+S6? zr?hI2V;A!v9v4e6fO32=qxMNDnSRM~kfArLY{Kw=)JQ zU_PUtJT_Vjz?h+SGc>DceyLZTgr2CDy5d@ z@^wqDfAT+{yncy@MsQgws`0kajM}Le&n_>Yeeu*avrT2DZ(e`>H?f<&=C-X>GqzXf z)<=WEXlg_YCw%)etfvpoJY<+;!|6Y!98{n}zT=mbD z9o*gq)&O%9-tE<1I|&+S8Qx{8)rL4j6*kRsqSs|Ho0T6UC1rxAr0hm|Nfq$&L@yOv z?p84_SvP8de@5JgB$n91%Ha~i8Bj`Y^MJk%NR`w_AR$~vOCmZ4I1`9NMqEe6N`?u; z?R}Jpkmgvp@btEK8Jfm^{^EX0df81$FIO0aj79#M^T{HAI}@9ytbj#+-@QUNa*=dX zsTEWUnKpY-trg}sxt)IBI}Q03*y+D_2zL4zZ3SefA5}&)oth#Ma5zK0$}m!5e0@n7 z=`(1BJB?X|{gN{FqVc*7xZi9B&~-1BmUX+7kIqm?6p_nOJg!%#Sq#0vkkw0VI~uNH z161lk-lQ+qBvc<{oG zy+^h$wbgdK=w96l?6R)b)$SMD3VM19+7d@LEXgaOSzeO2gb+H0&pLJ$8YdLgmbh$7 zw;$OH+w@P~eHUnJXba+dlIga9jx)o*0f0y6a07(86*gMF-c z24e5rO_#<^LF*9mH~uBsR(h13N8f$-=mGby4{`X8{37suPUSqV;XLfbNm0H4$0^OB zU%LiLb`Zm3WLUyW2i*!4}J4^UzY zxi6K(v>5!1CV^cftX7fzhn|)C_+= zEZ8Xxfg5MwZIB|VpKLj)1Z{_}!d!d+{wM=U8irbo)8gC?<;pxW8)rV@l)xvj-V+)T zv^;J3>>aj%p2X|<+pwXC^K_q`&ffNr=0}=WHGj~20uIUs52SL22;hdgeE5jCy#y^| z*uYVC=vd4;&c1%8FR;n8Z;es}G0Fx4VA+hbxRLu2XLq|gu%(|8u z{`t#~{3$_q6Tk}k|844p@AeHS7M*)cGlg^ z8SXyX^5gR1=|k9As9JvvOh+P(H=)|6TQsXiTByl4RhMDsT)g|zeTd#v9Y&flPBOg- zrkpR&DsRHKDtCt-Rqfa5t`$`Mo$?~=*H-;Ah!oO*1)IL%MR4of&7hywnV~~OjtBZO zHti&lfq?6IS0d1>T53$fc*#R1x+SjiOPKocodb2Ksu3xy2AJGV;JU zO>I8@QYI1{8pEGPmz0v+QlYglT|{NUOT{{v<#draSsm-*bq!>_t%KVTuGYbX0T1O; z#%g>rAU50Lx}bEhx$T#f6}kVzMu7ma2339s0o=#h}TW~=xCwu0G}5Ig{UDu%GjfNp9;V z{tG$jGxUe79odwKxGr@R(*Pz;Hp84j`k*LNMcwgZn((+Z5?-he_CZviQf<(lOm-9| zqV!=e{>QMj8mMMzd1<&@s!C_5NJE}j=^~+U>ckpdE~QT`8+`-cQcH!;k1UyxKv~pM zjebCA8d)#_eD+N7zoZ&)abrlL#q=LCOCmhMturv`bQgu~#%e$$Diw&ydjkj6Mx(Ne zUBwQb_VO`)1HTa)^_E@AF7>%nF7x)Xpj^MmluNZIa{nLXoZ$%`eJB^1Zbw}d=24l{ z&s~Kt@NcmV40HS(fV z^HsG@7n&NAy@7;xC`V(8T(T0l9?5J6oT zxTl%IyrFk~?Lly+-sbO|$t+ThNd1a(@>%fpI*^@vraobsnXDY|q&}g#r)SpJXne8! z49%(1Hy&eU<8f^uA)pbQzk=-{ZOeC)ABsxT5M|8)chak{PUEtC!C3@tg4^~}{h<&k zK?1Q*DAi9!W-V;gLP*5VNH;>aiZjVgFFL2yLPW>f(iK}iQNm4#YRkmhC9#B(?8p7} zAjV}#DVKXeU%gZ|T;ydX7LXSX%%EId3!?0^Dy+9=8pC7>I7qE*Exm0R>W#cE#>t1-EN(UN`YM-B_ilY*=Pcz$ElIIz#}$P?@nd(yDN3s|^=B z9gD)glWqYEwFVp^hH?7VaxGK8s!<-K!iq1CaAxGbF`|a+O?;}y{+Yfm@Fr+xBROL5 z!LM=bD9uTzQ8m;X0=9kB1ifr5bUd)XkWHp`#tIHG^(pE2)B1jKW+)UI@ zXbX)dWM%ez7DB>nZk!Ai0rL?SKJiB7*ObeaXS6*fW3SYkl^pknr+_FxcavVzDdvsq zZqn;ln?OQ6X*XyICSVLM$^Db%yIyZasMUgtia*CIcca2|bSHUvoMhgV-o2#WIl>nLX*yN&Q;w z&0HD1SMT7q39n$CjsyhLHwdkq<4#@8cT$R{B-k*0ux0sy<;xF9pQ^vU2nFnxUSZ#X zWt3fV*@0(}j{&(0l>fuIb3rwvr>>T!u6cwX4`Br=IMx5k4qxCrPsb6V%O=Fmp?=Fs8O2hSgK>y!tl+){e} z!NkhLm(RU#?&XJ9Ci+`rSKRR9Bg%_shH%@J!J18XZ@l5I8xO3%dt*)TO4idg zzoTRR$j!wU+~+ZwJojC&c>nZrtF?Ukex`r*;+b1oA_lE%Oxx-SyI=e0=-kCS*3OnuHNyF`ALE7q})_D3DyGsZ0NwU-l~cawJQcwdS1BU zcZqzTBuk;N1k?zp8gi#X#oC~E&P?qL_@TyLA%v`gJzoIjA4-i&{wL=}f3EyIs`m$S zD)l*6+;>Heer&a0G4gpWKupI!Hht{_A1Q+$J+KygCVlk4`=jtN*vl8*c;kh50bbL! zYE@Uj53jOU`Sj*5n4VJTF?u}x8j$Pd%F$P{=I!b0=H+mQSUTW_Odc0Bb^aT5)BCH( zrfXH16Y%S)u1dpyuWmItmG(@v^!myiR8=tiPwQrag@8~RVC6?OXpnLJ*VnI7G8RZd z#zTa1GN8o%do@vwg6#4CR^d561D%2$ZX>~%^k##5}(nBu2Q{H^D@9;Z^``%PwIet@2zRCJdd4?We$19cg@Oo2Oth@;< zhB9^^1N{MqivPG?glKUD{4=eUYlH>p8c)tV^{=+o(02^Ij*BJxyWKP%sg?Y9+tFs+wm`H@3-S$ z`V98uK`@MBw>>rVJHKuC_7SI<%Zf&Q8$h_!-!=5wE%g2`k~(N)z5tpYl5%0ow(vVX z&Dy52Pt;>2`%?NOy<_T6cK!mp(o41Y)J`$FgGu_M4~ev;?jyWW6ae(xi#&V_(N|3~f+U*MPu;9*9X4b#@aOavjJ4{{GpEUJ`TgWO&-F@zxQ$@{OGJAUL;#(ZU zyD(m1Ky#3H7(ydG-kNIsh(-cF_Wze=5fhKU`0}F2CJ$bNcgtxLIj@YDalLfV6V8eq>EH zNs{>craFW6xI@tWaH;;;687=`tRW#sk(|Qy2SpTLc8U_o>&8?}%c!blLg?gLlF>RD zsT?UQFeaQ<5d=&aLpqSrN+V-HDd)G)MjgZDC$H1Zll~69KoMoz;kitQV%xaR&Fcnm z6CtVtu%QiB(|q8+oTiwK1-#BdruA&;LDyOsthU;9U z@QKgxutV}$WRrT3>N$Po(y}Gy)x&=@M<~51@z$Lq?_swczn?unnGk4*MaPC5 z!6zx(D2iid)6IMKG@2buA7F>>nKIilFzP<#MDCA|QJ)AWzc_hJdxhMO=+R=-p&V^5 zI()K-9J4Nta~mZuPdIrp@K{k7Ic~Y+d?ww+m~#8X{G-jRt;NhfQ*K%)dwmX{GF};v zomXC{+!%6}vwywo&dc?@i`3vwq5VXyv4u?>Y%REtt(wT{ly52KaMb*_znP<9_D{Al z)S&BRKOHkh8P};J4uPFa!PjO#SR*eVt(@LLMGPT=_*V+wV)BKlq@!3idV{GxZ^YD-^xpi{Yz4x)A~VBpfkezXOg14SVj+f%OLb zFz0?zYb{lne7<%9xirCM7cloWb4^mJ4y-zc5M-hJW|NFHD15 ze}lj7zTtbsZY zE~p3>_ZrA+gvdWGV1LLh@?k-YyK z;0EdiQdmq4H^to3k+TVb!q8v=f_v60xE!2*wM-hyp^vgBPil-7vkAU?8tT4YHLp{D zR>ZI@s6au=BOcEu%n_U$1i+B;u`}XfUGq~nf1-Sn1|4EfTvHxS;|j4^9^u-o*QEZT zzM9>9Qe*NDeUKSWYWP?{z$%7BO;%8JKTk2$djVk!vDu!8Q~5Z^R0tyG`ox1zEfkhJ znKKPbqM(DFV5KL`ewoMB6y=b|QnbAoTgc(fIj>wG_msl*Pw1;LPUPH>bl<)f|MtC^`bW3YR;~TZADF{Y)33^yGSAXxX@~jS_p~09S|6 z+xoc7fepiDew^xyNo)H^5}^&1;T&uVPzKTm6DK|5BQC^#P?_RljF*HAYs0V4&t-8s zjk8=9CF^XIh5G5;w2`za4IPWLhzmQWxgH5H{b88^MDsqCV#u z#`Zk*lJH?l5vAH$XU(c@9#d0c^{x*@=dC~Q%Bty$XEcZ(+e_VPm6KMjo+f=omEL|OSk6wZ(Zu!bO&xKnkZ^Jk z@)lehvD!fA93{VXFR5Pm2*5H5a)f~=CRrB{^d8oJW;5jsCSy%0O>Dd!$0CkJ9485O zN2)8Fo;#>18&inAggpiq*06UtUO*2{Fwi)vID8Xy9zbD%#Rth74mhV|LY(E`skq{W zbq>M~A>0rO)m7DbC^8M>M4MbPdrW6}NA$c9^O_1T>8WU)9~l$b zG-v+#`O*A}XxEA(hN!^;#7&_fDjr$U6|KPa^A~h&!d>%Q6CYGEfXMnIW#!&+Rb8cX zm$E13&`%e~Z;8ubHH>xRq8;U(V`eW|I=8f|YMi&cEaDd=V2CnFGwRWFNygQIw2b%~ zrvWFE60Iq5vVUX#X>=6np-w}Z{&g`8(E+ZG*M!o?voaB@)?*P+p~3VBKe;?R-~V?lV`QMk0%qmP(v4TWV$ z>y?|2A84rWK4%lstl+{a_1SYCFt?3!kuHl^-?>KRqSOt?53IdMn7wA*X0-x!LcVfy z^1yLdcMZVh)N9#QwR9*(JQ<)@&>nA~8lF$%p7e7v$*5Y)WbWGlT7xiKK)+&vMWkTb z8Yd-`#IEIk?Q36k)sDS&c5|-TUblD0Rjb-nCl?`sOgGn!pZ1jaa7wfA{{0uv?F{Gu zn;Ynyd-4AJ7pjC1-ywYKD&~8OVtwS)pJXgF%p~J6wUDsE>t6EK~>eJJjG6$1}pNP6HjG%mq!h%$xdXtOa zF#{J@R1zlZNzLZ#)x~bls!;QmDXnhFQEa#P9A??oIAMKb4(t+ER$(=o}XwWUE_Jxm1??Lb>VDu5RTryRly~B*1^WS5xthr2k!gg2Eoxp0pAa)Dudxq zvZ1#++q@%wV=cn2UuHEf*IJU|nh+NMysK8Ye3ZT!w;|-c2KUwCM!JvREc|MeQhD_E z@oBKb1jRyGZ3(S^UA0;qO)}$woH-Q(ItkVcF;gI87g9njhXYYD0`FgIIn_z0^(^t@Qth zHv-yeM288xPSXbo9xvh`DV8;0WD$f<#3k3%MP1=I@-WF!X@h<6no41{_qk^+4|&-J ziLI+nU2IbtS4Zf3_JcW(PW8Y!#cMMEzlAewYOa*y+QTdFS*y*?b}MO^FFOBUnVyOga;t+I93*?=O~yFoF#y?VWEb^B*G^%0fnYnlva$jMFW z$xWZNueRy+Ue;}OO7HWfcd%FK_38z~+1K5B?{#MbY@7e+cG*`i-QyOn;N1GR3wKT? z56HgTAixp-G{0z#7SEf-2W@ZY5*?(AZ-kt=$`fjUfGZ zCbN|a?aRFBcqev_!j=A9<^SNYo$0jZD&a#F%J&>ZG|}_Ie6km))`HaDue4Ng9SW2u zNl}$`fXSFG3(^ug+N*!`IZHMc!%)aK6qk9rV=KtT1=UTMeb=Hq^?}vxu-y8Ni8(DviyOFyYrp>&<=tDY2BXvR z5?l7Vj{jgZv4U*0pclDKsPF?e)xz9((8)~i+-h;SEw{3QzkGkK%#aP2uIgS_?taPQ zG#bR0NBc--#;S>9n`CDO;iMdb0%hBQEFp}}9`OjdRTYGhN#5?Tosv-?b+dDtlORIJk zwqDo(f=oGCQb(|YA?uBJ_2ACv#^~P0ExnCumIECv5cSP|}?-ty*F)AL6;vt;uiEhM@8(vpcS)U|p*w)Ft2XftMvU_HnWXW;% zG#;y}N@1jjDj(Z?-B4qTPSq%Ug)bK=B`K*iH1yzpMmTX1rc@tCSp~9`(2t*0-d2HG zlGr!y?j`OUzUO{Svy%fD>}L5ASl)qb&fQ2*X#%4JS;qnZ`c58~%qyO77WYxml}E2P z_ZsXh(O2wrK&#+rkO3T!1F#sUWWgWb8T1dfrS+XD&6_Tbt zs~gPTaKDlL0djeU6&p&x6eu?KId?QUfMVWCH?7J4L=5JC)dQ|TAFm*I(9 za&wn;XO}d)opQ)G8ml0UZ=Dt>+G);>1ALrHv&e&7330If)Q4(A2;M`^pxF{1HSD`t zKQQ>m9&yyb8oK=y@_?2-)kSCnG7iFL+6AktZA#gd{bG2#NWkMOLdv(cR=e#E*# z4|;)kv+F1O&uI)B?={*09WIt_sJQQ%VzW6Q#6~pNqqrZGpqor7z47rYx-VMO^7tRj zNO8he?y9Zqg%w5U%Pyj-r|0xv0ORC@29j(j3}$NhoIw2J-i9O6b5ZaH1==VYF_h(2 zc#6{@Ed5C~JN3tt8c5{7uNr2QHq z5?@^=M{z1y>~Q+9N=$UIgm34W%f!ANiA0dMJQ!3G1lD} zmdSP6%<7REfV8`~hfJh0{N;3Nk_BAQLIWO4a}=m6J; z%3b4EP~T1z#C9sw%64{6|Jr5993z&BUW+8z+&RGl>)sct*_(EQQS{3}#gDWxFWSH% z_@M((_Kbb;5@%6Ct_NvnEEe;hkD5J{z6L3okdKGSzjIl(T3qACI<4ER&NrCGhwodC zl1Ub6nvjtuxdq4r+XB%Jv)Q)AWZQWaQqRbE0g^;v=<@a$M0<=U%A+#lBQ^P4XTyzu zkYsgQq_*PmS)h<4Z4eZFT9YFVqRBe|+-x~#1=V!Lzkl@f5r_!ukaNf=mvome=wVgV z6w0gYTTbg;P!e3HTu*l%!LYx?W!Z0a{^5b&@6qQNFEKH}AmpYbcFb-%@>T=qB~ zL|K_83T&J=ATzDR2~2H6EGKy`q6d)iWGwX=$C?K;T7@2^YZ%fs0X+!a$*TcxM{<7z zteRGQqjPrWN4sk4?9Irv)sV-}aw`mnYzTw>Qc-G^<+gC#m6dA@}m zfwFio;&Qrum9e%7i_?9!4}I2#HsB2aq$@8ad;s?y2N$e%AhgSAvka1fX83Yi*;Faf z>w~~3?sHo2^S$}qds&gysP{Z$Hz=?40qSGRfjhm*0_q!f$GBfyPemiX#%cXarQ-oe zgC%RN&O?v6A5m_#JDp~>`6Ywp5{ql$T&ER3Y;{>KqkD1KIu9}*>E|UK$_s8iOzLt9 zN2fAEOFU#aQdtgIyS+Y$uP)LJB07u$%G6<|;t25p=hg~KAH<;Or@;hZAin>l@*}<8 z==_Px_$yb`I7as)z2`>`qd~9y^jCb${hk%7dsKx@b6VF~Tnn7m9*awuXt&#)%A(jJ z|6&Kb+hw;pQa^NAdaTX`F3UP#c06Hm5idi+BMu5=6qoB^w%yL)3)u zkkZqM+r%W-K1il8XRytw7nBFt7t~IQ&SkkbW0vlxEB%O{556F-d*Naw!R}P{{`36N z&TF`E6Ux35aq*Z8q(VU1^gzh8!$Uhya~?*9E8>Dl7Z8|;a0}POBXj|Px#|T~Milvo z5hHvbi;F|09j1pOX9dwO(A80&WcFSic{8a)Nrxjrm~(VGaQk*dly^ex&Z{Gn+0j{d z&B2w;VdYna0{G*%?$-H_`gPxV{a)-%4x#ros_R4HYiW1x667Dmej$o&8wt!~rO36=(&v}vX5oHy;< zVbRsh+HuL;Tf0hbbxw7?P_Vfg$?}Yr8Jpisgm0Z&eCzCsdRkx4FPqY`xO%o;-xTYp znov=d@0yZR)KcA9IzcBl7fvi|jukn@L57`76)MyN7>b`;s&ZlD#VHl-j zB+0JtlS#VD($3U`B@O&zZ?Rfa_aT5ZGz1F~f;jkVt5xZ-dPBvH1O23EAe0A87qS;* z-dl`$GZmxK3!8x#VEZFpjnEy60nQfdM#GnnK9`T~Lu*aY~8?k1Ct7A=n9L)*S1^Z6S}|MbfLs+_L8JNf;) z-j{lQQ)!pntk67=p81c%cATyAmupO>UQ);mow_U#fc-LT=% zp$!{^BdHBUUPjitmg*fHt~WWclb$jyHfGhEB5kv4CVpu`A!M6K!wH^l5XaB$hd@MOne@J~kTz}he{YTgG z%~ngoY}(?Q~7SwhjG$#s=VHUVbG# z*W1YpI0_m?>9N6Go_Wki;jlvrnm8P!=+1@+76Nh-s3(StCIpn-$kIYiB$TH`p18QV zwym?HdUEPpXQ=eYfyS<#liDi$&bZAUjm=+U7d&&yHe7z_+}(HQE2Z}`B;$0p&F$O$ zhw&SxZJSZQ@N{)+qSWXb$;1ywm6#>KAqY& zG~b8n-oQPehwJ|3bZ%7jTwm54U!(4?W!LYSFKGxVUHO6Up04(TqpK;`oVGoOf=rBr;tR(Q zFcbo$NG~Bz1f$VlAl3^l4%9OUv=0ShQg4GztZ+DNaYIw$vZ5J|iMKDBxjPbw73KJQ zsyf2XfWe?M<+@#giq6Wg4PK)zCsL2g`F+Yl6YB*+vO>!E^f*9$7YljYW;329|xpY(4Z~IkAk-a z_kT%`<a&mRQ33CieiDt?wN~jpXiuTbXlUw5VtuT6{47FiPWD} zXf56z54A3ywax1GYoo<8WB&Y>;_3pA%iU5IFNwA|!;2Ez1RIddD5 zpvM!esmk*_-rmk3tlPCFyq*0!TTS?vJE{>C@<3rt%?Fc}CG6hGdzI^p%X959R;c{L zFW3s0fAis5Psx}f_R*ciC7ve?c~-BpI2LTav^f}yB* zw`4l64x^)v##4Q?F2V;4LfKF0Sm=c@+#rZm^UT0HZHNyML~#=J36U|(%W6b)I^y=? zHLlFqBSwX&k`Dm=r;bqZ#kkMw^~KrTv(6f9+Niv+el-g%S(1-r$!v+s>7Kh3WUb=SV7$E}o|_k+G!=r1km_ByP4h*e2z|Du1+f`E#9t#`?EY>&G@U1m{_5j75_ct(zUKsfo@$hFx7S zXb^w$#-vGaOinHOa7S~O*5lE3HE;Qtj&*Lg4#$!ehVj2M+q8r0<||)JerOJ!j&(iM zMK77FSQ^@*{u*{rxjrm-OW7Xi?70uov{HB-K0wOWeAIp#7Epm2OFQ*I9m#!Qc9L?LMM6-_~5IBd5eL>>xz!Dh2>nDYC2q;k`h4j$2TQn}&R8lLb0XJ$;z-}7dnRF zXk8b)N`vHOY>+(66W7&2?#I6dkHHL~`(x$1idQaEypXAVH?W0Jcq~fIVG9+f@;$kN z%~gEL{cI8Yi}F3iDYh!FDt}_*mG?F&zr~GMh&Oe!T=-rJ%6rnUl|L!3F{|;M8&)FtB&u3$(+9(5rL zeQ&B&e2fj;7-1KRy@S7oB`-C8uJAxSwczK%IWtp7+2icmi!c9O?WyJI)iX9N)3`t&5qhuVZ}bfXQ_d6Wmn(Hj-SQs6$OcCFe~E{c zSNerVQ!{%RQc0Z}$2?oURDJ>a2#Qo}*Q~>LywK8gdB6{ zI-KTa$Hr}Cxff1an$+uW5iSZw4Eo9{ov|>G8!_nea`pPipfj+hz0*CmQgrCug>{kc zXYGa?Z`2kxicj6E`15OX9eZQJE#|y2!CFK03%ehj8Ys`tx0x!O(M1(A+-)S}r)_$A zPSKkn>#rwD3i~Jc)cOV<8qUMsU1&kHuRxhP>%r-|YLO!ugvtih7XGJ(g;QfZh9nGX zTjz_oE|Co2JcZ%vnp;%LO5^jV=@%c^APNoTldpTi-5xKy?f$Y@yT?*dnE(76;iBqB zlWeAA}+2W*vheDP>uzU>Nwqjbx!6`)(hN^2y&w@AzMTBl|GqfC68WyRSv zTDY~e!s}k|MAnyy=b4waS1ooI%wHiR zR;+SO*dYA0&f5?kA2b)*++*`QuK9V9TdiA478xtCrU2s8@5c*YM(b=09mCHJ1@nGsier+8RNM_s5)r_@qsMz3X54#jO zO6V}k!D!L9+F&Rix#CG%+RB=XYIBT?!P#8TH8_uXh1Ae{ zJa!9PPH$(cERxGL5TZ9p{V_Yk%ax=ZuS6duGy}ktm-#!nb_N?L@j$xCl*xf8bQ&tb zs6q+-(4O=Ue`BSU*MPrMqZ!clrQb=qGO|VuX@Q^v0biu;qautdm9QU80m#PeDxiVz zPINK+wYQ=@V?2T|Ehdq46DbrCQlWCO#3yq}3co{E2Q!QV{0}+^!sc^(<*o7gmnN&0 zE}YOhXHLy6H{Gyx%Y#$b_Y{_|Tsvjg^4i+jkqHNtck}Yc*Vjke#p%-?W=K}ZChXbs zY$y~i#EJZm_YNP*&o3;TP?Tt|S-$n+=cS8Ur%xYW?=)#|+O%dj}Y2cf50B^IwAE*J?a7%H$n!K~LZYjM7mNR)%s_Yy>`N5E)J4qi2F%m5mt0SXM zor8iF$!i_X0rdssLj)>@K}s`2eHL0O_PdbJ7xJ>>A+I;&8yqNUXePj6Y+ zagV{+%!dJw&b6`L}!0ew}}ejR(4avb31oF*RbEB)0z*IlpHW?b(YjknWsvdo3V~E zB_*HGGT6F+6Ap(^H!EUQYzq4X0~(Bn7Q><1r;X`QDHbETqXP#FrGwZ49PHY78<5*U zyCFn_R@09-Qdhbd$T*$Q!iitJa15%$0*IWB5o8mJD``SvG&-#UCyDqBU1_L?Ng9u-|Fl@2J@r^%K(Fvh zd`&GVw~N-(5>(R$KAy_s@%pNDT8NZXBLEGcO7(H%#-u9afA@HX6X*e~5JT`uFR{>Y zn9CQaFjQ(<;fXf`k>quU4IS^NCcv$TGUNrs+ww)2H}FO(BWbhftyB|~y$$E6bpy_+ zX!Udx|32=;qRHQk*P?}}QPVF@w{yNM+-x!+(XYHrvKbKai%;b4nbs!f?=Q5d^K)q_c>*v+KQ{60gYe^DIu^Y-DlP>OCO|iN<89s6sB5-1iym zVnM#X#99%TELtYIjTIMMR^~IA1$IuHmQqk!)UO2X++$4eUIrDYM5*l-#XEjSgZC89k-G-uZlYm!MxT;}^4XlRA7!1}I zI)hGwRq)1~cDKvecvf+9YiHe9Q#=$7i&kc}1?)j-4RbLqs={od$)Z)}GCg3g^hSZ% zjmQXw?iQ3=oqk(R(4J>3)RoF(&vU!S-?gJykjgKrh_@8Lzo2byev#KRp-?X(!((+V z6DQ`l5Obc8^NT$OQNPz_5GCC>sHw&k*vbk7(PUtGE^j_7DUxhfvyWK=vfgKdQ;CC_ z4Gx1o1Lsn5+Ry!f?_|MvDg$BRfn@5?$*VcEqudChi{8_t8JuEL+au=n9WyJQ>hX-0cA?0Vv5w^Ii`i6tMV^PVu?t+UC z_Jvr5_|6+YT{LF%je~#3f-cN{`tupH_ivwc(Ucb3d*WecaJNt2GbzUfQ)gIyT1EoU{ZaHM=AW^5oXRwjO)y;E7AHeyucdjWZ{ME*T3>ghR@-?jcpVW z4%#ik>kNU!upGeGg5pOZSRdDV7aoP@*b`%$t1uDmFd9b@9xw$X!Fvvp}p)LP`Vx{KpAq4M%jOZl?>(aAdx9euaUzWIktzOHj-&p!1;8K4uifv71v zxkq{zEKdX;X&q<iHx{LsP1vHhsl2%Uo}rJUj=3MGkJPp&f=ZD$f-9aT6N&ma|WE9lS}3`i%E zWc!h^?UOXb>krbFT`MH%gxg3(>+nr6DiiV5P;|-tzzYOA47cpS1<2!~fyF(}ha?OP zCRZK2gor~V;Q(44@bQ^A8UT9~*W~@F{NDyd5KXM;t(XY=i{anpf6A*VZUm5O=Q@^L z*9nX#rF;K>?BD+%489hnY{3C#jm-%F>`yBuPOJbxXuxS>w;fO(C~Yjx^Rwi}jY`rl zcGCm<)v^MgqaRsv$m2H6=t9H98Q#%*m|9_C%aji}M!Fgk6PHcoe>es}CqOTieqI_e zL8(lDuirhmg_q%m{?>(KDqv)h7LOt@AF{W-)4B@+;8u!@a|>CZpnID4+SAa8 zIAn{r5x{RF^mvV$_zVOAd10dzbdcbSG(o&&&|Bglk$({OX25Tg|;TTMr2LPDIhXlMtOEup548^h_lH& zdpLXsaRSVokLw$sP=5Yc&(BUGL~Gw6ESRz7%4PkxQ>xbO&oSpW%N)+|!lj2#+<5+Z zV+yRgzo0htPxRf>qI~aH`v4%g`!Md!?(N@XzL)lBg)w6aX1%)o#uJBYoCVfm z%xP6etlEi7sWZ=W=&_a)%K)2*AEzC$IqMksX+b5TtF^8 zCeAnp+)~%E{(v$$mHYuS{y;!#;|F%V4*!0a>p9szCWJiKgUMh#Zn3@!$JaXdpSJZP zG?B&B2i4aozY#Q-{on_f;3rR>9Ms(?b!slh2_y$qj`P(N2;c?;2zs(MhSd=oOv&el zBLy;^Lg_TF<%rZL)90}qXzEKUKL|+0(0)N8o&hHvG!7m#9E*o@Jk~6Y>%8{*S`*Vzu zO+DXe(Tb9-ggMP#S+?ulwKjWReQ9y7MbJ78Mp>}xv^gynr^8eCA9L&6LGbtB>9r24 z-dR}E7Hz3SJPw2jw~>Y7)mriM#QUMT)dgdUJ*_Cj{=LCh6WaZLWAU}UO#2PHSJt|~Z%U%cQ@t@auVrynuFUjBO+B5(6D{UKgWz?U z0s=G3j)HJg?UIIr&|kU0wqnGf}-tM60fc zLFj^rFb=Z64&rfe53-SSQXKQZvz^!aF)mG?3lAdk0gb8I!C@W|MBua zZr(Vjvhwu}n^!{U)4{)6&ctD%>%!+&5=7MphH$4W|hU-{=-`>syj&z4M^P%de$ zHm&yRUsjZt3$oQ{9=EJx$NU_ZzSM_;xfhT3mq>EJ-@+Cws)-w_>jV1SqPDgN7v+vM z7v%2#$6(=Pn>7$FoD>S)W(mpwGAppkrsZq9iwd7!arUxc-s3IZH%_+tK02)KuI;#P ze@|Qct|vEbXHxS1%cmu-x0*2wgyz=q+bvcA&^epd3oDlIZp7D7hVk7NeBD1rw#@EM zZ4U;V)xo)sbxf*rY6}`GwE=)z4D%P;pdoR=|5rod{c#BKVBH-E{-*@TMaXsxV(CB> zq;&2B&prFV!Dk91&nUO0UV0qv-%{PTb1CTa?Yw>G5-(P zq+g~=ln;KjiX9zff6o71Tl*U?XtfuqamLgf}h8+_! zlC`pa@rp}3gm~+$1@mV#I~=}ht$%vgt{vC1?|1EJ4T;wL9Ha3)JoTb+7K z*|fd$D&3J;Gs^b&GEop6d5zPyPtJ9?#x#!~UuCmj)Twn(nzm)@H#%}UyUtoXZ*o2S z2bKnOzVUTU1%hwZC39QzotQu34Oi-X%@r}B3OYd#e2f1Idnb8lyLsFa=dz#`Bt{l0 zIS2hk;U1$@ z=9>2Q`MY*y@tQf{maua2xEoOXk&0MI2F!bgpeZStP70bySg9rjz5mMssDx`zlNhVx}YahO#7#<^d#4EZ}yi;amYUh-ua{OPE5mK`&9DipuUmut@kU+&S= zg9`XKO9n2@*?@Hbs6Y@)S=7g=k%*B_-Vul&gsK{r23OdF$OMEGh$q)JDX;zDcIE%l z_TGU}Rq6ZqoO|!|$@H3OnM_SDlgXrKQbEgJ$m(ai8JT)aaqXnp^?q^(KSxXc5Yl}_x?VZ*!3{)y@L`f!wYB)e z?H~l&@_y>lIC2ra@3FE#9n%ZFN#{UX~*}%i@$PSy=w^ z?4=FGw}rF@m8q^kr^INX^Z87fm06?Gx2~Ff`T3qYcI)W88Y64SjE*jl=C%|~7;Z|- zwT`Tr1v{NTCW9ok$03#Z7#I?r`iy8w?#|ueX{jocskLVZ2s{FPh%&xwRlg?=V>BER z)E7Z@X(PiWRXRakq53lr>4Vpk$ZaRo0~*;O6`KZDbj37fFSKtn7k`pJ{`(%a{x7UV zAy2V1tU zQeJuoq+8e^-4~7C{zZM^O#dsIJLwaO%iK!BXK z#o{+Dyo<_GO1PtXbOUTkLb?@5$%i4rJyd zmo~6M6Yw2Dn~}M z56(H5YOZLHX5Sb|?f?+0ST>qgj@)80SB$R6zH!cBYhNEJp2NSy{4}z1il_VzQ)>B` z;+)&&9=2NO%B>N3TP02!A*IE#k@WPDLsm=0=;EB7IX$#WH2dbLWJGz+P)#xaT#1Z7 zJ%^N2>ViRYF~!hBW2bL{P8(>n0_+OB(sY=ScuNtwhd~Gb`cX3j1|k?rX?u_qR*9qj zDl!<1!h-T4{rSk$+S;kPzt2-;DoR3ZEL0NB=<5xYRQmHC4zdol!(cTTO;!WeSfcb+ zpO0BNbCMkO8qFJhLx!ZSNs|R+d<%>o%#4h(l8}FdEp2HkV}Qk6Ar>p}V_@#LjG)hj zkJ=v_Ax3L%6paKQ;}Wn4V8RYC0%IjBIFSOHqc!C4^~NwV7hd{vm{2? zAC*`MzAYm)z}6{BgV9n8ze*a6nOc3ZD9u-l?Eta}NU&|*R7Vy)_aCuLtdZHd7XGu` zOoQ5Bcy-t&l}>`}8f~lZDU!P$zSq`Ik zu)@)q0?&LID`q@SqJWo5r8lUFjDL)mu|NSNOM9M}+dVR>vKs6fm&zxecOtPyBF;|Z z+V6k%P5#hK=JvbhWimzQUARTKnNyEm_A#lv;2!Y)sqHQ<#HQ#edjrvl13ubad{L8x zGZ{IHju`y#$wfE|SH*wz5r5^|eDM`4it>yXt0QdWEJ9jT;Xqc3=79 z;naHrC$Bp2iA&rDR^hcvI~tt#de-;1VUdsvN(B#mK4k_ldHb6%*c6bX8lLU5{{?AH z7|Mj?!h$%<_OiY44997OBO^{kM1)21U%4aW6n2zLu<{dDBqBZzu?GwtKZ_FRJm>x= z=|X$42mAYNr560Xph0*b!@uZSAL`nhL` z^O+t_#U++!l}M_~${2-Q)2opyn6k1O;bSgj$I|YVu%U$k4#+>t@SxWk_B~ z_#Qm}0^k{tv6W(Dh#>%HhXG8Z)HeckO%Jz7l&%)2F&45DQmV2tVksg1=LfpV3bX2~ zcRrozzov6_UU8(P%n|brSL|l$5|v6N^Xw4vJPGa4Xcm2eJFEQk+E>S_)xl|Hm*{?? z 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 literal 0 HcmV?d00001 diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..8b280b98fa2fa261aa4b0f8fd061f772073ef83e GIT binary patch literal 71508 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 literal 0 HcmV?d00001 diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js new file mode 100644 index 0000000..cf7215a --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/highlight.pack.js @@ -0,0 +1 @@ +var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
      ")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("asciidoc",function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"smartquote",b:"``.+?''",r:10},{cN:"smartquote",b:"`.+?'",r:10},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("fix",function(a){return{c:[{b:/[^\u2401\u0001]+/,e:/[\u2401\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\u2401\u0001=]+)/,e:/=([^\u2401\u0001=]+)/,rE:true,rB:false,cN:"attribute"},{b:/=/,e:/([\u2401\u0001])/,eE:true,eB:true,cN:"string"}]}],cI:true}});hljs.registerLanguage("mel",function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:""}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("livecodeserver",function(a){var e={cN:"variable",b:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",r:0};var b={cN:"comment",e:"$",v:[a.CBLCLM,a.HCM,{b:"--",},{b:"[^:]//",}]};var d=a.inherit(a.TM,{v:[{b:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{b:"\\b_[a-z0-9\\-]+"}]});var c=a.inherit(a.TM,{b:"\\b([A-Za-z0-9_\\-]+)\\b"});return{cI:false,k:{keyword:"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if",constant:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",operator:"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write"},c:[e,{cN:"keyword",b:"\\bend\\sif\\b"},{cN:"function",bK:"function",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"function",bK:"end",e:"$",c:[c,d]},{cN:"command",bK:"command on",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"command",bK:"end",e:"$",c:[c,d]},{cN:"preprocessor",b:"<\\?rev|<\\?lc|<\\?livecode",r:10},{cN:"preprocessor",b:"<\\?"},{cN:"preprocessor",b:"\\?>"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:";$|^\\[|^="}});hljs.registerLanguage("glsl",function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}});hljs.registerLanguage("lasso",function(d){var b="[a-zA-Z_][a-zA-Z0-9_.]*";var i="<\\?(lasso(script)?|=)";var c="\\]|\\?>";var g={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",built_in:"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"};var a={cN:"comment",b:"",r:0};var j={cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true,c:[a]}};var e={cN:"preprocessor",b:"\\[/noprocess|"+i};var h={cN:"variable",b:"'"+b+"'"};var f=[d.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+"|-?(infinity|nan)\\b"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",v:[{b:"[#$]"+b},{b:"#",e:"\\d+",i:"\\W"}]},{cN:"tag",b:"::\\s*",e:b,i:"\\W"},{cN:"attribute",b:"\\.\\.\\.|-"+d.UIR},{cN:"subst",v:[{b:"->\\s*",c:[h]},{b:":=|/(?!\\w)=?|[-+*%=<>&|!?\\\\]+",r:0}]},{cN:"built_in",b:"\\.\\.?",r:0,c:[h]},{cN:"class",bK:"define",rE:true,e:"\\(|=>",c:[d.inherit(d.TM,{b:d.UIR+"(=(?!>))?"})]}];return{aliases:["ls","lassoscript"],cI:true,l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:"\\[|"+i,rE:true,r:0,c:[a]}},j,e,{cN:"preprocessor",b:"\\[no_square_brackets",starts:{e:"\\[/no_square_brackets\\]",l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10}].concat(f)}});hljs.registerLanguage("mathematica",function(a){return{aliases:["mma"],l:"(\\$|\\b)"+a.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",c:[{cN:"comment",b:/\(\*/,e:/\*\)/},a.ASM,a.QSM,a.CNM,{cN:"list",b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("tex",function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-ÑÐ-Ñ]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-ÑÐ-Ñ0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-ÑÐ-Ñ]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("profile",function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[a.UTM],r:0}]}});hljs.registerLanguage("django",function(a){var b={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:/"/,e:/"/},{cN:"argument",b:/'/,e:/'/}]};return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"template_comment",b:/\{%\s*comment\s*%}/,e:/\{%\s*endcomment\s*%}/},{cN:"template_comment",b:/\{#/,e:/#}/},{cN:"template_tag",b:/\{%/,e:/%}/,k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[b]},{cN:"variable",b:/\{\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("smalltalk",function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"'},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":",r:0},a.CNM,c,d,{cN:"localvars",b:"\\|[ ]*"+b+"([ ]+"+b+")*[ ]*\\|",rB:true,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+b}]},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("oxygene",function(b){var g="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained";var a={cN:"comment",b:"{",e:"}",r:0};var e={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}]};var d={cN:"string",b:"(#\\d+)+"};var f={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[b.TM,{cN:"params",b:"\\(",e:"\\)",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'("|\\$[G-Zg-z]|\\/\\*|{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("erlang",function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#"+i.UIR,r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",e:"}",r:0}]};var k={bK:"fun receive if try case",e:"end",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(",rB:true,i:"\\(|#|//|/\\*|\\\\|:|;",c:[d,i.inherit(i.TM,{b:c})],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage("1c",function(b){var f="[a-zA-Zа-ÑÐ-Я][a-zA-Z0-9_а-ÑÐ-Я]*";var c="возврат дата Ð´Ð»Ñ ÐµÑли и или иначе иначееÑли иÑключение конецеÑли конецпопытки конецпроцедуры конецфункции конеццикла конÑтанта не перейти перем перечиÑление по пока попытка прервать продолжить процедура Ñтрока тогда Ñ„Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ†Ð¸ÐºÐ» чиÑло ÑкÑпорт";var e="ansitooem oemtoansi ввеÑтивидÑубконто ввеÑтидату ввеÑтизначение ввеÑтиперечиÑление ввеÑтипериод ввеÑтипланÑчетов ввеÑтиÑтроку ввеÑтичиÑло Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð²Ð¾ÑÑтановитьзначение врег выбранныйпланÑчетов вызватьиÑключение датагод датамеÑÑц датачиÑло добавитьмеÑÑц завершитьработуÑиÑтемы заголовокÑиÑтемы запиÑьжурналарегиÑтрации запуÑтитьприложение зафикÑироватьтранзакцию значениевÑтроку значениевÑтрокувнутр значениевфайл значениеизÑтроки значениеизÑтрокивнутр значениеизфайла имÑкомпьютера имÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…Ñ„Ð°Ð¹Ð»Ð¾Ð² каталогиб ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ кодÑимв командаÑиÑтемы конгода конецпериодаби конецраÑÑчитанногопериодаби конецÑтандартногоинтервала конквартала конмеÑÑца коннедели лев лог лог10 Ð¼Ð°ÐºÑ Ð¼Ð°ÐºÑимальноеколичеÑтвоÑубконто мин монопольныйрежим названиеинтерфейÑа названиенабораправ назначитьвид назначитьÑчет найти найтипомеченныенаудаление найтиÑÑылки началопериодаби началоÑтандартногоинтервала начатьтранзакцию начгода начквартала начмеÑÑца начнедели номерднÑгода номерднÑнедели номернеделигода нрег Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾ÐºÑ€ опиÑаниеошибки оÑновнойжурналраÑчетов оÑновнойпланÑчетов оÑновнойÑзык открытьформу открытьформумодально отменитьтранзакцию очиÑтитьокноÑообщений периодÑтр полноеимÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ²Ñ€ÐµÐ¼Ñта получитьдатута получитьдокументта получитьзначениÑотбора получитьпозициюта получитьпуÑтоезначение получитьта прав праводоÑтупа предупреждение префикÑавтонумерации пуÑтаÑÑтрока пуÑтоезначение рабочаÑдаттьпуÑтоезначение рабочаÑдата разделительÑтраниц разделительÑтрок разм разобратьпозициюдокумента раÑÑчитатьрегиÑтрына раÑÑчитатьрегиÑтрыпо Ñигнал Ñимв ÑимволтабулÑции Ñоздатьобъект Ñокрл Ñокрлп Ñокрп Ñообщить ÑоÑтоÑние Ñохранитьзначение Ñред ÑтатуÑвозврата Ñтрдлина Ñтрзаменить ÑтрколичеÑтвоÑтрок ÑтрполучитьÑтроку ÑтрчиÑловхождений Ñформироватьпозициюдокумента Ñчетпокоду текущаÑдата Ñ‚ÐµÐºÑƒÑ‰ÐµÐµÐ²Ñ€ÐµÐ¼Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÑтр удалитьобъекты уÑтановитьтана уÑтановитьтапо фикÑшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a]};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функциÑ)",e:"$",l:f,k:"процедура функциÑ",c:[b.inherit(b.TM,{b:f}),{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"ÑкÑпорт",eW:true,l:f,k:"ÑкÑпорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("haskell",function(f){var g={cN:"comment",v:[{b:"--",e:"$"},{b:"{-",e:"-}",c:["self"]}]};var e={cN:"pragma",b:"{-#",e:"#-}"};var b={cN:"preprocessor",b:"^#",e:"$"};var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[e,g,b,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},f.inherit(f.TM,{b:"[_a-z][\\w']*"})]};var a={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"module",b:"\\bmodule\\b",e:"where",k:"module where",c:[c,g],i:"\\W\\.|;"},{cN:"import",b:"\\bimport\\b",e:"$",k:"import|0 qualified as hiding",c:[c,g],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[d,c,g]},{cN:"typedef",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[e,g,d,c,a]},{cN:"default",bK:"default",e:"$",c:[d,c,g]},{cN:"infix",bK:"infix infixl infixr",e:"$",c:[f.CNM,g]},{cN:"foreign",b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[d,f.QSM,g]},{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:"^[_a-z][\\w']*"}),{b:"->|<-"}]}});hljs.registerLanguage("delphi",function(b){var a="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure";var e={cN:"comment",v:[{b:/\{/,e:/\}/,r:0},{b:/\(\*/,e:/\*\)/,r:10}]};var c={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:"string",b:/(#\d+)+/};var f={b:b.IR+"\\s*=\\s*class\\s*\\(",rB:true,c:[b.TM]};var g={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[b.TM,{cN:"params",b:/\(/,e:/\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/("|\$[G-Zg-z]|\/\*|<\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",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:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("avrasm",function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$",r:0},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}});hljs.registerLanguage("lisp",function(h){var k="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var l="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var j={cN:"shebang",b:"^#!",e:"$"};var b={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d={cN:"number",v:[{b:l,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{b:"#c\\("+l+" +"+l,e:"\\)"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:"comment",b:";",e:"$"};var f={cN:"variable",b:"\\*",e:"\\*"};var n={cN:"keyword",b:"[:&]"+k};var c={b:"\\(",e:"\\)",c:["self",b,g,d]};var a={cN:"quoted",c:[d,g,f,n,c],v:[{b:"['`]\\(",e:"\\)",},{b:"\\(quote ",e:"\\)",k:{title:"quote"},}]};var i={cN:"list",b:"\\(",e:"\\)"};var e={eW:true,r:0};i.c=[{cN:"title",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage("vbnet",function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|"},{cN:"xmlDocTag",b:""},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}});hljs.registerLanguage("axapta",function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",i:":",c:[{cN:"inheritance",bK:"extends implements",r:10},a.UTM]}]}});hljs.registerLanguage("ocaml",function(a){return{k:{keyword:"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value",built_in:"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string",},i:/\/\//,c:[{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self"]},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("erlang-repl",function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("vala",function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bK:"class interface delegate namespace",e:"{",i:"[^,:\\n\\s\\.]",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}});hljs.registerLanguage("dos",function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}});hljs.registerLanguage("clojure",function(l){var e={built_in:"def cond apply if-not if-let if not not= = < < > <= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\S/,c:[o,m,{cN:"prompt",b:/^=> /,starts:{e:/\n\n|\Z/}}]}});hljs.registerLanguage("go",function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:b,i:"]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("lua",function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bK:"function",e:"\\)",c:[b.inherit(b.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage("rsl",function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:";/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("r",function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[a.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("haml",function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(!=#|=#|-#|/).*$",r:0},{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+"},{cN:"value",b:"[#\\.]\\w+"},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,c:[{cN:"symbol",b:":\\w+"},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]},]}]},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("brainfuck",function(b){var a={cN:"literal",b:"[\\+\\-]",r:0};return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",rE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:true,c:[a]},a]}});hljs.registerLanguage("matlab",function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b,r:0},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b,i:/:/},{cN:"comment",b:"\\%",e:"$"}].concat(b)}});hljs.registerLanguage("vbscript",function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage("fsharp",function(a){return{k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},{cN:"attribute",b:"\\B('[A-Za-z])\\b",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("rib",function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,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:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("cmake",function(a){return{cI:true,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or",operator:"equal less greater strless strgreater strequal matches"},c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("applescript",function(a){var b=a.inherit(a.QSM,{i:""});var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bK:"on",i:"[${=;\\n]",c:[a.UTM,d]}].concat(c),i:"//"}});hljs.registerLanguage("vhdl",function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}});hljs.registerLanguage("parser3",function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}});hljs.registerLanguage("scala",function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bK:"extends with",r:10},a.UTM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}); \ No newline at end of file diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css new file mode 100644 index 0000000..71967a3 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/highlightjs/styles/github.css @@ -0,0 +1,125 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #333; + background: #f8f8f8 +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-javadoc { + color: #998; + font-style: italic +} + +.hljs-keyword, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.nginx .hljs-title, +.hljs-subst, +.hljs-request, +.hljs-status { + color: #333; + font-weight: bold +} + +.hljs-number, +.hljs-hexcolor, +.ruby .hljs-constant { + color: #099; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula { + color: #d14 +} + +.hljs-title, +.hljs-id, +.coffeescript .hljs-params, +.scss .hljs-preprocessor { + color: #900; + font-weight: bold +} + +.javascript .hljs-title, +.lisp .hljs-title, +.clojure .hljs-title, +.hljs-subst { + font-weight: normal +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.vhdl .hljs-literal, +.tex .hljs-command { + color: #458; + font-weight: bold +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword { + color: #000080; + font-weight: normal +} + +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body { + color: #008080 +} + +.hljs-regexp { + color: #009926 +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.lisp .hljs-keyword, +.tex .hljs-special, +.hljs-prompt { + color: #990073 +} + +.hljs-built_in, +.lisp .hljs-title, +.clojure .hljs-built_in { + color: #0086b3 +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-doctype, +.hljs-shebang, +.hljs-cdata { + color: #999; + font-weight: bold +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.diff .hljs-change { + background: #0086b3 +} + +.hljs-chunk { + color: #aaa +} diff --git a/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js new file mode 100644 index 0000000..d3a4400 --- /dev/null +++ b/vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/jquery/dist/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="
      ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
      a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:k.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("