From 3e2322fe3a1f24dc16a5739ce1803c3c2a7259e0 Mon Sep 17 00:00:00 2001 From: Xavier Guimard Date: Thu, 14 May 2015 06:44:38 +0000 Subject: [PATCH] Import and adapt https://github.com/guimard/angular-lemonldap-ng-manager.git --- .../lib/Lemonldap/NG/Common/Apache/Session.pm | 4 +- .../Common/Apache/Session/Serialize/JSON.pm | 62 +- .../lib/Lemonldap/NG/Common/Conf.pm | 53 +- .../Lemonldap/NG/Common/Conf/Attributes.pm | 1655 -- .../Lemonldap/NG/Common/Conf/DefaultValues.pm | 315 + .../lib/Lemonldap/NG/Common/Conf/File.pm | 105 +- .../lib/Lemonldap/NG/Common/Conf/JSONFile.pm | 111 +- .../lib/Lemonldap/NG/Common/PSGI.pm | 151 + .../lib/Lemonldap/NG/Common/PSGI/Constants.pm | 25 + .../lib/Lemonldap/NG/Common/PSGI/Request.pm | 140 + .../lib/Lemonldap/NG/Common/PSGI/Router.pm | 152 + .../lib/Lemonldap/NG/Handler/API.pm | 7 +- .../lib/Lemonldap/NG/Handler/API/PSGI.pm | 186 + .../lib/Lemonldap/NG/Handler/Main/Logger.pm | 2 +- .../lib/Lemonldap/NG/Handler/PSGI.pm | 71 + lemonldap-ng-manager/KINEMATIC.md | 31 + lemonldap-ng-manager/README.md | 42 + lemonldap-ng-manager/REST-API.md | 65 + lemonldap-ng-manager/TODO.md | 58 + lemonldap-ng-manager/bower.json | 15 + lemonldap-ng-manager/eg/manager-server.psgi | 5 + lemonldap-ng-manager/example/index.pl | 54 - lemonldap-ng-manager/example/mrtg/lmng-mrtg | 46 - .../example/mrtg/mrtg.cfg.example | 30 - lemonldap-ng-manager/example/notfound.html | 9 - lemonldap-ng-manager/example/notfoundfr.html | 10 - lemonldap-ng-manager/example/notifications.pl | 58 - .../example/scripts/lemonldap-ng-cli | 110 - .../example/scripts/lmConfigEditor | 92 - lemonldap-ng-manager/example/sessions.pl | 56 - .../example/skins/default/css/accordion.css | 76 - .../skins/default/css/bootstrap-theme.css | 442 - .../example/skins/default/css/bootstrap.css | 6203 ------- .../example/skins/default/css/manager.css | 170 - .../example/skins/default/css/tree.css | 200 - .../skins/default/images/1downarrow_16x16.png | Bin 657 -> 0 bytes .../default/images/1rightarrow_16x16.png | Bin 675 -> 0 bytes .../skins/default/images/apps-logos/README | 13 - .../default/images/apps-logos/attach.png | Bin 1491 -> 0 bytes .../skins/default/images/apps-logos/bell.png | Bin 1887 -> 0 bytes .../default/images/apps-logos/bookmark.png | Bin 1757 -> 0 bytes .../default/images/apps-logos/configure.png | Bin 2503 -> 0 bytes .../default/images/apps-logos/custom.png | Bin 2079 -> 0 bytes .../default/images/apps-logos/database.png | Bin 2775 -> 0 bytes .../skins/default/images/apps-logos/demo.png | Bin 2247 -> 0 bytes .../skins/default/images/apps-logos/docs.png | 1 - .../default/images/apps-logos/folder.png | Bin 1377 -> 0 bytes .../skins/default/images/apps-logos/gear.png | Bin 2008 -> 0 bytes .../skins/default/images/apps-logos/help.png | Bin 2388 -> 0 bytes .../default/images/apps-logos/mailappt.png | Bin 1570 -> 0 bytes .../skins/default/images/apps-logos/money.png | Bin 1347 -> 0 bytes .../default/images/apps-logos/network.png | Bin 2531 -> 0 bytes .../default/images/apps-logos/terminal.png | Bin 1225 -> 0 bytes .../default/images/apps-logos/thumbnail.png | Bin 1619 -> 0 bytes .../skins/default/images/apps-logos/tools.png | 1 - .../skins/default/images/apps-logos/tux.png | Bin 2505 -> 0 bytes .../skins/default/images/apps-logos/web.png | 1 - .../default/images/apps-logos/wheels.png | 1 - .../skins/default/images/bullet_green.png | Bin 295 -> 0 bytes .../skins/default/images/bullet_orange.png | Bin 283 -> 0 bytes .../skins/default/images/bullet_red.png | Bin 287 -> 0 bytes .../default/images/logo_lemonldap-ng.png | Bin 4798 -> 0 bytes .../example/skins/default/images/spinner.gif | Bin 1553 -> 0 bytes .../skins/default/images/tree/root.gif | Bin 996 -> 0 bytes .../skins/default/images/tree/spacer.gif | Bin 43 -> 0 bytes .../skins/default/images/tree/tree.png | Bin 11295 -> 0 bytes .../example/skins/default/js/bootstrap.js | 2114 --- .../example/skins/default/js/jquery-1.10.2.js | 9789 ---------- .../default/js/jquery-ui-1.10.3.custom.js | 15003 ---------------- .../skins/default/js/jquery.ajaxfileupload.js | 173 - .../example/skins/default/js/jquery.cookie.js | 96 - .../skins/default/js/jquery.elastic.source.js | 164 - .../example/skins/default/js/manager.js | 1719 -- .../example/skins/default/js/notifications.js | 159 - .../example/skins/default/js/sessions.js | 35 - .../example/skins/default/js/tree.js | 545 - .../example/skins/default/lemonldap-ng.ico | Bin 1406 -> 0 bytes .../example/skins/default/manager.tpl | 895 - .../example/skins/default/notifications.tpl | 117 - .../example/skins/default/sessions.tpl | 74 - .../example/skins/default/top.tpl | 39 - .../ui-darkness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_30_cccccc_40x100.png | Bin 220 -> 0 bytes .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 230 -> 0 bytes .../images/ui-bg_glass_20_555555_1x400.png | Bin 260 -> 0 bytes .../images/ui-bg_glass_40_0078a3_1x400.png | Bin 342 -> 0 bytes .../images/ui-bg_glass_40_ffc73d_1x400.png | Bin 316 -> 0 bytes .../ui-bg_gloss-wave_25_333333_500x100.png | Bin 3816 -> 0 bytes .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin 276 -> 0 bytes .../ui-bg_inset-soft_25_000000_1x100.png | Bin 275 -> 0 bytes .../ui-bg_inset-soft_30_f58400_1x100.png | Bin 340 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_4b8e0b_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_a83300_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_cccccc_256x240.png | Bin 6975 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes .../jquery-ui-1.10.3.custom.min.css | 7 - .../ui-lightness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 205 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 348 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 5815 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 278 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 328 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_228ef1_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes .../jquery-ui-1.10.3.custom.min.css | 7 - .../lib/Lemonldap/NG/Manager.pm | 218 +- .../lib/Lemonldap/NG/Manager/Attributes.pm | 2015 +++ .../lib/Lemonldap/NG/Manager/CTrees.pm | 195 + .../lib/Lemonldap/NG/Manager/Cli.pm | 1237 -- .../lib/Lemonldap/NG/Manager/Conf.pm | 684 + .../lib/Lemonldap/NG/Manager/ConfParser.pm | 638 + .../lib/Lemonldap/NG/Manager/Constants.pm | 30 + .../lib/Lemonldap/NG/Manager/Downloader.pm | 709 - .../lib/Lemonldap/NG/Manager/Lib.pm | 39 + .../lib/Lemonldap/NG/Manager/Notifications.pm | 952 +- .../lib/Lemonldap/NG/Manager/Request.pm | 107 - .../lib/Lemonldap/NG/Manager/Sessions.pm | 1260 +- .../lib/Lemonldap/NG/Manager/Tests.pm | 315 + .../lib/Lemonldap/NG/Manager/Tree.pm | 836 + .../lib/Lemonldap/NG/Manager/Uploader.pm | 858 - .../lib/Lemonldap/NG/Manager/_Struct.pm | 2798 --- .../lib/Lemonldap/NG/Manager/_i18n.pm | 1202 -- lemonldap-ng-manager/scripts/convertConfig | 86 + lemonldap-ng-manager/scripts/jsongenerator.pl | 322 + .../scripts/testConfBackend.pl | 110 + lemonldap-ng-manager/site-test/e2e/00-auth.js | 16 + lemonldap-ng-manager/site-test/e2e/01-tree.js | 42 + lemonldap-ng-manager/site-test/e2e/02-lang.js | 30 + lemonldap-ng-manager/site-test/e2e/05-form.js | 100 + lemonldap-ng-manager/site-test/e2e/06-form.js | 20 + .../site-test/e2e/40-sessions.js | 52 + .../site-test/e2e/99-logout.js | 11 + lemonldap-ng-manager/site-test/e2e/README.md | 57 + .../site-test/protractor-conf.js | 21 + .../site/psgi/manager-server.psgi | 5 + lemonldap-ng-manager/site/static/README.md | 195 + lemonldap-ng-manager/site/static/RSAKey.html | 40 + .../site/static/RSAKeyNoPassword.html | 35 + .../site/static/authParams.html | 22 + .../site/static/blackWhiteList.html | 25 + lemonldap-ng-manager/site/static/bool.html | 22 + .../site/static/boolOrExpr.html | 29 + .../static}/bootstrap.png | Bin .../dist/angular-ui-tree.min.css | 2 + .../dist/angular-ui-tree.min.js | 6 + .../site/static/bwr/angular/angular.min.js | 250 + .../bwr/bootstrap/dist/css/bootstrap.min.css | 7 + .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../bwr/bootstrap/dist/js/bootstrap.min.js | 6 + .../site/static/bwr/es5-shim/es5-shim.min.js | 2 + .../site/static/bwr/jquery/dist/jquery.min.js | 5 + .../site/static/catAndAppList.html | 17 + .../portal-skins => site/static}/custom.png | Bin .../portal-skins => site/static}/dark.png | Bin lemonldap-ng-manager/site/static/en.json | 684 + lemonldap-ng-manager/site/static/en.png | Bin 0 -> 599 bytes lemonldap-ng-manager/site/static/file.html | 19 + lemonldap-ng-manager/site/static/fr.json | 684 + lemonldap-ng-manager/site/static/fr.png | Bin 0 -> 545 bytes lemonldap-ng-manager/site/static/home.html | 28 + .../portal-skins => site/static}/impact.png | Bin lemonldap-ng-manager/site/static/int.html | 15 + .../site/static/js/conftree.js | 1 + .../site/static/js/filterFunctions.js | 41 + lemonldap-ng-manager/site/static/js/llApp.js | 220 + .../site/static/js/manager.js | 733 + .../site/static/js/notifications.js | 241 + .../site/static/js/sessions.js | 345 + .../static/js/ui-bootstrap-tpls-0.12.1.min.js | 10 + lemonldap-ng-manager/site/static/keyText.html | 18 + .../site/static/keyTextContainer.html | 30 + .../site/static/llng-icon-32.png | Bin 0 -> 576 bytes .../site/static/llng-icon-48.png | Bin 0 -> 1040 bytes .../site/static/llng-icon.ico | Bin 0 -> 7406 bytes lemonldap-ng-manager/site/static/llng.png | Bin 0 -> 6408 bytes .../site/static/longtext.html | 16 + lemonldap-ng-manager/site/static/manager.css | 194 + lemonldap-ng-manager/site/static/menuApp.html | 50 + lemonldap-ng-manager/site/static/menuCat.html | 39 + .../site/static/oidcOPMetaDataNode.html | 19 + .../static/oidcOPMetaDataNodeContainer.html | 24 + .../site/static/oidcRPMetaDataNode.html | 19 + .../static/oidcRPMetaDataNodeContainer.html | 24 + .../site/static/oidcmetadatajson.html | 1 + .../site/static/oidcmetadatajwks.html | 1 + .../site/static/password.html | 17 + .../portal-skins => site/static}/pastel.png | Bin .../site/static/portalskin.html | 56 + lemonldap-ng-manager/site/static/post.html | 35 + .../site/static/postContainer.html | 45 + lemonldap-ng-manager/site/static/restore.html | 14 + lemonldap-ng-manager/site/static/rule.html | 29 + .../site/static/ruleContainer.html | 39 + .../site/static/samlAssertion.html | 44 + .../site/static/samlAttribute.html | 53 + .../site/static/samlAttributeContainer.html | 54 + .../site/static/samlIDPMetaDataNode.html | 19 + .../static/samlIDPMetaDataNodeContainer.html | 25 + .../site/static/samlSPMetaDataNode.html | 19 + .../static/samlSPMetaDataNodeContainer.html | 25 + .../site/static/samlService.html | 29 + lemonldap-ng-manager/site/static/select.html | 15 + .../site/static/simpleInputContainer.html | 90 + lemonldap-ng-manager/site/static/struct.json | 1 + lemonldap-ng-manager/site/static/text.html | 16 + lemonldap-ng-manager/site/static/trool.html | 26 + .../site/static/virtualHost.html | 19 + .../site/static/virtualHostContainer.html | 24 + lemonldap-ng-manager/site/static/white.html | 2 + .../site/templates/footer.tpl | 6 + .../site/templates/header.tpl | 12 + .../site/templates/manager.tpl | 152 + .../site/templates/menubar.tpl | 31 + .../site/templates/notifications.tpl | 117 + .../site/templates/scripts.tpl | 38 + .../site/templates/sessions.tpl | 103 + lemonldap-ng-manager/site/templates/tree.tpl | 18 + lemonldap-ng-manager/t/01-base-tree.json | 1965 ++ lemonldap-ng-manager/t/02-HTML-template.t | 21 + .../t/02-base-tree-all-nodes-opened.json | 2454 +++ lemonldap-ng-manager/t/03-HTML-forms.t | 80 + lemonldap-ng-manager/t/05-rest-api.t | 88 + lemonldap-ng-manager/t/06-rest-api.t | 34 + lemonldap-ng-manager/t/10-Manager.t | 46 - .../t/10-save-unchanged-conf.t | 48 + lemonldap-ng-manager/t/12-modified.json | 2541 +++ lemonldap-ng-manager/t/12-save-changed-conf.t | 141 + lemonldap-ng-manager/t/20-Manager-i18n.t | 48 - lemonldap-ng-manager/t/30-Manager-Struct.t | 29 - lemonldap-ng-manager/t/40-Manager-Sessions.t | 39 - lemonldap-ng-manager/t/40-sessions.t | 159 + lemonldap-ng-manager/t/50-Cli.t | 12 - lemonldap-ng-manager/t/50-notifications.t | 96 + lemonldap-ng-manager/t/90-translations.t | 121 + lemonldap-ng-manager/t/lemonldap-ng.ini | 33 + lemonldap-ng-manager/t/lmConf-1.js | 153 + lemonldap-ng-manager/t/test-lib.pm | 173 + 248 files changed, 21070 insertions(+), 49232 deletions(-) delete mode 100644 lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Attributes.pm create mode 100644 lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm create mode 100644 lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI.pm create mode 100644 lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Constants.pm create mode 100644 lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Request.pm create mode 100644 lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Router.pm create mode 100644 lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API/PSGI.pm create mode 100644 lemonldap-ng-handler/lib/Lemonldap/NG/Handler/PSGI.pm create mode 100644 lemonldap-ng-manager/KINEMATIC.md create mode 100644 lemonldap-ng-manager/README.md create mode 100644 lemonldap-ng-manager/REST-API.md create mode 100644 lemonldap-ng-manager/TODO.md create mode 100644 lemonldap-ng-manager/bower.json create mode 100644 lemonldap-ng-manager/eg/manager-server.psgi delete mode 100755 lemonldap-ng-manager/example/index.pl delete mode 100755 lemonldap-ng-manager/example/mrtg/lmng-mrtg delete mode 100644 lemonldap-ng-manager/example/mrtg/mrtg.cfg.example delete mode 100644 lemonldap-ng-manager/example/notfound.html delete mode 100644 lemonldap-ng-manager/example/notfoundfr.html delete mode 100755 lemonldap-ng-manager/example/notifications.pl delete mode 100644 lemonldap-ng-manager/example/scripts/lemonldap-ng-cli delete mode 100644 lemonldap-ng-manager/example/scripts/lmConfigEditor delete mode 100755 lemonldap-ng-manager/example/sessions.pl delete mode 100644 lemonldap-ng-manager/example/skins/default/css/accordion.css delete mode 100644 lemonldap-ng-manager/example/skins/default/css/bootstrap-theme.css delete mode 100644 lemonldap-ng-manager/example/skins/default/css/bootstrap.css delete mode 100644 lemonldap-ng-manager/example/skins/default/css/manager.css delete mode 100644 lemonldap-ng-manager/example/skins/default/css/tree.css delete mode 100644 lemonldap-ng-manager/example/skins/default/images/1downarrow_16x16.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/1rightarrow_16x16.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/README delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/attach.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/bell.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/bookmark.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/configure.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/custom.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/database.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/demo.png delete mode 120000 lemonldap-ng-manager/example/skins/default/images/apps-logos/docs.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/folder.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/gear.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/help.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/mailappt.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/money.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/network.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/terminal.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/thumbnail.png delete mode 120000 lemonldap-ng-manager/example/skins/default/images/apps-logos/tools.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/apps-logos/tux.png delete mode 120000 lemonldap-ng-manager/example/skins/default/images/apps-logos/web.png delete mode 120000 lemonldap-ng-manager/example/skins/default/images/apps-logos/wheels.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/bullet_green.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/bullet_orange.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/bullet_red.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/logo_lemonldap-ng.png delete mode 100644 lemonldap-ng-manager/example/skins/default/images/spinner.gif delete mode 100644 lemonldap-ng-manager/example/skins/default/images/tree/root.gif delete mode 100644 lemonldap-ng-manager/example/skins/default/images/tree/spacer.gif delete mode 100644 lemonldap-ng-manager/example/skins/default/images/tree/tree.png delete mode 100644 lemonldap-ng-manager/example/skins/default/js/bootstrap.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/jquery-1.10.2.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/jquery-ui-1.10.3.custom.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/jquery.ajaxfileupload.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/jquery.cookie.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/jquery.elastic.source.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/manager.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/notifications.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/sessions.js delete mode 100644 lemonldap-ng-manager/example/skins/default/js/tree.js delete mode 100644 lemonldap-ng-manager/example/skins/default/lemonldap-ng.ico delete mode 100644 lemonldap-ng-manager/example/skins/default/manager.tpl delete mode 100644 lemonldap-ng-manager/example/skins/default/notifications.tpl delete mode 100644 lemonldap-ng-manager/example/skins/default/sessions.tpl delete mode 100644 lemonldap-ng-manager/example/skins/default/top.tpl delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/animated-overlay.gif delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_glass_20_555555_1x400.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-icons_222222_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-icons_4b8e0b_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-icons_a83300_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-icons_cccccc_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/images/ui-icons_ffffff_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-darkness/jquery-ui-1.10.3.custom.min.css delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/animated-overlay.gif delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_flat_10_000000_40x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-icons_228ef1_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-icons_ef8c08_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-icons_ffd27a_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/images/ui-icons_ffffff_256x240.png delete mode 100644 lemonldap-ng-manager/example/skins/default/ui-lightness/jquery-ui-1.10.3.custom.min.css create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/CTrees.pm delete mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Cli.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/ConfParser.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Constants.pm delete mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Downloader.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Lib.pm delete mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Request.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Tests.pm create mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Tree.pm delete mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Uploader.pm delete mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/_Struct.pm delete mode 100644 lemonldap-ng-manager/lib/Lemonldap/NG/Manager/_i18n.pm create mode 100755 lemonldap-ng-manager/scripts/convertConfig create mode 100644 lemonldap-ng-manager/scripts/jsongenerator.pl create mode 100755 lemonldap-ng-manager/scripts/testConfBackend.pl create mode 100644 lemonldap-ng-manager/site-test/e2e/00-auth.js create mode 100644 lemonldap-ng-manager/site-test/e2e/01-tree.js create mode 100644 lemonldap-ng-manager/site-test/e2e/02-lang.js create mode 100644 lemonldap-ng-manager/site-test/e2e/05-form.js create mode 100644 lemonldap-ng-manager/site-test/e2e/06-form.js create mode 100644 lemonldap-ng-manager/site-test/e2e/40-sessions.js create mode 100644 lemonldap-ng-manager/site-test/e2e/99-logout.js create mode 100644 lemonldap-ng-manager/site-test/e2e/README.md create mode 100644 lemonldap-ng-manager/site-test/protractor-conf.js create mode 100644 lemonldap-ng-manager/site/psgi/manager-server.psgi create mode 100644 lemonldap-ng-manager/site/static/README.md create mode 100644 lemonldap-ng-manager/site/static/RSAKey.html create mode 100644 lemonldap-ng-manager/site/static/RSAKeyNoPassword.html create mode 100644 lemonldap-ng-manager/site/static/authParams.html create mode 100644 lemonldap-ng-manager/site/static/blackWhiteList.html create mode 100644 lemonldap-ng-manager/site/static/bool.html create mode 100644 lemonldap-ng-manager/site/static/boolOrExpr.html rename lemonldap-ng-manager/{example/skins/default/images/portal-skins => site/static}/bootstrap.png (100%) create mode 100644 lemonldap-ng-manager/site/static/bwr/angular-ui-tree/dist/angular-ui-tree.min.css create mode 100644 lemonldap-ng-manager/site/static/bwr/angular-ui-tree/dist/angular-ui-tree.min.js create mode 100644 lemonldap-ng-manager/site/static/bwr/angular/angular.min.js create mode 100644 lemonldap-ng-manager/site/static/bwr/bootstrap/dist/css/bootstrap.min.css rename lemonldap-ng-manager/{example/skins/default => site/static/bwr/bootstrap/dist}/fonts/glyphicons-halflings-regular.eot (100%) rename lemonldap-ng-manager/{example/skins/default => site/static/bwr/bootstrap/dist}/fonts/glyphicons-halflings-regular.svg (100%) rename lemonldap-ng-manager/{example/skins/default => site/static/bwr/bootstrap/dist}/fonts/glyphicons-halflings-regular.ttf (100%) rename lemonldap-ng-manager/{example/skins/default => site/static/bwr/bootstrap/dist}/fonts/glyphicons-halflings-regular.woff (100%) create mode 100644 lemonldap-ng-manager/site/static/bwr/bootstrap/dist/js/bootstrap.min.js create mode 100644 lemonldap-ng-manager/site/static/bwr/es5-shim/es5-shim.min.js create mode 100644 lemonldap-ng-manager/site/static/bwr/jquery/dist/jquery.min.js create mode 100644 lemonldap-ng-manager/site/static/catAndAppList.html rename lemonldap-ng-manager/{example/skins/default/images/portal-skins => site/static}/custom.png (100%) rename lemonldap-ng-manager/{example/skins/default/images/portal-skins => site/static}/dark.png (100%) create mode 100644 lemonldap-ng-manager/site/static/en.json create mode 100644 lemonldap-ng-manager/site/static/en.png create mode 100644 lemonldap-ng-manager/site/static/file.html create mode 100644 lemonldap-ng-manager/site/static/fr.json create mode 100755 lemonldap-ng-manager/site/static/fr.png create mode 100644 lemonldap-ng-manager/site/static/home.html rename lemonldap-ng-manager/{example/skins/default/images/portal-skins => site/static}/impact.png (100%) create mode 100644 lemonldap-ng-manager/site/static/int.html create mode 100644 lemonldap-ng-manager/site/static/js/conftree.js create mode 100644 lemonldap-ng-manager/site/static/js/filterFunctions.js create mode 100644 lemonldap-ng-manager/site/static/js/llApp.js create mode 100644 lemonldap-ng-manager/site/static/js/manager.js create mode 100644 lemonldap-ng-manager/site/static/js/notifications.js create mode 100644 lemonldap-ng-manager/site/static/js/sessions.js create mode 100644 lemonldap-ng-manager/site/static/js/ui-bootstrap-tpls-0.12.1.min.js create mode 100644 lemonldap-ng-manager/site/static/keyText.html create mode 100644 lemonldap-ng-manager/site/static/keyTextContainer.html create mode 100644 lemonldap-ng-manager/site/static/llng-icon-32.png create mode 100644 lemonldap-ng-manager/site/static/llng-icon-48.png create mode 100644 lemonldap-ng-manager/site/static/llng-icon.ico create mode 100644 lemonldap-ng-manager/site/static/llng.png create mode 100644 lemonldap-ng-manager/site/static/longtext.html create mode 100644 lemonldap-ng-manager/site/static/manager.css create mode 100644 lemonldap-ng-manager/site/static/menuApp.html create mode 100644 lemonldap-ng-manager/site/static/menuCat.html create mode 100644 lemonldap-ng-manager/site/static/oidcOPMetaDataNode.html create mode 100644 lemonldap-ng-manager/site/static/oidcOPMetaDataNodeContainer.html create mode 100644 lemonldap-ng-manager/site/static/oidcRPMetaDataNode.html create mode 100644 lemonldap-ng-manager/site/static/oidcRPMetaDataNodeContainer.html create mode 100644 lemonldap-ng-manager/site/static/oidcmetadatajson.html create mode 100644 lemonldap-ng-manager/site/static/oidcmetadatajwks.html create mode 100644 lemonldap-ng-manager/site/static/password.html rename lemonldap-ng-manager/{example/skins/default/images/portal-skins => site/static}/pastel.png (100%) create mode 100644 lemonldap-ng-manager/site/static/portalskin.html create mode 100644 lemonldap-ng-manager/site/static/post.html create mode 100644 lemonldap-ng-manager/site/static/postContainer.html create mode 100644 lemonldap-ng-manager/site/static/restore.html create mode 100644 lemonldap-ng-manager/site/static/rule.html create mode 100644 lemonldap-ng-manager/site/static/ruleContainer.html create mode 100644 lemonldap-ng-manager/site/static/samlAssertion.html create mode 100644 lemonldap-ng-manager/site/static/samlAttribute.html create mode 100644 lemonldap-ng-manager/site/static/samlAttributeContainer.html create mode 100644 lemonldap-ng-manager/site/static/samlIDPMetaDataNode.html create mode 100644 lemonldap-ng-manager/site/static/samlIDPMetaDataNodeContainer.html create mode 100644 lemonldap-ng-manager/site/static/samlSPMetaDataNode.html create mode 100644 lemonldap-ng-manager/site/static/samlSPMetaDataNodeContainer.html create mode 100644 lemonldap-ng-manager/site/static/samlService.html create mode 100644 lemonldap-ng-manager/site/static/select.html create mode 100644 lemonldap-ng-manager/site/static/simpleInputContainer.html create mode 100644 lemonldap-ng-manager/site/static/struct.json create mode 100644 lemonldap-ng-manager/site/static/text.html create mode 100644 lemonldap-ng-manager/site/static/trool.html create mode 100644 lemonldap-ng-manager/site/static/virtualHost.html create mode 100644 lemonldap-ng-manager/site/static/virtualHostContainer.html create mode 100644 lemonldap-ng-manager/site/static/white.html create mode 100644 lemonldap-ng-manager/site/templates/footer.tpl create mode 100644 lemonldap-ng-manager/site/templates/header.tpl create mode 100644 lemonldap-ng-manager/site/templates/manager.tpl create mode 100644 lemonldap-ng-manager/site/templates/menubar.tpl create mode 100644 lemonldap-ng-manager/site/templates/notifications.tpl create mode 100644 lemonldap-ng-manager/site/templates/scripts.tpl create mode 100644 lemonldap-ng-manager/site/templates/sessions.tpl create mode 100644 lemonldap-ng-manager/site/templates/tree.tpl create mode 100644 lemonldap-ng-manager/t/01-base-tree.json create mode 100644 lemonldap-ng-manager/t/02-HTML-template.t create mode 100644 lemonldap-ng-manager/t/02-base-tree-all-nodes-opened.json create mode 100644 lemonldap-ng-manager/t/03-HTML-forms.t create mode 100644 lemonldap-ng-manager/t/05-rest-api.t create mode 100644 lemonldap-ng-manager/t/06-rest-api.t delete mode 100644 lemonldap-ng-manager/t/10-Manager.t create mode 100644 lemonldap-ng-manager/t/10-save-unchanged-conf.t create mode 100644 lemonldap-ng-manager/t/12-modified.json create mode 100644 lemonldap-ng-manager/t/12-save-changed-conf.t delete mode 100644 lemonldap-ng-manager/t/20-Manager-i18n.t delete mode 100644 lemonldap-ng-manager/t/30-Manager-Struct.t delete mode 100644 lemonldap-ng-manager/t/40-Manager-Sessions.t create mode 100644 lemonldap-ng-manager/t/40-sessions.t delete mode 100644 lemonldap-ng-manager/t/50-Cli.t create mode 100644 lemonldap-ng-manager/t/50-notifications.t create mode 100644 lemonldap-ng-manager/t/90-translations.t create mode 100644 lemonldap-ng-manager/t/lemonldap-ng.ini create mode 100644 lemonldap-ng-manager/t/lmConf-1.js create mode 100644 lemonldap-ng-manager/t/test-lib.pm diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session.pm index 38fb6db5a..e1c21935d 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session.pm @@ -11,10 +11,11 @@ use strict; use AutoLoader 'AUTOLOAD'; use Apache::Session; use base qw(Apache::Session); +use Lemonldap::NG::Common::Apache::Session::Serialize::JSON; use Lemonldap::NG::Common::Apache::Session::Store; use Lemonldap::NG::Common::Apache::Session::Lock; -our $VERSION = '1.4.4'; +our $VERSION = '1.5.99'; sub _load { my $backend = shift; @@ -34,7 +35,6 @@ sub populate { $self = $self->$backend(@_); } if ( $self->{args}->{jsonSerialize} ) { - require Lemonldap::NG::Common::Apache::Session::Serialize::JSON; $self->{serialize} = \&Lemonldap::NG::Common::Apache::Session::Serialize::JSON::serialize; $self->{unserialize} = diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session/Serialize/JSON.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session/Serialize/JSON.pm index 28d48d89e..cf0a554e6 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session/Serialize/JSON.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Apache/Session/Serialize/JSON.pm @@ -1,12 +1,3 @@ -####################################################### -# -# Lemonldap::NG::Common::Apache::Session::Serialize::JSON -# Serializes session objects using JSON -# Copyright(c) 2015 Xavier Guimard (x.guimard@free.fr) -# Distribute under the GPL2 License -# -####################################################### - package Lemonldap::NG::Common::Apache::Session::Serialize::JSON; use strict; @@ -35,6 +26,8 @@ sub unserialize { =head1 NAME +=encoding utf8 + Lemonldap::NG::Common::Apache::Session::Serialize::JSON - Use JSON to zip up data =head1 SYNOPSIS @@ -50,11 +43,54 @@ This module fulfills the serialization interface of Apache::Session. It serializes the data in the session object by use of JSON C and C. The serialized data is UTF-8 text. -=head1 AUTHOR - -This module was written by Xavier Guimard using other -Apache::Session serializer written by Jeffrey William Baker . =head1 SEE ALSO L, L + +=head1 AUTHORS + +=over + +=item Clement Oudot, Eclem.oudot@gmail.comE + +=item François-Xavier Deltombe, Efxdeltombe@gmail.com.E + +=item Xavier Guimard, Ex.guimard@free.frE + +=item Thomas Chemineau, Ethomas.chemineau@gmail.comE + +=back + +=head1 BUG REPORT + +Use OW2 system to report bug or ask for features: +L + +=head1 DOWNLOAD + +Lemonldap::NG is available at +L + +=head1 COPYRIGHT AND LICENSE + +=over + +=item Copyright (C) 2015 by Xavier Guimard, Ex.guimard@free.frE + +=back + +This library is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see L. + +=cut diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm index b8a7a6409..e315bb517 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm @@ -10,7 +10,9 @@ package Lemonldap::NG::Common::Conf; use strict; no strict 'refs'; use Lemonldap::NG::Common::Conf::Constants; #inherits -use Lemonldap::NG::Common::Conf::Attributes; #inherits + +# TODO: don't import this big file, use a proxy +use Lemonldap::NG::Common::Conf::DefaultValues; #inherits use Lemonldap::NG::Common::Crypto ; #link protected cipher Object "cypher" in configuration hash use Config::IniFiles; @@ -20,7 +22,7 @@ use Config::IniFiles; #inherits Lemonldap::NG::Common::Conf::SOAP #inherits Lemonldap::NG::Common::Conf::LDAP -our $VERSION = '1.4.4'; +our $VERSION = '1.5.99'; our $msg = ''; our $iniObj; @@ -108,12 +110,12 @@ sub new { # @param $conf Lemonldap::NG configuration hashRef # @return Number of the saved configuration, 0 if case of error. sub saveConf { - my ( $self, $conf ) = @_; + my ( $self, $conf, %args ) = @_; my $last = $self->lastCfg; # If configuration was modified, return an error - if ( not $self->{force} ) { + if ( not $args{force} ) { return CONFIG_WAS_CHANGED if ( $conf->{cfgNum} != $last ); return DATABASE_LOCKED if ( $self->isLocked() or not $self->lock() ); } @@ -169,24 +171,31 @@ sub getConf { else { eval { $r = $self->{refLocalStorage}->get('conf') } if ($>); $msg = "Warn: $@" if ($@); - if ( ref($r) and $r->{cfgNum} == $args->{cfgNum} ) { + if ( ref($r) + and $r->{cfgNum} + and $args->{cfgNum} + and $r->{cfgNum} == $args->{cfgNum} ) + { $msg .= "Configuration unchanged, get configuration from cache.\n"; $args->{noCache} = 1; } else { $r = $self->getDBConf($args); - return undef unless ( ref($r) ); + return undef unless ( $r->{cfgNum} ); - # Adapt some values before storing in local cache - # Get default values - my $confAttributes = - Lemonldap::NG::Common::Conf::Attributes->new(); + # TODO: default values may not be set here + unless ( $args->{raw} ) { - my @attributes = $confAttributes->meta()->get_attribute_list(); + # Adapt some values before storing in local cache + # Get default values + my $defaultValues = + Lemonldap::NG::Common::Conf::DefaultValues + ->defaultValues(); - foreach my $name (@attributes) { - $r->{$name} //= $confAttributes->$name; + foreach my $k ( keys %$defaultValues ) { + $r->{$k} //= $defaultValues->{$k}; + } } # Convert old option useXForwardedForIP into trustedProxies @@ -211,15 +220,20 @@ sub getConf { # Store modified configuration in cache $self->setLocalConf($r) - if ( $self->{refLocalStorage} and not( $args->{noCache} ) ); + if ( $self->{refLocalStorage} + and not( $args->{noCache} or $args->{raw} ) ); } } # Create cipher object - eval { $r->{cipher} = Lemonldap::NG::Common::Crypto->new( $r->{key} ); }; - if ($@) { - $msg .= "Bad key: $@. \n"; + unless ( $args->{raw} ) { + eval { + $r->{cipher} = Lemonldap::NG::Common::Crypto->new( $r->{key} ); + }; + if ($@) { + $msg .= "Bad key: $@. \n"; + } } # Return configuration hash @@ -345,7 +359,8 @@ sub getDBConf { : $a[0]; } my $conf = $self->load( $args->{cfgNum} ); - $msg .= "Get configuration $conf->{cfgNum}.\n"; + $msg .= "Get configuration $conf->{cfgNum}.\n" + if ( defined $conf->{cfgNum} ); $self->setLocalConf($conf) if ( ref($conf) and $self->{refLocalStorage} @@ -418,7 +433,7 @@ sub load { sub delete { my ( $self, $c ) = @_; my @a = $self->available(); - return 0 unless ( grep {$_ eq $c} @a ); + return 0 unless ( grep { $_ eq $c } @a ); return &{ $self->{type} . '::delete' }( $self, $c ); } diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Attributes.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Attributes.pm deleted file mode 100644 index ea82aa8db..000000000 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Attributes.pm +++ /dev/null @@ -1,1655 +0,0 @@ -##@file -# All configuration attributes - -##@class -# All configuration attributes - -package Lemonldap::NG::Common::Conf::Attributes; - -use Mouse; - -our $VERSION = '2.0.0'; - -## A - -has 'activeTimer' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Enable timers on portal pages', -); - -has 'apacheAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '4', - documentation => 'Apache authentication level', -); - -has 'applicationList' => ( - is => 'rw', - isa => 'HashRef', - default => sub { - return { - 'default' => { catname => 'Default category', type => "category" }, - }; - }, - documentation => 'Applications list', -); - -has 'authChoiceParam' => ( - is => 'rw', - isa => 'Str', - default => 'lmAuth', - documentation => 'HTTP parameter to store choosen authentication method', -); - -has 'authentication' => ( - is => 'rw', - isa => 'Str', - default => 'Demo', - documentation => 'Authentication module', -); - -## B - -has 'browserIdAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'Browser ID authentication level', -); - -## C - -has 'captcha_login_enabled' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Captcha on login page', -); - -has 'captcha_mail_enabled' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Captcha on password reset page', -); - -has 'captcha_register_enabled' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Captcha on account creation page', -); - -has 'captcha_size' => ( - is => 'rw', - isa => 'Int', - default => '6', - documentation => 'Captcha size', -); - -has 'captchaStorage' => ( - is => 'rw', - isa => 'Str', - default => 'Apache::Session::File', - documentation => 'Captcha backend module', -); - -has 'captchaStorageOptions' => ( - is => 'rw', - isa => 'HashRef', - default => sub { - return { 'Directory' => '/var/lib/lemonldap-ng/captcha/', }; - }, - documentation => 'Captcha backend module options', -); - -has 'casAccessControlPolicy' => ( - is => 'rw', - isa => 'Str', - default => 'none', - documentation => 'CAS access control policy', -); - -has 'casAttributes' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'CAS Issuer exported attributes', -); - -has 'CAS_authnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'CAS authentication level', -); - -has 'CAS_pgtFile' => ( - is => 'rw', - isa => 'Str', - default => '/tmp/pgt.txt', - documentation => 'CAS PGT file', -); - -has 'cda' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Enable Cross Domain Authentication', -); - -has 'cfgNum' => ( - is => 'rw', - isa => 'Int', - default => '0', - documentation => 'Configuration number', -); - -has 'checkXSS' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Check XSS', -); - -has 'confirmFormMethod' => ( - is => 'rw', - isa => 'Str', - default => 'post', - documentation => 'HTTP method for confirm page form', -); - -has 'cookieName' => ( - is => 'rw', - isa => 'Str', - default => 'lemonldap', - documentation => 'Name of the cookie', -); - -## D - -has 'dbiAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '2', - documentation => 'DBI authentication level', -); - -has 'dbiExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'DBI exported variables', -); - -has 'demoExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return { cn => 'cn', mail => 'mail', uid => 'uid', }; }, - documentation => 'Demo exported variables', -); - -has 'domain' => ( - is => 'rw', - isa => 'Str', - default => 'example.com', - documentation => 'DNS domain', -); - -## E - -has 'exportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return { 'UA' => 'HTTP_USER_AGENT' }; }, - documentation => 'Main exported variables', -); - -## F - -has 'facebookAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'Facebook authentication level', -); - -has 'facebookExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'Facebook exported variables', -); - -has 'failedLoginNumber' => ( - is => 'rw', - isa => 'Int', - default => '5', - documentation => 'Number of failures stored in login history', -); - -## G - -has 'globalStorage' => ( - is => 'rw', - isa => 'Str', - default => 'Apache::Session::File', - documentation => 'Session backend module', -); - -has 'globalStorageOptions' => ( - is => 'rw', - isa => 'HashRef', - default => sub { - return { - 'Directory' => '/var/lib/lemonldap-ng/sessions/', - 'LockDirectory' => '/var/lib/lemonldap-ng/sessions/lock/', - 'generateModule' => - 'Lemonldap::NG::Common::Apache::Session::Generate::SHA256', - }; - }, - documentation => 'Session backend module options', -); - -has 'googleAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'Google authentication level', -); - -has 'googleExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'Google exported variables', -); - -has 'groups' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'Groups', -); - -## H - -has 'hiddenAttributes' => ( - is => 'rw', - isa => 'Str', - default => '_password', - documentation => 'Name of attributes to hide in logs', -); - -has 'hideOldPassword' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Hide old password in portal', -); - -has 'httpOnly' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Enable httpOnly flag in cookie', -); - -has 'https' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Use HTTPS for redirection from portal', -); - -## I - -has 'infoFormMethod' => ( - is => 'rw', - isa => 'Str', - default => 'get', - documentation => 'HTTP method for info page form', -); - -has 'issuerDBCASActivation' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'CAS server activation', -); - -has 'issuerDBCASPath' => ( - is => 'rw', - isa => 'Str', - default => '^/cas/', - documentation => 'CAS server request path', -); - -has 'issuerDBCASRule' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'CAS server rule', -); - -has 'issuerDBOpenIDActivation' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'OpenID server activation', -); - -has 'issuerDBOpenIDConnectActivation' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'OpenID Connect server activation', -); - -has 'issuerDBOpenIDConnectPath' => ( - is => 'rw', - isa => 'Str', - default => '^/oauth2/', - documentation => 'OpenID Connect server request path', -); - -has 'issuerDBOpenIDConnectRule' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'OpenID Connect server rule', -); - -has 'issuerDBOpenIDPath' => ( - is => 'rw', - isa => 'Str', - default => '^/openidserver/', - documentation => 'OpenID server request path', -); - -has 'issuerDBOpenIDRule' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'OpenID server rule', -); - -has 'issuerDBSAMLActivation' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'SAML IDP activation', -); - -has 'issuerDBSAMLPath' => ( - is => 'rw', - isa => 'Str', - default => '^/saml/', - documentation => 'SAML IDP request path', -); - -has 'issuerDBSAMLRule' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'SAML IDP rule', -); - -## J - -has 'jsRedirect' => ( - is => 'rw', - isa => 'Str', - default => '0', - documentation => 'Use javascript for redirections', -); - -## K - -has 'key' => ( - is => 'rw', - isa => 'Str', - default => sub { - return join( '', map { chr( int( rand(94) ) + 33 ) } ( 1 .. 16 ) ); - }, - documentation => 'Secret key', -); - -## L - -has 'ldapAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '2', - documentation => 'LDAP authentication level', -); - -has 'ldapBase' => ( - is => 'rw', - isa => 'Str', - default => 'dc=example,dc=com', - documentation => 'LDAP search base', -); - -has 'ldapExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return { cn => 'cn', mail => 'mail', uid => 'uid', }; }, - documentation => 'LDAP exported variables', -); - -has 'ldapGroupAttributeName' => ( - is => 'rw', - isa => 'Str', - default => 'member', - documentation => 'LDAP attribute name for member in groups', -); - -has 'ldapGroupAttributeNameGroup' => ( - is => 'rw', - isa => 'Str', - default => 'dn', - documentation => - 'LDAP attribute name in group entry referenced as member in groups', -); - -has 'ldapGroupAttributeNameSearch' => ( - is => 'rw', - isa => 'Str', - default => 'cn', - documentation => 'LDAP attributes to search in groups', -); - -has 'ldapGroupAttributeNameUser' => ( - is => 'rw', - isa => 'Str', - default => 'dn', - documentation => - 'LDAP attribute name in user entry referenced as member in groups', -); - -has 'ldapGroupObjectClass' => ( - is => 'rw', - isa => 'Str', - default => 'groupOfNames', - documentation => 'LDAP object class of groups', -); - -has 'ldapGroupRecursive' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'LDAP recursive search in groups', -); - -has 'ldapPasswordResetAttribute' => ( - is => 'rw', - isa => 'Str', - default => 'pwdReset', - documentation => 'LDAP password reset attribute', -); - -has 'ldapPasswordResetAttributeValue' => ( - is => 'rw', - isa => 'Str', - default => 'TRUE', - documentation => 'LDAP password reset value', -); - -has 'ldapPwdEnc' => ( - is => 'rw', - isa => 'Str', - default => 'utf-8', - documentation => 'LDAP password encoding', -); - -has 'ldapPort' => ( - is => 'rw', - isa => 'Int', - default => '389', - documentation => 'LDAP port', -); - -has 'ldapServer' => ( - is => 'rw', - isa => 'Str', - default => 'ldap://localhost', - documentation => 'LDAP server (host or URI)', -); - -has 'ldapTimeout' => ( - is => 'rw', - isa => 'Int', - default => '120', - documentation => 'LDAP connection timeout', -); - -has 'ldapUsePasswordResetAttribute' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'LDAP store reset flag in an attribute', -); - -has 'ldapVersion' => ( - is => 'rw', - isa => 'Int', - default => '3', - documentation => 'LDAP protocol version', -); - -has 'localSessionStorage' => ( - is => 'rw', - isa => 'Str', - default => 'Cache::FileCache', - documentation => 'Sessions cache module', -); - -has 'localSessionStorageOptions' => ( - is => 'rw', - isa => 'HashRef', - default => sub { - return { - 'namespace' => 'lemonldap-ng-sessions', - 'default_expires_in' => 600, - 'directory_umask' => '007', - 'cache_root' => '/tmp', - 'cache_depth' => 3, - }; - }, - documentation => 'Sessions cache module options', -); - -has 'loginHistoryEnabled' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Enable login history', -); - -has 'logoutServices' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'Send logout trough GET request to these services', -); - -## M - -has 'macros' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'Macros', -); - -has 'mailCharset' => ( - is => 'rw', - isa => 'Str', - default => 'utf-8', - documentation => 'Mail charset', -); - -has 'mailConfirmSubject' => ( - is => 'rw', - isa => 'Str', - default => '[LemonLDAP::NG] Password reset confirmation', - documentation => 'Mail subject for reset confirmation', -); - -has 'mailFrom' => ( - is => 'rw', - isa => 'Str', - default => sub { - my $self = shift; - my $domain = $self ? $self->domain : "example.com"; - return "noreply@" . $domain; - }, - lazy => 1, - documentation => 'Sender email', -); - -has 'mailOnPasswordChange' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Send a mail when password is changed', -); - -has 'mailSessionKey' => ( - is => 'rw', - isa => 'Str', - default => 'mail', - documentation => 'Session parameter where mail is stored', -); - -has 'mailSubject' => ( - is => 'rw', - isa => 'Str', - default => '[LemonLDAP::NG] Your new password', - documentation => 'Mail subject for new password email', -); - -has 'mailTimeout' => ( - is => 'rw', - isa => 'Int', - default => '0', - documentation => 'Mail session timeout', -); - -has 'mailUrl' => ( - is => 'rw', - isa => 'Str', - default => sub { - my $self = shift; - my $portal = $self ? $self->portal : "http://auth.example.com/"; - return $portal . "mail.pl"; - }, - lazy => 1, - documentation => 'URL of password reset page', -); - -has 'maintenance' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Maintenance mode for all virtual hosts', -); - -has 'managerDn' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'LDAP manager DN', -); - -has 'managerPassword' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'LDAP manager Password', -); - -has 'multiValuesSeparator' => ( - is => 'rw', - isa => 'Str', - default => '; ', - documentation => 'Separator for multiple values', -); - -## N - -has 'notification' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Notification activation', -); - -has 'notificationStorage' => ( - is => 'rw', - isa => 'Str', - default => 'File', - documentation => 'Notification backend', -); - -has 'notificationStorageOptions' => ( - is => 'rw', - isa => 'HashRef', - default => - sub { return { dirName => '/var/lib/lemonldap-ng/notifications', }; }, - documentation => 'Notification backend options', -); - -has 'notificationWildcard' => ( - is => 'rw', - isa => 'Str', - default => 'allusers', - documentation => 'Notification string to match all users', -); - -has 'notifyDeleted' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Show deleted sessions in portal', -); - -has 'notifyOther' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Show other sessions in portal', -); - -has 'nullAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '2', - documentation => 'Null authentication level', -); - -## O - -has 'oidcAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'OpenID Connect authentication level', -); - -has 'oidcRPCallbackGetParam' => ( - is => 'rw', - isa => 'Str', - default => 'openidconnectcallback', - documentation => 'OpenID Connect Callback GET URLparameter', -); - -has 'oidcRPStateTimeout' => ( - is => 'rw', - isa => 'Int', - default => '600', - documentation => 'OpenID Connect Timeout of state sessions', -); - -has 'oidcServiceMetaDataAuthnContext' => ( - is => 'rw', - isa => 'HashRef', - default => sub { - return { - 'loa-1' => 1, - 'loa-2' => 2, - 'loa-3' => 3, - 'loa-4' => 4, - 'loa-5' => 5 - }; - }, - documentation => 'OpenID Connect Authentication Context Class Ref', -); - -has 'oidcServiceMetaDataAuthorizeURI' => ( - is => 'rw', - isa => 'Str', - default => 'authorize', - documentation => 'OpenID Connect authorizaton endpoint', -); - -has 'oidcServiceMetaDataEndSessionURI' => ( - is => 'rw', - isa => 'Str', - default => 'logout', - documentation => 'OpenID Connect end session endpoint', -); - -has 'oidcServiceMetaDataIssuer' => ( - is => 'rw', - isa => 'Str', - default => sub { - my $self = shift; - my $portal = $self ? $self->portal : "http://auth.example.com/"; - return $portal; - }, - lazy => 1, - documentation => 'URL of OpenID Connect Issuer', -); - -has 'oidcServiceMetaDataJWKSURI' => ( - is => 'rw', - isa => 'Str', - default => 'jwks', - documentation => 'OpenID Connect JWKS endpoint', -); - -has 'oidcServiceMetaDataRegistrationURI' => ( - is => 'rw', - isa => 'Str', - default => 'register', - documentation => 'OpenID Connect registration endpoint', -); - -has 'oidcServiceMetaDataTokenURI' => ( - is => 'rw', - isa => 'Str', - default => 'token', - documentation => 'OpenID Connect token endpoint', -); - -has 'oidcServiceMetaDataUserInfoURI' => ( - is => 'rw', - isa => 'Str', - default => 'userinfo', - documentation => 'OpenID Connect user info endpoint', -); - -has 'openIdAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'OpenID authentication level', -); - -has 'openIdExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'OpenID exported variables', -); - -has 'openIdSreg_email' => ( - is => 'rw', - isa => 'Str', - default => 'mail', - documentation => 'OpenID SREG email session parameter', -); - -has 'openIdSreg_fullname' => ( - is => 'rw', - isa => 'Str', - default => 'cn', - documentation => 'OpenID SREG fullname session parameter', -); - -has 'openIdSreg_nickname' => ( - is => 'rw', - isa => 'Str', - default => 'uid', - documentation => 'OpenID SREG nickname session parameter', -); - -has 'openIdSreg_timezone' => ( - is => 'rw', - isa => 'Str', - default => '_timezone', - documentation => 'OpenID SREG timezone session parameter', -); - -## P - -has 'passwordDB' => ( - is => 'rw', - isa => 'Str', - default => 'Demo', - documentation => 'Password module', -); - -has 'portal' => ( - is => 'rw', - isa => 'Any', - default => 'http://auth.example.com/', - documentation => 'Portal URL', -); - -has 'portalAntiFrame' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Avoid portal to be displayed inside frames', -); - -has 'portalAutocomplete' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Allow autocompletion of login input in portal', -); - -has 'portalCheckLogins' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Display login history checkbox in portal', -); - -has 'portalDisplayAppslist' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'Display applications tab in portal', -); - -has 'portalDisplayChangePassword' => ( - is => 'rw', - isa => 'Str', - default => '$_auth =~ /^(LDAP|DBI|Demo)$/', - documentation => 'Display password tab in portal', -); - -has 'portalDisplayLoginHistory' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'Display login history tab in portal', -); - -has 'portalDisplayLogout' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'Display logout tab in portal', -); - -has 'portalDisplayRegister' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'Display register button in portal', -); - -has 'portalDisplayResetPassword' => ( - is => 'rw', - isa => 'Str', - default => '1', - documentation => 'Display reset password button in portal', -); - -has 'portalForceAuthn' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Force to authenticate when displaying portal', -); - -has 'portalForceAuthnInterval' => ( - is => 'rw', - isa => 'Int', - default => '0', - documentation => -'Minimum number of seconds since last authentifcation to force reauthentication', -); - -has 'portalOpenLinkInNewWindow' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Open applications in new windows', -); - -has 'portalPingInterval' => ( - is => 'rw', - isa => 'Int', - default => '60000', - documentation => 'Interval in ms between portal Ajax pings ', -); - -has 'portalRequireOldPassword' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Old password is required to change the password', -); - -has 'portalSkin' => ( - is => 'rw', - isa => 'Str', - default => 'bootstrap', - documentation => 'Name of portal skin', -); - -has 'portalSkinBackground' => ( - is => 'rw', - isa => 'Str|Undef', - default => undef, - documentation => 'Skin image background', -); - -has 'portalUserAttr' => ( - is => 'rw', - isa => 'Str', - default => '_user', - documentation => 'Session parameter to display connected user in portal', -); - -has 'protection' => ( - is => 'rw', - isa => 'Str', - default => 'none', - documentation => 'Manager protection method', -); - -## Q - -## R - -has 'radiusAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '3', - documentation => 'Radius authentication level', -); - -has 'randomPasswordRegexp' => ( - is => 'rw', - isa => 'Str', - default => '[A-Z]{3}[a-z]{5}.\d{2}', - documentation => 'Regular expression to create a random password', -); - -has 'redirectFormMethod' => ( - is => 'rw', - isa => 'Str', - default => 'get', - documentation => 'HTTP method for redirect page form', -); - -has 'registerConfirmSubject' => ( - is => 'rw', - isa => 'Str', - default => '[LemonLDAP::NG] Account register confirmation', - documentation => 'Mail subject for register confirmation', -); - -has 'registerDB' => ( - is => 'rw', - isa => 'Str', - default => 'Demo', - documentation => 'Register module', -); - -has 'registerDoneSubject' => ( - is => 'rw', - isa => 'Str', - default => '[LemonLDAP::NG] Your new account', - documentation => 'Mail subject when register is done', -); - -has 'registerTimeout' => ( - is => 'rw', - isa => 'Int', - default => '0', - documentation => 'Register session timeout', -); - -has 'registerUrl' => ( - is => 'rw', - isa => 'Str', - default => sub { - my $self = shift; - my $portal = $self ? $self->portal : "http://auth.example.com/"; - return $portal . "register.pl"; - }, - lazy => 1, - documentation => 'URL of register page', -); - -has 'remoteGlobalStorage' => ( - is => 'rw', - isa => 'Str', - default => 'Lemonldap::NG::Common::Apache::Session::SOAP', - documentation => 'Remote session backend', -); - -has 'remoteGlobalStorageOptions' => ( - is => 'rw', - isa => 'HashRef', - default => sub { - my $self = shift; - my $portal = $self ? $self->portal : "http://auth.example.com/"; - return { - 'proxy' => $portal . 'index.pl/sessions', - 'ns' => $portal . 'Lemonldap/NG/Common/CGI/SOAPService', - }; - }, - lazy => 1, - documentation => 'Demo exported variables', -); - -## S - -has 'samlAttributeAuthorityDescriptorAttributeServiceSOAP' => ( - is => 'rw', - isa => 'Str', - default => - 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;', - documentation => 'SAML Attribute Authority SOAP', -); - -has 'samlAuthnContextMapKerberos' => ( - is => 'rw', - isa => 'Int', - default => '4', - documentation => 'SAML authn context kerberos level', -); - -has 'samlAuthnContextMapPassword' => ( - is => 'rw', - isa => 'Int', - default => '2', - documentation => 'SAML authn context password level', -); - -has 'samlAuthnContextMapPasswordProtectedTransport' => ( - is => 'rw', - isa => 'Int', - default => '3', - documentation => 'SAML authn context password protected transport level', -); - -has 'samlAuthnContextMapTLSClient' => ( - is => 'rw', - isa => 'Int', - default => '5', - documentation => 'SAML authn context TLS client level', -); - -has 'samlCommonDomainCookieActivation' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'SAML CDC activation', -); - -has 'samlEntityID' => ( - is => 'rw', - isa => 'Str', - default => '#PORTAL#/saml/metadata', - documentation => 'SAML service entityID', -); - -has 'samlIdPResolveCookie' => ( - is => 'rw', - isa => 'Str', - default => sub { - my $self = shift; - my $cookieName = $self ? $self->cookieName : "lemonldap"; - return $cookieName . "idp"; - }, - lazy => 1, - documentation => 'SAML IDP resolution cookie', -); - -has 'samlIDPSSODescriptorArtifactResolutionServiceArtifact' => ( - is => 'rw', - isa => 'Str', - default => - '1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact', - documentation => 'SAML IDP artifact resolution service', -); - -has 'samlIDPSSODescriptorSingleLogoutServiceHTTPPost' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn', - documentation => 'SAML IDP SLO HTTP POST', -); - -has 'samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn', - documentation => 'SAML IDP SLO HTTP Redirect', -); - -has 'samlIDPSSODescriptorSingleLogoutServiceSOAP' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;', - documentation => 'SAML IDP SLO SOAP', -); - -has 'samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;', - documentation => 'SAML IDP SSO HTTP Artifact', -); - -has 'samlIDPSSODescriptorSingleSignOnServiceHTTPPost' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;', - documentation => 'SAML IDP SSO HTTP POST', -); - -has 'samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;', - documentation => 'SAML IDP SSO HTTP Redirect', -); - -has 'samlIDPSSODescriptorSingleSignOnServiceSOAP' => ( - is => 'rw', - isa => 'Str', - default => -'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleSignOnSOAP;', - documentation => 'SAML IDP SSO SOAP', -); - -has 'samlIDPSSODescriptorWantAuthnRequestsSigned' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'SAML IDP want authn request signed', -); - -has 'samlMetadataForceUTF8' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'SAML force metadata UTF8 conversion', -); - -has 'samlNameIDFormatMapEmail' => ( - is => 'rw', - isa => 'Str', - default => 'mail', - documentation => 'SAML session parameter for NameID email', -); - -has 'samlNameIDFormatMapKerberos' => ( - is => 'rw', - isa => 'Str', - default => 'uid', - documentation => 'SAML session parameter for NameID kerberos', -); - -has 'samlNameIDFormatMapWindows' => ( - is => 'rw', - isa => 'Str', - default => 'uid', - documentation => 'SAML session parameter for NameID windows', -); - -has 'samlNameIDFormatMapX509' => ( - is => 'rw', - isa => 'Str', - default => 'mail', - documentation => 'SAML session parameter for NameID x509', -); -has 'samlOrganizationDisplayName' => ( - is => 'rw', - isa => 'Str', - default => 'Example', - documentation => 'SAML service organization display name', -); - -has 'samlOrganizationName' => ( - is => 'rw', - isa => 'Str', - default => 'Example', - documentation => 'SAML service organization name', -); - -has 'samlOrganizationURL' => ( - is => 'rw', - isa => 'Str', - default => 'http://www.example.com', - documentation => 'SAML service organization URL', -); - -has 'samlRelayStateTimeout' => ( - is => 'rw', - isa => 'Int', - default => '600', - documentation => 'SAML timeout of relay state', -); - -has 'samlSPSSODescriptorArtifactResolutionServiceArtifact' => ( - is => 'rw', - isa => 'Str', - default => - '1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact', - documentation => 'SAML SP artifact resolution service ', -); - -has 'samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact' => ( - is => 'rw', - isa => 'Str', - default => -'1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact', - documentation => 'SAML SP ACS HTTP artifact', -); - -has 'samlSPSSODescriptorAssertionConsumerServiceHTTPPost' => ( - is => 'rw', - isa => 'Str', - default => -'0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost', - documentation => 'SAML SP ACS HTTP POST', -); - -has 'samlSPSSODescriptorAuthnRequestsSigned' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'SAML SP AuthnRequestsSigned', -); - -has 'samlSPSSODescriptorSingleLogoutServiceHTTPPost' => ( - is => 'rw', - isa => 'Str', - default => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;' - . '#PORTAL#' - . '/saml/proxySingleLogout;' - . '#PORTAL#' - . '/saml/proxySingleLogoutReturn', - documentation => 'SAML SP SLO HTTP POST', -); - -has 'samlSPSSODescriptorSingleLogoutServiceHTTPRedirect' => ( - is => 'rw', - isa => 'Str', - default => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;' - . '#PORTAL#' - . '/saml/proxySingleLogout;' - . '#PORTAL#' - . '/saml/proxySingleLogoutReturn', - documentation => 'SAML SP SLO HTTP Redirect', -); - -has 'samlSPSSODescriptorSingleLogoutServiceSOAP' => ( - is => 'rw', - isa => 'Str', - default => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;' - . '#PORTAL#' - . '/saml/proxySingleLogoutSOAP;', - documentation => 'SAML SP SLO SOAP', -); - -has 'samlSPSSODescriptorWantAssertionsSigned' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'SAML SP WantAssertionsSigned', -); - -has 'samlServicePrivateKeyEnc' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SAML encryption private key', -); - -has 'samlServicePrivateKeyEncPwd' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SAML encryption private key password', -); - -has 'samlServicePrivateKeySig' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SAML signature private key', -); - -has 'samlServicePrivateKeySigPwd' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SAML signature private key password', -); - -has 'samlServicePublicKeyEnc' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SAML encryption public key', -); - -has 'samlServicePublicKeySig' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SAML signature public key', -); - -has 'samlUseQueryStringSpecific' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'SAML use specific method for query_string', -); - -has 'securedCookie' => ( - is => 'rw', - isa => 'Int', - default => '0', - documentation => 'Cookie securisation method', -); - -has 'secureTokenAllowOnError' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Secure Token Handler allow request on error', -); - -has 'secureTokenAttribute' => ( - is => 'rw', - isa => 'Str', - default => 'uid', - documentation => 'Secure Token Handler attribute to store', -); - -has 'secureTokenExpiration' => ( - is => 'rw', - isa => 'Int', - default => '60', - documentation => 'Secure Token Handler token expiration', -); - -has 'secureTokenHeader' => ( - is => 'rw', - isa => 'Str', - default => 'Auth-Token', - documentation => 'Secure Token Handler header name', -); - -has 'secureTokenMemcachedServers' => ( - is => 'rw', - isa => 'Str', - default => '127.0.0.1:11211', - documentation => 'Secure Token Handler memcached servers', -); - -has 'secureTokenUrls' => ( - is => 'rw', - isa => 'Str', - default => '.*', - documentation => - 'Secure Token Handler regular expression to match protected URL', -); - -has 'singleIP' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Allow only one session per IP', -); - -has 'singleSession' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Allow only one session per user', -); - -has 'singleSessionUserByIP' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Allow only one session per user on an IP', -); - -has 'slaveAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '2', - documentation => 'Slave authentication level', -); - -has 'slaveExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'Slave exported variables', -); - -has 'SMTPServer' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'SMTP Server', -); - -has 'Soap' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Enable SOAP services', -); - -has 'storePassword' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Store password in session', -); - -has 'SSLAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '5', - documentation => 'SSL authentication level', -); - -has 'successLoginNumber' => ( - is => 'rw', - isa => 'Int', - default => '5', - documentation => 'Number of success stored in login history', -); - -has 'syslog' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'Syslog facility', -); - -## T - -has 'timeout' => ( - is => 'rw', - isa => 'Int', - default => '72000', - documentation => 'Session timeout on server side', -); - -has 'timeoutActivity' => ( - is => 'rw', - isa => 'Int', - default => '0', - documentation => 'Session activity timeout on server side', -); - -has 'trustedProxies' => ( - is => 'rw', - isa => 'Str', - default => '', - documentation => 'Trusted proxies', -); - -has 'twitterAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'Twitter authentication level', -); - -## U - -has 'userControl' => ( - is => 'rw', - isa => 'Str', - default => '^[\w\.\-@]+$', - documentation => 'Regular expression to validate login', -); - -has 'userDB' => ( - is => 'rw', - isa => 'Str', - default => 'Demo', - documentation => 'User module', -); - -has 'useRedirectOnError' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Use 302 redirect code for error (500)', -); - -has 'useRedirectOnForbidden' => ( - is => 'rw', - isa => 'Bool', - default => '0', - documentation => 'Use 302 redirect code for forbidden (403)', -); - -has 'useSafeJail' => ( - is => 'rw', - isa => 'Bool', - default => '1', - documentation => 'Activate Safe jail', -); - -## V - -## W - -has 'webIDAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '1', - documentation => 'WebID authentication level', -); - -has 'webIDExportedVars' => ( - is => 'rw', - isa => 'HashRef', - default => sub { return {}; }, - documentation => 'WebID exported variables', -); - -has 'whatToTrace' => ( - is => 'rw', - isa => 'Str', - default => 'uid', - documentation => 'Session parameter used to fill REMOTE_USER', -); - -## X - -## Y - -has 'yubikeyAuthnLevel' => ( - is => 'rw', - isa => 'Int', - default => '3', - documentation => 'Yubikey authentication level', -); - -has 'yubikeyPublicIDSize' => ( - is => 'rw', - isa => 'Int', - default => '12', - documentation => 'Yubikey public ID size', -); - -## Z - -no Mouse; - -1; diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm new file mode 100644 index 000000000..2895c5b20 --- /dev/null +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm @@ -0,0 +1,315 @@ +# This file is generated by scripts/jsongenerator.pl. Don't modify it by hand +package Lemonldap::NG::Common::Conf::DefaultValues; + +our $VERSION = '1.5.99'; + +sub defaultValues { + return { + 'activeTimer' => 1, + 'apacheAuthnLevel' => 4, + 'applicationList' => { + 'default' => { + 'catname' => 'Default category', + 'type' => 'category' + } + }, + 'authentication' => 'Demo', + 'browserIdAuthnLevel' => 1, + 'captcha_login_enabled' => 0, + 'captcha_mail_enabled' => 0, + 'captcha_register_enabled' => 1, + 'captcha_size' => 6, + 'captchaStorage' => 'Apache::Session::File', + 'captchaStorageOptions' => { + 'Directory' => '/var/lib/lemonldap-ng/captcha/' + }, + 'CAS_authnLevel' => 1, + 'CAS_pgtFile' => '/tmp/pgt.txt', + 'casAccessControlPolicy' => 'none', + 'cda' => 0, + 'cfgNum' => 0, + 'checkXSS' => 1, + 'confirmFormMethod' => 'post', + 'cookieName' => 'lemonldap', + 'dbiAuthnLevel' => 2, + 'dbiExportedVars' => {}, + 'demoExportedVars' => { + 'cn' => 'cn', + 'mail' => 'mail', + 'uid' => 'uid' + }, + 'domain' => 'example.com', + 'exportedVars' => { + 'UA' => 'HTTP_USER_AGENT' + }, + 'facebookAuthnLevel' => 1, + 'facebookExportedVars' => {}, + 'failedLoginNumber' => 5, + 'globalStorage' => 'Apache::Session::File', + 'globalStorageOptions' => { + 'Directory' => '/var/lib/lemonldap-ng/sessions/', + 'generateModule' => + 'Lemonldap::NG::Common::Apache::Session::Generate::SHA256', + 'LockDirectory' => '/var/lib/lemonldap-ng/sessions/lock/' + }, + 'googleAuthnLevel' => 1, + 'googleExportedVars' => {}, + 'groups' => {}, + 'hiddenAttributes' => '_password', + 'hideOldPassword' => 0, + 'httpOnly' => 1, + 'https' => 0, + 'infoFormMethod' => 'get', + 'issuerDBCASActivation' => 0, + 'issuerDBCASPath' => '^/cas/', + 'issuerDBCASRule' => 1, + 'issuerDBOpenIDActivation' => 0, + 'issuerDBOpenIDConnectActivation' => '0', + 'issuerDBOpenIDConnectPath' => '^/oauth2/', + 'issuerDBOpenIDConnectRule' => 1, + 'issuerDBOpenIDPath' => '^/openidserver/', + 'issuerDBOpenIDRule' => 1, + 'issuerDBSAMLActivation' => 0, + 'issuerDBSAMLPath' => '^/saml/', + 'issuerDBSAMLRule' => 1, + 'jsRedirect' => 0, + 'ldapAuthnLevel' => 2, + 'ldapBase' => 'dc=example,dc=com', + 'ldapChangePasswordAsUser' => 0, + 'ldapExportedVars' => { + 'cn' => 'cn', + 'mail' => 'mail', + 'uid' => 'uid' + }, + 'ldapGroupAttributeName' => 'member', + 'ldapGroupAttributeNameGroup' => 'dn', + 'ldapGroupAttributeNameSearch' => 'cn', + 'ldapGroupAttributeNameUser' => 'dn', + 'ldapGroupObjectClass' => 'groupOfNames', + 'ldapGroupRecursive' => 0, + 'ldapPasswordResetAttribute' => 'pwdReset', + 'ldapPasswordResetAttributeValue' => 'TRUE', + 'ldapPort' => 389, + 'ldapPpolicyControl' => 0, + 'ldapPwdEnc' => 'utf-8', + 'ldapServer' => 'ldap://localhost', + 'ldapSetPassword' => 0, + 'ldapTimeout' => 120, + 'ldapUsePasswordResetAttribute' => 1, + 'ldapVersion' => 3, + 'localSessionStorage' => 'Cache::FileCache', + 'localSessionStorageOptions' => { + 'cache_depth' => 3, + 'cache_root' => '/tmp', + 'default_expires_in' => 600, + 'directory_umask' => '007', + 'namespace' => 'lemonldap-ng-sessions' + }, + 'locationRules' => { + 'default' => 'deny' + }, + 'loginHistoryEnabled' => 1, + 'logoutServices' => {}, + 'macros' => {}, + 'mailCharset' => 'utf-8', + 'mailConfirmSubject' => '[LemonLDAP::NG] Password reset confirmation', + 'mailFrom' => 'noreply@example.com', + 'mailOnPasswordChange' => 0, + 'mailSessionKey' => 'mail', + 'mailSubject' => '[LemonLDAP::NG] Your new password', + 'mailTimeout' => 0, + 'mailUrl' => 'http://auth.example.com/mail.pl', + 'maintenance' => 0, + 'managerDn' => '', + 'managerPassword' => '', + 'multiValuesSeparator' => '; ', + 'notification' => 0, + 'notificationStorage' => 'File', + 'notificationStorageOptions' => { + 'dirName' => '/var/lib/lemonldap-ng/notifications' + }, + 'notificationWildcard' => 'allusers', + 'notifyDeleted' => 1, + 'notifyOther' => 0, + 'nullAuthnLevel' => 2, + 'oidcAuthnLevel' => 1, + 'oidcRPCallbackGetParam' => 'openidconnectcallback', + 'oidcRPStateTimeout' => 600, + 'oidcServiceMetaDataAuthnContext' => { + 'loa-1' => 1, + 'loa-2' => 2, + 'loa-3' => 3, + 'loa-4' => 4, + 'loa-5' => 5 + }, + 'oidcServiceMetaDataAuthorizeURI' => 'authorize', + 'oidcServiceMetaDataEndSessionURI' => 'logout', + 'oidcServiceMetaDataJWKSURI' => 'jwks', + 'oidcServiceMetaDataRegistrationURI' => 'register', + 'oidcServiceMetaDataTokenURI' => 'token', + 'oidcServiceMetaDataUserInfoURI' => 'userinfo', + 'openIdAuthnLevel' => 1, + 'openIdExportedVars' => {}, + 'openIdIDPList' => '0;', + 'openIdSPList' => '0;', + 'openIdSreg_email' => 'mail', + 'openIdSreg_fullname' => 'cn', + 'openIdSreg_nickname' => 'uid', + 'openIdSreg_timezone' => '_timezone', + 'passwordDB' => 'Demo', + 'portal' => 'http://auth.example.com/', + 'portalAntiFrame' => 1, + 'portalAutocomplete' => 0, + 'portalCheckLogins' => 1, + 'portalDisplayAppslist' => 1, + 'portalDisplayChangePassword' => '$_auth =~ /^(LDAP|DBI|Demo)$/', + 'portalDisplayLoginHistory' => 1, + 'portalDisplayLogout' => 1, + 'portalDisplayRegister' => 1, + 'portalDisplayResetPassword' => 1, + 'portalForceAuthn' => 0, + 'portalForceAuthnInterval' => 0, + 'portalOpenLinkInNewWindow' => 0, + 'portalPingInterval' => 60000, + 'portalRequireOldPassword' => 1, + 'portalSkin' => 'bootstrap', + 'portalUserAttr' => '_user', + 'protection' => 'none', + 'radiusAuthnLevel' => 3, + 'randomPasswordRegexp' => '[A-Z]{3}[a-z]{5}.\\d{2}', + 'redirectFormMethod' => 'get', + 'registerConfirmSubject' => + '[LemonLDAP::NG] Account register confirmation', + 'registerDB' => 'Demo', + 'registerDoneSubject' => '[LemonLDAP::NG] Your new account', + 'registerTimeout' => 0, + 'registerUrl' => 'http://auth.example.com/register.pl', + 'remoteGlobalStorage' => 'Lemonldap::NG::Common::Apache::Session::SOAP', + 'remoteGlobalStorageOptions' => { + 'ns' => + 'http://auth.example.com/Lemonldap/NG/Common/CGI/SOAPService', + 'proxy' => 'http://auth.example.com/index.pl/sessions' + }, + 'samlAttributeAuthorityDescriptorAttributeServiceSOAP' => + 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;', + 'samlAuthnContextMapKerberos' => 4, + 'samlAuthnContextMapPassword' => 2, + 'samlAuthnContextMapPasswordProtectedTransport' => 3, + 'samlAuthnContextMapTLSClient' => 5, + 'samlCommonDomainCookieActivation' => 0, + 'samlEntityID' => '#PORTAL#/saml/metadata', + 'samlIDPMetaDataExportedAttributes' => ';;;', + 'samlIDPMetaDataOptionsAdaptSessionUtime' => 0, + 'samlIDPMetaDataOptionsAllowLoginFromIDP' => 0, + 'samlIDPMetaDataOptionsAllowProxiedAuthn' => 0, + 'samlIDPMetaDataOptionsCheckConditions' => 0, + 'samlIDPMetaDataOptionsCheckSLOMessageSignature' => 0, + 'samlIDPMetaDataOptionsCheckSSOMessageSignature' => 0, + 'samlIDPMetaDataOptionsEncryptionMode' => 'none', + 'samlIDPMetaDataOptionsForceAuthn' => 0, + 'samlIDPMetaDataOptionsForceUTF8' => 0, + 'samlIDPMetaDataOptionsIsPassive' => 0, + 'samlIDPMetaDataOptionsNameIDFormat' => '', + 'samlIDPMetaDataOptionsRequestedAuthnContext' => '', + 'samlIDPMetaDataOptionsSignSLOMessage' => -1, + 'samlIDPMetaDataOptionsSignSSOMessage' => -1, + 'samlIDPMetaDataOptionsSSOBinding' => '', + 'samlIdPResolveCookie' => 'lemonldapidp', + 'samlIDPSSODescriptorArtifactResolutionServiceArtifact' => +'1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact', + 'samlIDPSSODescriptorSingleLogoutServiceHTTPPost' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn', + 'samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn', + 'samlIDPSSODescriptorSingleLogoutServiceSOAP' => +'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;', + 'samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;', + 'samlIDPSSODescriptorSingleSignOnServiceHTTPPost' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;', + 'samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;', + 'samlIDPSSODescriptorSingleSignOnServiceSOAP' => +'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleSignOnSOAP;', + 'samlIDPSSODescriptorWantAuthnRequestsSigned' => 1, + 'samlMetadataForceUTF8' => 1, + 'samlNameIDFormatMapEmail' => 'mail', + 'samlNameIDFormatMapKerberos' => 'uid', + 'samlNameIDFormatMapWindows' => 'uid', + 'samlNameIDFormatMapX509' => 'mail', + 'samlOrganizationDisplayName' => 'Example', + 'samlOrganizationName' => 'Example', + 'samlOrganizationURL' => 'http://www.example.com', + 'samlRelayStateTimeout' => 600, + 'samlServicePrivateKeyEnc' => '', + 'samlServicePrivateKeySig' => '', + 'samlServicePrivateKeySigPwd' => '', + 'samlServicePublicKeyEnc' => '', + 'samlServicePublicKeySig' => '', + 'samlSPMetaDataExportedAttributes' => ';;;', + 'samlSPMetaDataOptionsCheckSLOMessageSignature' => 0, + 'samlSPMetaDataOptionsCheckSSOMessageSignature' => 0, + 'samlSPMetaDataOptionsEnableIDPInitiatedURL' => 0, + 'samlSPMetaDataOptionsEncryptionMode' => 'none', + 'samlSPMetaDataOptionsNameIDFormat' => '', + 'samlSPMetaDataOptionsNotOnOrAfterTimeout' => 72000, + 'samlSPMetaDataOptionsOneTimeUse' => 0, + 'samlSPMetaDataOptionsSessionNotOnOrAfterTimeout' => 72000, + 'samlSPMetaDataOptionsSignSLOMessage' => -1, + 'samlSPMetaDataOptionsSignSSOMessage' => -1, + 'samlSPSSODescriptorArtifactResolutionServiceArtifact' => +'1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact', + 'samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact' => +'1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact', + 'samlSPSSODescriptorAssertionConsumerServiceHTTPPost' => +'0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost', + 'samlSPSSODescriptorAuthnRequestsSigned' => 1, + 'samlSPSSODescriptorSingleLogoutServiceHTTPPost' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn', + 'samlSPSSODescriptorSingleLogoutServiceHTTPRedirect' => +'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn', + 'samlSPSSODescriptorSingleLogoutServiceSOAP' => +'urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;', + 'samlSPSSODescriptorWantAssertionsSigned' => 1, + 'samlUseQueryStringSpecific' => 0, + 'securedCookie' => 0, + 'secureTokenAllowOnError' => 1, + 'secureTokenAttribute' => 'uid', + 'secureTokenExpiration' => 60, + 'secureTokenHeader' => 'Auth-Token', + 'secureTokenMemcachedServers' => '127.0.0.1:11211', + 'secureTokenUrls' => '.*', + 'singleIP' => 0, + 'singleSession' => 0, + 'singleSessionUserByIP' => 0, + 'singleUserByIP' => 0, + 'slaveAuthnLevel' => 2, + 'slaveExportedVars' => {}, + 'SMTPServer' => '', + 'Soap' => 0, + 'SSLAuthnLevel' => 5, + 'storePassword' => 0, + 'successLoginNumber' => 5, + 'syslog' => '', + 'timeout' => 72000, + 'timeoutActivity' => 0, + 'trustedProxies' => '', + 'twitterAuthnLevel' => 1, + 'userControl' => '^[\\w\\.\\-@]+$', + 'userDB' => 'Demo', + 'useRedirectOnError' => 1, + 'useRedirectOnForbidden' => 0, + 'useSafeJail' => 1, + 'vhostHttps' => -1, + 'vhostMaintenance' => 0, + 'vhostPort' => -1, + 'webIDAuthnLevel' => 1, + 'webIDExportedVars' => {}, + 'whatToTrace' => 'uid', + 'yubikeyAuthnLevel' => 3, + 'yubikeyPublicIDSize' => 12, + 'zimbraBy' => '' + }; +} + +1; diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/File.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/File.pm index a621ef308..888e2a602 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/File.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/File.pm @@ -2,12 +2,30 @@ package Lemonldap::NG::Common::Conf::File; use strict; use Lemonldap::NG::Common::Conf::Constants; #inherits -use Lemonldap::NG::Common::Conf::Serializer; our $VERSION = '1.4.0'; +our $initDone; + +sub Lemonldap::NG::Common::Conf::_lock { + my ( $self, $cfgNum ) = splice @_; + return "$self->{dirName}/lmConf.lock"; +} + +sub Lemonldap::NG::Common::Conf::_file { + my ( $self, $cfgNum ) = splice @_; + return "$self->{dirName}/lmConf-$cfgNum.js"; +} sub prereq { my $self = shift; + unless ($initDone) { + eval "use JSON"; + if ($@) { + $Lemonldap::NG::Common::Conf::msg .= "Unable to load JSON: $@\n"; + return 0; + } + $initDone++; + } unless ( $self->{dirName} ) { $Lemonldap::NG::Common::Conf::msg .= '"dirName" is required in "File" configuration type ! \n'; @@ -26,7 +44,9 @@ sub available { opendir D, $self->{dirName}; my @conf = readdir(D); closedir D; - @conf = sort { $a <=> $b } map { /lmConf-(\d+)/ ? $1 : () } @conf; + @conf = + sort { $a <=> $b } + map { /lmConf-(\d+)(?:\.js)?/ ? ( $1 + 0 ) : () } @conf; return @conf; } @@ -42,9 +62,9 @@ sub lock { sleep 2; return 0 if ( $self->isLocked ); } - unless ( open F, ">" . $self->{dirName} . "/lmConf.lock" ) { + unless ( open F, ">" . $self->_lock ) { $Lemonldap::NG::Common::Conf::msg .= - "Unable to lock (" . $self->{dirName} . "/lmConf.lock) \n"; + "Unable to lock (" . $self->_lock . ") \n"; return 0; } print F $$; @@ -54,30 +74,25 @@ sub lock { sub isLocked { my $self = shift; - -e $self->{dirName} . "/lmConf.lock"; + -e $self->_lock; } sub unlock { my $self = shift; - unlink $self->{dirName} . "/lmConf.lock"; + unlink $self->_lock; 1; } sub store { my ( $self, $fields ) = @_; - $fields = $self->serialize($fields); my $mask = umask; umask( oct('0027') ); - unless ( open FILE, - '>' . $self->{dirName} . "/lmConf-" . $fields->{cfgNum} ) - { + unless ( open FILE, ">" . $self->_file( $fields->{cfgNum} ) ) { $Lemonldap::NG::Common::Conf::msg .= "Open file failed: $! \n"; $self->unlock; return UNKNOWN_ERROR; } - foreach my $k ( sort keys %$fields ) { - print FILE "$k\n\t$fields->{$k}\n\n"; - } + print FILE JSON->new->canonical(1)->encode($fields); close FILE; umask($mask); return $fields->{cfgNum}; @@ -86,29 +101,59 @@ sub store { sub load { my ( $self, $cfgNum, $fields ) = @_; my $f; - local $/ = ""; - unless ( open FILE, $self->{dirName} . "/lmConf-$cfgNum" ) { - $Lemonldap::NG::Common::Conf::msg .= "Open file failed: $! \n"; + if ( -e $self->_file($cfgNum) ) { + local $/ = ''; + open FILE, $self->_file($cfgNum) or die "$!$@"; + $f = join( '', ); + close FILE; + my $ret = eval { decode_json($f); }; + die "Unable to load conf: $@\n" if ($@); + return $ret; + } + + # Old format + elsif ( -e "$self->{dirName}/lmConf-$cfgNum" ) { + open FILE, "$self->{dirName}/lmConf-$cfgNum" or die "$!$@"; + local $/ = ""; + unless ( open FILE, $self->{dirName} . "/lmConf-$cfgNum" ) { + $Lemonldap::NG::Common::Conf::msg .= "Open file failed: $! \n"; + return undef; + } + while () { + my ( $k, $v ) = split /\n\s+/; + chomp $k; + $v =~ s/\n*$//; + if ($fields) { + $f->{$k} = $v if ( grep { $_ eq $k } @$fields ); + } + else { + $f->{$k} = $v; + } + } + close FILE; + require Lemonldap::NG::Common::Conf::Serializer; + return $self->unserialize($f); + } + else { + $Lemonldap::NG::Common::Conf::msg .= + "Unable to find configuration file"; return undef; } - while () { - my ( $k, $v ) = split /\n\s+/; - chomp $k; - $v =~ s/\n*$//; - if ($fields) { - $f->{$k} = $v if ( grep { $_ eq $k } @$fields ); - } - else { - $f->{$k} = $v; - } - } - close FILE; - return $self->unserialize($f); } sub delete { my ( $self, $cfgNum ) = @_; - unlink( $self->{dirName} . "/lmConf-$cfgNum" ); + my $file = $self->_file($cfgNum); + if ( -e $file ) { + my $res = unlink($file); + $Lemonldap::NG::Common::Conf::msg .= $! unless ($res); + return $res; + } + else { + $Lemonldap::NG::Common::Conf::msg .= + "Unable to delete conf $cfgNum, no such file"; + return 0; + } } 1; diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/JSONFile.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/JSONFile.pm index 55b5c379f..1dd2b8fef 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/JSONFile.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/JSONFile.pm @@ -1,110 +1,9 @@ +# Now, File.pm is a mix of the old File.pm and JSONFile.pm. So this file is +# just set for compatibility package Lemonldap::NG::Common::Conf::JSONFile; -use strict; -use Lemonldap::NG::Common::Conf::Constants; #inherits - -our $VERSION = '1.4.0'; -our $initDone; - -sub prereq { - my $self = shift; - unless ($initDone) { - eval "use JSON::Any"; - if ($@) { - $Lemonldap::NG::Common::Conf::msg .= - "Unable to load JSON::Any: $@\n"; - return 0; - } - $initDone++; - } - unless ( $self->{dirName} ) { - $Lemonldap::NG::Common::Conf::msg .= - '"dirName" is required in "JSONFile" configuration type ! \n'; - return 0; - } - unless ( -d $self->{dirName} ) { - $Lemonldap::NG::Common::Conf::msg .= - "Directory \"$self->{dirName}\" does not exist ! \n"; - return 0; - } - 1; -} - -sub available { - my $self = shift; - opendir D, $self->{dirName}; - my @conf = readdir(D); - closedir D; - @conf = sort { $a <=> $b } map { /lmConf-(\d+)\.js/ ? $1 : () } @conf; - return @conf; -} - -sub lastCfg { - my $self = shift; - my @avail = $self->available; - return $avail[$#avail]; -} - -sub lock { - my $self = shift; - if ( $self->isLocked ) { - sleep 2; - return 0 if ( $self->isLocked ); - } - unless ( open F, ">" . $self->{dirName} . "/lmConf.lock" ) { - $Lemonldap::NG::Common::Conf::msg .= - "Unable to lock (" . $self->{dirName} . "/lmConf.lock) \n"; - return 0; - } - print F $$; - close F; - return 1; -} - -sub isLocked { - my $self = shift; - -e $self->{dirName} . "/lmConf.lock"; -} - -sub unlock { - my $self = shift; - unlink $self->{dirName} . "/lmConf.lock"; - 1; -} - -sub store { - my ( $self, $fields ) = @_; - my $mask = umask; - umask( oct('0027') ); - unless ( open FILE, ">$self->{dirName}/lmConf-$fields->{cfgNum}.js" ) { - $Lemonldap::NG::Common::Conf::msg .= "Open file failed: $! \n"; - $self->unlock; - return UNKNOWN_ERROR; - } - print FILE JSON::Any->objToJson($fields); - close FILE; - umask($mask); - return $fields->{cfgNum}; -} - -sub load { - my ( $self, $cfgNum, $fields ) = @_; - my $f = ''; - open FILE, "$self->{dirName}/lmConf-$cfgNum.js" or die "$!$@"; - while () { - $f .= $_; - } - close FILE; - my $ret; - eval { $ret = JSON::Any->jsonToObj($f); }; - die "Unable to load conf: $@\n" if ($@); - return $ret; -} - -sub delete { - my ( $self, $cfgNum ) = @_; - unlink( $self->{dirName} . "/lmConf-$cfgNum.js" ); -} +use Lemonldap::NG::Common::Conf::File; +our @ISA = qw(Lemonldap::NG::Common::Conf::File); 1; -__END__ + diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI.pm new file mode 100644 index 000000000..210e09e46 --- /dev/null +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI.pm @@ -0,0 +1,151 @@ +package Lemonldap::NG::Common::PSGI; + +use 5.10.0; +use Mouse; +use JSON; +use Lemonldap::NG::Common::PSGI::Constants; +use Lemonldap::NG::Common::PSGI::Request; + +our $VERSION = '1.5.99'; + +our $_json = JSON->new->allow_nonref; + +has error => ( is => 'rw', default => '' ); +has languages => ( is => 'rw', isa => 'Str', default => 'en' ); +has logLevel => ( is => 'rw', isa => 'Str' ); +has staticPrefix => ( is => 'rw', isa => 'Str' ); +has templateDir => ( is => 'rw', isa => 'Str' ); +has links => ( is => 'rw', isa => 'ArrayRef' ); + +sub lmLog { + my ( $self, $msg, $level ) = splice @_; + my $levels = { + emerg => 7, + alert => 6, + crit => 5, + error => 4, + warn => 3, + notice => 2, + info => 1, + debug => 0 + }; + my $l = $levels->{$level} || 1; + return if ( ref($self) and $l < $levels->{ $self->{logLevel} } ); + print STDERR "[$level] " . ( $l ? '' : (caller)[0] . ': ' ) . " $msg\n"; +} + +# Responses methods +sub sendJSONresponse { + my ( $self, $req, $j, %args ) = splice @_; + $args{code} ||= 200; + my $type = 'text/json'; + if ( ref $j ) { + if ( $args{forceJSON} or $req->accept =~ m|application/json| ) { + $j = $_json->encode($j); + } + else { + + # TODO: escape keys in hash values + eval { + require XML::Simple; + $j = XML::Simple::XMLout($j); + $type = 'text/xml'; + }; + } + } + return [ $args{code}, [ 'Content-Type', $type ], [$j] ]; +} + +sub sendError { + my ( $self, $req, $err, $code ) = splice @_; + $err ||= $req->error; + $code ||= 500; + return $self->sendJSONresponse( $req, { error => $err }, code => $code ); +} + +sub abort { + my ( $self, $err ) = splice @_; + $self->lmLog( $err, 'error' ); + return sub { + $self->sendError( Lemonldap::NG::Common::PSGI::Request->new( $_[0] ), + $err, 500 ); + }; +} + +sub _mustBeDefined { + my $name = ( caller(1) )[3]; + $name =~ s/^.*:://; + my $call = ( caller(1) )[0]; + my $ref = ref( $_[0] ) || $call; + die "$name() method must be implemented (probably in $ref)"; +} + +sub init { 1 } + +sub router { _mustBeDefined(@_) } + +sub sendHtml { + my ( $self, $req, $template ) = splice @_; + my $htpl; + $template = $self->templateDir . "$template.tpl"; + return $self->sendError( $req, "Unable to read $template", 500 ) + unless ( -r $template and -f $template ); + eval { + $self->lmLog( "Starting HTML generation using $template", 'debug' ); + require HTML::Template; + $htpl = HTML::Template->new( + filehandle => IO::File->new($template), + path => $self->templateDir, + die_on_bad_params => 1, + die_on_missing_include => 1, + cache => 0, + ); + + # TODO: replace app + # TODO: warn if STATICPREFIX does not end with '/' + my $sp = $self->staticPrefix; + $sp =~ s/\/*$/\//; + $htpl->param( + SCRIPT_NAME => $req->scriptname, + STATIC_PREFIX => $sp, + AVAILABLE_LANGUAGES => $self->languages, + LINKS => $self->links ? encode_json( $self->links ) : '""', + ); + }; + if ($@) { + return $self->sendError( $req, "Unable to load template: $@", 500 ); + } + $self->lmLog( + 'For more performance, store the result of this as static file', + 'info' ); + + # Set headers + my $hdrs = [ 'Content-Type' => 'text/html' ]; + unless ( $self->logLevel eq 'debug' ) { + push @$hdrs, + ETag => "LMNG-manager-$VERSION", + 'Cache-Control' => 'private, max-age=2592000'; + } + $self->lmLog( "Sending $template", 'debug' ); + return [ 200, $hdrs, [ $htpl->output() ] ]; +} + +############### +# Main method # +############### + +sub run { + my ( $self, $args ) = splice @_; + $self = $self->new($args) unless ref($self); + return $self->abort( $self->error ) unless ( $self->init($args) ); + return $self->_run; +} + +sub _run { + my $self = shift; + return sub { + $self->router( Lemonldap::NG::Common::PSGI::Request->new( $_[0] ) ); + }; +} + +1; diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Constants.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Constants.pm new file mode 100644 index 000000000..156494676 --- /dev/null +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Constants.pm @@ -0,0 +1,25 @@ +package Lemonldap::NG::Common::PSGI::Constants; + +use strict; +use Exporter 'import'; + +use base qw(Exporter); +our $VERSION = '1.5.99'; + +# CONSTANTS + +use constant { + DEBUG => 4, + INFO => 3, + WARN => 2, + NOTICE => 1, + ERROR => 0, +}; +our $no = qr/^(?:off|no|0)?$/i; + +our %EXPORT_TAGS = ( 'all' => [qw(DEBUG INFO WARN ERROR $no)] ); +our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); +our @EXPORT = ( @{ $EXPORT_TAGS{'all'} } ); + +1; + diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Request.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Request.pm new file mode 100644 index 000000000..9af03f9fc --- /dev/null +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Request.pm @@ -0,0 +1,140 @@ +package Lemonldap::NG::Common::PSGI::Request; + +use strict; +use Mouse; +use JSON; +use URI::Escape; + +our $VERSION = '1.5.99'; + +# http :// server / path ? query # fragment +# m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|; + +has HTTP_ACCEPT => ( is => 'ro', reader => 'accept' ); +has HTTP_ACCEPT_ENCODING => ( is => 'ro', reader => 'encodings' ); +has HTTP_ACCEPT_LANGUAGE => ( is => 'ro', reader => 'languages' ); +has HTTP_COOKIE => ( is => 'ro', reader => 'cookies' ); +has HTTP_HOST => ( is => 'ro', reader => 'hostname' ); +has REMOTE_ADDR => ( is => 'ro', isa => 'Str', reader => 'remote_ip' ); +has REMOTE_PORT => ( is => 'ro', isa => 'Int', reader => 'port' ); +has REQUEST_METHOD => ( is => 'ro', isa => 'Str', reader => 'method' ); +has SCRIPT_NAME => ( is => 'ro', isa => 'Str', reader => 'scriptname' ); +has SERVER_PORT => ( is => 'ro', isa => 'Int', reader => 'get_server_port' ); +has PATH_INFO => ( + is => 'ro', + reader => 'path', + lazy => 1, + default => '', + trigger => sub { + $_[0]->{REQUEST_URI} = uri_unescape( $_[0]->{REQUEST_URI} ); + $_[0]->{REQUEST_URI} =~ s|//+|/|; + }, +); +has REQUEST_URI => ( + is => 'ro', + reader => 'uri', + trigger => sub { + $_[0]->{unparsed_uri} = $_[0]->{REQUEST_URI}; + $_[0]->{REQUEST_URI} = uri_unescape( $_[0]->{REQUEST_URI} ); + }, +); +has unparsed_uri => ( is => 'rw', isa => 'Str' ); + +has 'psgi.errors' => ( is => 'rw', reader => 'stderr' ); + +# Authentication + +has REMOTE_USER => ( + is => 'ro', + isa => 'Int', + reader => 'user', + trigger => sub { + $_[0]->{userData} = { _whatToTrace => $_[0]->{REMOTE_USER}, }; + }, +); +has userData => ( is => 'rw', isa => 'HashRef', default => sub { {} } ); + +# Query parameters +has _params => ( is => 'rw', isa => 'HashRef', default => sub { {} } ); +has QUERY_STRING => ( + is => 'ro', + reader => 'query', + trigger => sub { + my $self = shift; + $self->{QUERY_STRING} = uri_unescape( $self->{QUERY_STRING} ); + my @tmp = + $self->{QUERY_STRING} + ? split /&/, $self->{QUERY_STRING} + : (); + foreach my $s (@tmp) { + if ( $s =~ /^(.+?)=(.+)$/ ) { $self->{_params}->{$1} = $2; } + else { $self->{_params}->{$s} = 1; } + } + }, +); + +sub params { + my ( $self, $key, $value ) = splice @_; + return $self->_params unless ($key); + $self->_params->{$key} = $value if ($value); + return $self->_params->{$key}; +} + +# POST management +# +# When CONTENT_LENGTH is set, store body in memory in `body` key +has 'psgix.input.buffered' => ( is => 'ro', reader => '_psgixBuffered', ); +has 'psgi.input' => ( is => 'ro', reader => '_psgiInput', ); +has body => ( is => 'rw', isa => 'Str', default => '' ); +has CONTENT_TYPE => ( is => 'ro', isa => 'Str', reader => 'contentType', ); +has CONTENT_LENGTH => ( + is => 'ro', + isa => 'Int', + reader => 'contentLength', + lazy => 1, + default => 0, + trigger => sub { + my $self = shift; + if ( $self->method eq 'GET' ) { $self->{body} = undef; } + elsif ( $self->method =~ /^(?:POST|PUT)$/ ) { + $self->{body} = ''; + if ( $self->_psgixBuffered ) { + my $length = $self->{CONTENT_LENGTH}; + while ( $length > 0 ) { + my $buffer; + $self->_psgiInput->read( $buffer, + ( $length < 8192 ) ? $length : 8192 ); + $length -= length($buffer); + $self->{body} .= $buffer; + } + } + else { + $self->_psgiInput->read( $self->{body}, + $self->{CONTENT_LENGTH}, 0 ); + } + } + } +); +has error => ( is => 'rw', isa => 'Str', default => '' ); + +# JSON parser +sub jsonBodyToObj { + my $self = shift; + unless ( $self->contentType =~ /application\/json/ ) { + $self->error('Data is not JSON'); + return undef; + } + unless ( $self->body ) { + $self->error('No data'); + return undef; + } + return $self->body if ( ref( $self->body ) ); + my $j = eval { decode_json( $self->body ) }; + if ( $@ or $! ) { + $self->error("$@$!"); + return undef; + } + return $self->{body} = $j; +} + +1; diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Router.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Router.pm new file mode 100644 index 000000000..bea005c49 --- /dev/null +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/PSGI/Router.pm @@ -0,0 +1,152 @@ +package Lemonldap::NG::Common::PSGI::Router; + +use Mouse; +use Lemonldap::NG::Common::PSGI; +use Lemonldap::NG::Common::PSGI::Constants; + +our $VERSION = '1.5.99'; + +extends 'Lemonldap::NG::Common::PSGI'; + +# Properties +has 'routes' => ( + is => 'rw', + isa => 'HashRef', + default => sub { { GET => {}, POST => {}, PUT => {}, DELETE => {} } } +); +has 'defaultRoute' => ( is => 'rw', default => 'index.html' ); + +# Routes initialization + +sub addRoute { + my ( $self, $word, $dest, $methods ) = splice(@_); + $methods ||= [qw(GET POST PUT DELETE)]; + foreach my $method (@$methods) { + $self->genRoute( $self->routes->{$method}, $word, $dest ); + } + return $self; +} + +sub genRoute { + my ( $self, $routes, $word, $dest ) = splice @_; + if ( ref $word eq 'ARRAY' ) { + foreach my $w (@$word) { + $self->genRoute( $routes, $w, $dest ); + } + } + else { + if ( $word =~ /^:(.*)$/ ) { + $routes->{'#'} = $1; + die "Target required for $word" unless ($dest); + $word = ':'; + } + else { + $dest ||= $word; + } + if ( my $t = ref $dest ) { + if ( $t eq 'CODE' ) { + $routes->{$word} = $dest; + } + elsif ( $t eq 'HASH' ) { + $routes->{$word} ||= {}; + foreach my $w ( keys %$dest ) { + $self->genRoute( $routes->{$word}, $w, $dest->{$w} ); + } + } + elsif ( $t eq 'ARRAY' ) { + $routes->{$word} ||= {}; + foreach my $w ( @{$dest} ) { + $self->genRoute( $routes->{$word}, $w ); + } + } + else { + die "Type $t unauthorizated in routes"; + } + } + elsif ( $dest =~ /^(.+)\.html$/ ) { + my $tpl = $1 or die; + $routes->{$word} = sub { $self->sendHtml( $_[1], $tpl ) }; + } + elsif ( $self->can($dest) ) { + $routes->{$word} = sub { shift; $self->$dest(@_) }; + } + else { + die "$dest() isn't a method"; + } + $self->lmLog( "route $word added", 'debug' ); + } +} + +sub abort { + my ( $self, $path, $msg ) = splice @_; + delete $self->routes->{$path}; + $self->addRoute( + $path => sub { + my ( $self, $req ) = splice @_; + return $self->sendError( $req, $msg, 500 ); + } + ); +} + +# Methods that dispatch requests + +sub router { + my ( $self, $req ) = splice @_; + + #print STDERR Dumper($self->routes);use Data::Dumper; + + # Reinitialize configuration message + $Lemonldap::NG::Common::Conf::msg = ''; + + # Launch reqInit() if exists + if ( $self->can('reqInit') ) { + $self->reqInit($req); + } + + # Only words are taken in path + my @path = grep { $_ =~ /^[\.\w]+/ } split /\//, $req->path(); + $self->lmLog( "Start routing " . ( $path[0] // 'default route' ), 'debug' ); + + unless (@path) { + push @path, $self->defaultRoute; + + # TODO: E-Tag, Expires,... + # + ## NB: this is not HTTP compliant: host and protocol are required ! + #my $url = '/' . $self->defaultRoute; + #return [ + # 302, + # [ 'Content-Type' => 'text/plain', 'Location' => $url ], + # ['Document has moved here: $url'] + #]; + } + return $self->followPath( $req, $self->routes->{ $req->method }, \@path ); +} + +sub followPath { + my ( $self, $req, $routes, $path ) = splice @_; + if ( $path->[0] and defined $routes->{ $path->[0] } ) { + my $w = shift @$path; + if ( ref( $routes->{$w} ) eq 'CODE' ) { + return $routes->{$w}->( $self, $req, @$path ); + } + return $self->followPath( $req, $routes->{$w}, $path ); + } + elsif ( $routes->{':'} ) { + my $v = shift @$path; + $req->params->{ $routes->{'#'} } = $v; + if ( ref( $routes->{':'} ) eq 'CODE' ) { + return $routes->{':'}->( $self, $req, @$path ); + } + return $self->followPath( $req, $routes->{':'}, $path ); + } + elsif ( my $sub = $routes->{'*'} ) { + return $self->$sub( $req, @$path ); + } + else { + $self->lmLog( 'Bad request received (' . $req->path . ')', 'warn' ); + return $self->sendError( $req, 'Bad request', 400 ); + } +} + +1; diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API.pm index eaad33981..287e66573 100644 --- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API.pm +++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API.pm @@ -40,9 +40,10 @@ my $mp = $ENV{MOD_PERL_API_VERSION}; my $mode = $gi && $gi =~ /^CGI/ ? "CGI" : $mp && $mp >= 2 ? "ApacheMP2" - : $mp ? "ApacheMP1" - : $main::{'nginx::'} ? "Nginx" - : "CGI"; + : $mp ? "ApacheMP1" + : $main::{'nginx::'} ? "Nginx" + : ( caller(6) )[0] eq 'Lemonldap::NG::Handler::PSGI' ? "PSGI" + : "CGI"; # Load API functions and constants eval "use Lemonldap::NG::Handler::API::$mode (':httpCodes', ':functions'); diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API/PSGI.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API/PSGI.pm new file mode 100644 index 000000000..c82ca0db5 --- /dev/null +++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/API/PSGI.pm @@ -0,0 +1,186 @@ +package Lemonldap::NG::Handler::API::PSGI; + +use Exporter 'import'; + +our $VERSION = '1.4.0'; +our ( %EXPORT_TAGS, @EXPORT_OK, @EXPORT ); + +BEGIN { + %EXPORT_TAGS = ( + httpCodes => [ + qw( OK REDIRECT FORBIDDEN DONE DECLINED SERVER_ERROR AUTH_REQUIRED MAINTENANCE $logLevel ) + ], + functions => [ + qw( &hostname &remote_ip &uri &uri_with_args + &unparsed_uri &args &method &header_in ) + ] + ); + push( @EXPORT_OK, @{ $EXPORT_TAGS{$_} } ) foreach ( keys %EXPORT_TAGS ); + $EXPORT_TAGS{all} = \@EXPORT_OK; +} + +# Specific modules and constants for Test or CGI +use constant FORBIDDEN => 403; +use constant REDIRECT => 302; +use constant OK => 0; +use constant DECLINED => 0; +use constant DONE => 0; +use constant SERVER_ERROR => 500; +use constant AUTH_REQUIRED => 401; +use constant MAINTENANCE => 503; + +my $request; + +## @method void thread_share(string $variable) +# share or not the variable (if authorized by specific module) +# @param $variable the name of the variable to share +sub thread_share { + + # nothing to do in PSGI +} + +sub newRequest { + my ( $class, $r ) = @_; + $request = $r; +} + +## @method void lmLog(string $msg, string $level) +# logs message $msg to STDERR with level $level +# set Env Var lmLogLevel to set loglevel; set to "info" by default +# @param $msg string message to log +# @param $level string loglevel +*lmLog = *Lemonldap::NG::Common::PSGI::lmLog; + +## @method void set_user(string user) +# sets remote_user +# @param user string username +sub set_user { + my ( $class, $user ) = splice @_; + + # TODO +} + +## @method string header_in(string header) +# returns request header value +# @param header string request header +# @return request header value +sub header_in { + my ( $class, $header ) = @_; + $header ||= $class; # to use header_in as a method or as a function + return $request->{ cgiName($header) }; +} + +## @method void set_header_in(hash headers) +# sets or modifies request headers +# @param headers hash containing header names => header value +sub set_header_in { + my ( $class, %headers ) = @_; + while ( my ( $h, $v ) = each %headers ) { + $request->{ cgiName($h) } = $v; + } +} + +## @method void unset_header_in(array headers) +# removes request headers +# @param headers array with header names to remove +sub unset_header_in { + my ( $class, @headers ) = @_; + foreach my $h (@headers) { + delete $request->{ cgiName($h) }; + } +} + +## @method void set_header_out(hash headers) +# sets response headers +# @param headers hash containing header names => header value +sub set_header_out { + my ( $class, %headers ) = @_; + while ( my ( $h, $v ) = each %headers ) { + $request->{respHeaders}->{$h} = $v; + } +} + +## @method string hostname +# returns host, as set by full URI or Host header +# @return host string Host value +sub hostname { + my $h = $request->hostname; + $h =~ s/:\d+//; + return $h; +} + +## @method string remote_ip +# returns client IP address +# @return IP_Addr string client IP +sub remote_ip { + return $request->remote_ip; +} + +## @method boolean is_initial_req +# always returns true +# @return is_initial_req boolean +sub is_initial_req { + return 1; +} + +## @method string args(string args) +# gets the query string +# @return args string Query string +sub args { + return $request->query; +} + +## @method string uri +# returns the path portion of the URI, normalized, i.e. : +# * URL decoded (characters encoded as %XX are decoded, +# except ? in order not to merge path and query string) +# * references to relative path components "." and ".." are resolved +# * two or more adjacent slashes are merged into a single slash +# @return path portion of the URI, normalized +sub uri { + return $request->uri; +} + +## @method string uri_with_args +# returns the URI, with arguments and with path portion normalized +# @return URI with normalized path portion +sub uri_with_args { + return $request->uri; +} + +## @method string unparsed_uri +# returns the full original request URI, with arguments +# @return full original request URI, with arguments +sub unparsed_uri { + return $request->unparsed_uri; +} + +## @method string get_server_port +# returns the port the server is receiving the current request on +# @return port string server port +sub get_server_port { + return $request->get_server_port; +} + +## @method string method +# returns the request method +# @return port string server port +sub method { + return $request->method; +} + +## @method void print(string data) +# write data in HTTP response body +# @param data Text to add in response body +sub print { + my ( $class, $data ) = @_; + $request->{respBody} .= $data; +} + +sub cgiName { + my $h = uc(shift); + $h =~ s/-/_/g; + return "HTTP_$h"; +} + +1; diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Logger.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Logger.pm index 60bc15030..0f1ddb133 100755 --- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Logger.pm +++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Logger.pm @@ -26,7 +26,7 @@ BEGIN { sub logLevelInit { my ( $class, $level ) = @_; $logLevel = $level || $Lemonldap::NG::Handler::API::logLevel || "debug"; - $logLevel = $logLevels->{$logLevel}; + $logLevel = $logLevels->{$logLevel} || 0; } ## @rmethod void lmLog(string msg, string level) diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/PSGI.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/PSGI.pm new file mode 100644 index 000000000..3d7cbeb1e --- /dev/null +++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/PSGI.pm @@ -0,0 +1,71 @@ +package Lemonldap::NG::Handler::PSGI; + +use 5.10.0; +use Mouse; +use Lemonldap::NG::Handler::SharedConf qw(:tsv :variables); +extends 'Lemonldap::NG::Common::PSGI::Router'; + +our $VERSION = 1.5.99; + +around init => sub { + my ( $method, $self, $args ) = splice @_; + Lemonldap::NG::Handler::SharedConf->init( $self ); + return $self->$method($args); +}; + +sub _run { + my $self = shift; + my $rule = $self->{protection} || $localConfig->{protection}; + if ( $rule ne 'none' ) { + $rule = + $rule eq "authenticate" ? "accept" : $rule eq "manager" ? "" : $rule; + return sub { + my $req = Lemonldap::NG::Common::PSGI::Request->new( $_[0] ); + Lemonldap::NG::Handler::API->newRequest($req); + my $res = Lemonldap::NG::Handler::SharedConf->run($rule); + + # TODO: Userdata + #print STDERR Dumper( \@_, $res ); use Data::Dumper; + if ( $res == 403 ) { + return [ + 403, + [ 'Content-Type' => 'text/plain' ], + ["You don't have rights to access this page"] + ]; + } + + # Ajax hook: Ajax requests can not understand 30x responses. This + # is not really HTTP compliant but nothing in this + # protocol can do this. Our javascript understand that + # it has to prompt user with the URL + elsif ( + ( $res == 302 or $res == 303 ) + and ( $req->accept =~ m|application/json| + or $req->contentType =~ m|application/json| ) + ) + { + return [ + 401, [ Authorization => $req->{respHeaders}->{Location} ], + [''] + ]; + } + elsif ($res) { + return [ $res, [ %{ $req->{respHeaders} } ], [''] ]; + } + else { + return $self->router($req); + } + }; + } + else { + eval { Lemonldap::NG::Handler::SharedConf->checkConf() } unless (%$tsv); + $self->lmLog( $@, 'error' ) if ($@); + return sub { + + #print STDERR Dumper(\@_);use Data::Dumper; + $self->router( Lemonldap::NG::Common::PSGI::Request->new( $_[0] ) ); + }; + } +} + +1; diff --git a/lemonldap-ng-manager/KINEMATIC.md b/lemonldap-ng-manager/KINEMATIC.md new file mode 100644 index 000000000..8d9e1b5c8 --- /dev/null +++ b/lemonldap-ng-manager/KINEMATIC.md @@ -0,0 +1,31 @@ +# Lemonldap::NG::Manager kinematic + +## Initialization + + PSGI file + | + +-> Common::PSGI::run() (Manager inheritance) + | + +-> Common::PSGI::new() unless(defined $self) + | + +-> Manager::init() + | + +-> Manager::::addRoutes() + (module can be one of `Conf`, `Sessions`, `Notifications` + | + +-> Common::PSGI::Router::addRoute() + +_Common::PSGI::run()_ returns a subroutine + +## HTTP responses + +PSGI system launch the previous sub + + sub + | + +-> Common::PSGI::Router::router ( Lemonldap::NG::Common::PSGI::Request->new() ) + | + +-> Common::PSGI::Router::followPath() + | + +-> Launch the corresponding Manager:: subroutine declared with addRoutes() + diff --git a/lemonldap-ng-manager/README.md b/lemonldap-ng-manager/README.md new file mode 100644 index 000000000..efa102885 --- /dev/null +++ b/lemonldap-ng-manager/README.md @@ -0,0 +1,42 @@ +# angular-lemonldap-ng-manager + +This is just a POC to build an angular based manager for +Lemonldap::NG. + +See [LemonLDAP::NG website](http://lemonldap-ng.org/). + +## Install + + git clone https://github.com/guimard/angular-lemonldap-ng-manager.git + cd angular-lemonldap-ng-manager + npm install + +## Start servers + + npm run perlserver + npm start + +## MVC + +* The view is managed by : + * `index.html` for HTML building + * _some other html files for forms ?_ + * `struct.json` who gives the tree position for each configuration element and + requests to do + * translate.json (which will be delivered by a CGI to choose current language) +* The controller is splitted in 2 pieces : + * client side in `js/manager.js`, based on ANgularJS, it provides the link + between the DOM and the CGI. It manages: + * downloads of JSON datas + * translations + * form display depending on data types + * server side, based on PSGI, it provides the link between network and + configuration. It will be able to respond to 3 types of _rest_ queries: + * key values + * hash keys for this type of nodes + * hash content +* The model (datas) is: + * the current configuration + * the modified datas _(client side only or both to be able to notify changes + to other administrators ?)_ + diff --git a/lemonldap-ng-manager/REST-API.md b/lemonldap-ng-manager/REST-API.md new file mode 100644 index 000000000..a880c6a41 --- /dev/null +++ b/lemonldap-ng-manager/REST-API.md @@ -0,0 +1,65 @@ +# Lemonldap::NG::Manager REST API + +## Configurations + +* List of available configuration: `/confs` +* Last configuration number: `/confs/latest/cfgNum` +* Configuration metadatas: `/confs/` +* Key value: `/confs//` +* Full configuration (for saving): `/confs/?full` + +Examples: + +* `/confs/latest/portal` +* `/confs/184/portal` +* `/confs/184/virtualHosts/test1.example.com/locationRules` + +### Available verbs: + +* `GET`: see above +* `POST /confs`: push a new configuration (or a saved one) + `POST /confs?force=yes`: push a new configuration even if another has been + posted before +* _`DELETE /confs/`: not allowed_, administrator has to push an older + with `?force=yes` + +**And perhaps:** + +* `PUT /confs/prepared/`: modify a value in the future configuration +* `DELETE /confs/prepared//`: delete a hash entry (virtual host for + example) +* `GET /confs/prepared/`: get value from prepared configuration if exists, + get current value otherwise + +## Sessions + +* Sessions list: `/sessions` +* Session: `/sessions/` +* **TODO**: Session key: `/sessions//` +* Delete session: `DELETE /sessions/` +* Filters: + * All connected users which username start by a letter: + `/sessions?_whatToTrace=*&groupBy=_whatToTrace` + * User's sessions: `/sessions?_whatToTrace=foo.bar` + * IP's sessions: `/sessions?ip=1.2.3.4` + * Double sessions by IP: `/sessions?doubleIP` +* Group by: + * First letter of Connected users: `/sessions?groupBy=substr(_whatToTrace,1)` +* Order: + * Sessions sorted by user: `/sessions?orderBy=_whatToTrace` + +Note that sessions are grouped automaticaly. + +## Notifications + +* Notifications list: `/notifications/actives` +* Notification: `/notifications/actives/` +* Notified elements list: `/notifications/done` +* Notified element: `/notifications/done/` +* New session: `POST /notifications` +* Filters: + * All notifications for users which name starts by a letter: + `/notifications?_whatToTrace=*&groupBy=_whatToTrace` + * User's notifications: `/notifications/(actives|done)?_whatToTrace=foo.bar` +* Mark as notified: `PUT /notifications/actives/ done=1` +* Delete notofication: `DELETE /notifications/done/` diff --git a/lemonldap-ng-manager/TODO.md b/lemonldap-ng-manager/TODO.md new file mode 100644 index 000000000..2e098153a --- /dev/null +++ b/lemonldap-ng-manager/TODO.md @@ -0,0 +1,58 @@ +# Lemonldap::NG::Manager TODO list + +* Check for eval with SAML +* userInfo && userWarn +* Help interface + +## Configuration management + +* `currentConf` => `$req` instead of `$self` +* PSGI: improve log system (syslog,...) +* Forms: + * issuers resume + +### Struct & datas + +* Tests for new confs +* default values: TODO, deliver a "0" conf when no conf is available +* Forms: + * file: load from URL + download + * Grant session rule + * OpenID white/black list + * oidcOpMetadata ? + +* import from JSON + +### REST API: + +### PSGI authentication + +* JQuery module to add `$._llngAjax` +* Angular module to add $llngHttp + +### Help system + +## Sessions explorer + +## Optimization + +* Create modules to get needed values for a new conf without using + `Common::Conf::Attributes` +* Then delete essential default values in running modules: they have to be + provided by any configuration +* Use JSON to store datas: + * configuration: the new `File` will look at the first character. If not `{`, + it will call old `File` functions + * sessions: new Apache::Session::Serialize::JSON module + +## Doc + +* Wiki doc +* Developer corner: + * adding a configurationkey + * adding a data type + +## Question more + +* Phonegap +* Ionic diff --git a/lemonldap-ng-manager/bower.json b/lemonldap-ng-manager/bower.json new file mode 100644 index 000000000..8293910cb --- /dev/null +++ b/lemonldap-ng-manager/bower.json @@ -0,0 +1,15 @@ +{ + "name": "angular-lemonldap-ng-manager", + "description": "Lemonldap::NG manager with AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/guimard/angular-lemonldap-ng-manager", + "license": "GPL2", + "private": true, + "dependencies": { + "angular": "1.3.x", + "angular-route": "1.x", + "angular-ui-tree": "2.1.5", + "bootstrap": "~3.1.1", + "jquery": "~2.1.1" + } +} \ No newline at end of file diff --git a/lemonldap-ng-manager/eg/manager-server.psgi b/lemonldap-ng-manager/eg/manager-server.psgi new file mode 100644 index 000000000..103d8fb2a --- /dev/null +++ b/lemonldap-ng-manager/eg/manager-server.psgi @@ -0,0 +1,5 @@ +#!/usr/bin/env plackup -I pl/lib + +use Lemonldap::NG::Manager; + +Lemonldap::NG::Manager->run({}); diff --git a/lemonldap-ng-manager/example/index.pl b/lemonldap-ng-manager/example/index.pl deleted file mode 100755 index 14cac264b..000000000 --- a/lemonldap-ng-manager/example/index.pl +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/perl - -use strict; -use Lemonldap::NG::Manager; -use HTML::Template; - -my $manager = new Lemonldap::NG::Manager( - { - - # ACCESS TO CONFIGURATION - - # By default, Lemonldap::NG uses the default storage.conf file to know - # where to find is configuration - # (generaly /etc/lemonldap-ng/storage.conf) - # You can specify by yourself this file : - #configStorage => { confFile => '/path/to/my/file' }, - - # You can also specify directly the configuration - # (see Lemonldap::NG::Handler::SharedConf(3)) - #configStorage => { - # type => 'File', - # directory => '/usr/local/lemonldap-ng/conf/' - #}, - - } -) or Lemonldap::NG::Common::CGI->abort('Unable to start manager'); - -our $skin = $manager->{managerSkin}; -our $skin_dir = 'skins'; -our $main_dir = $manager->getApacheHtdocsPath; - -my $template = HTML::Template->new( - filename => "$main_dir/$skin_dir/$skin/manager.tpl", - die_on_bad_params => 0, - cache => 0, - filter => sub { $manager->translate_template(@_) }, -); -$template->param( SCRIPT_NAME => $ENV{SCRIPT_NAME} ); -$template->param( MENU => $manager->menu() ); -$template->param( DIR => "$skin_dir/$skin" ); -$template->param( CFGNUM => $manager->{cfgNum} ); -$template->param( TREE_AUTOCLOSE => $manager->{managerTreeAutoClose} ); -$template->param( TREE_JQUERYCSS => $manager->{managerTreeJqueryCss} ); -$template->param( CSS => $manager->{managerCss} ); -$template->param( CSS_THEME => $manager->{managerCssTheme} ); -$template->param( VERSION => $Lemonldap::NG::Manager::VERSION ); -$template->param( LANG => shift @{ $manager->{lang} } ); -$template->param( PORTAL_URL => $manager->{portal} ); -$template->param( LI_CLASS_CONFIGURATION => "active" ); -$template->param( LI_CLASS_SESSION => "" ); -$template->param( LI_CLASS_NOTIFICATION => "" ); -print $manager->header('text/html; charset=utf-8'); -print $template->output; - diff --git a/lemonldap-ng-manager/example/mrtg/lmng-mrtg b/lemonldap-ng-manager/example/mrtg/lmng-mrtg deleted file mode 100755 index 58d662e5d..000000000 --- a/lemonldap-ng-manager/example/mrtg/lmng-mrtg +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/perl - -use strict; -use LWP::UserAgent; - -my($host, $url, $type1, $type2) = @ARGV; - -die("Usage: $0 host url data-type")unless($host and $url and $type1); - -my $ua = LWP::UserAgent->new(); -$ua->timeout(10); - -my ( $method, $vhost, $uri ) = ( $url =~ /^(https?):\/\/([^\/]+)(.*)$/ ); -unless ($vhost) { - $vhost = $host; - $uri = $url; -} -my $r = HTTP::Request->new( 'GET', "$method://$host$uri", HTTP::Headers->new( Host => $vhost ) ); -my $response = $ua->request($r); -if ( $response->code != 200 ) { - print STDERR "$host: ".join( ' ', &txt_error, ":", $response->code, $response->message, ""); - return 1; -} - -my $tot=0; -my $res; -foreach (split(/\n/s, $response->content)) { - $tot++ if(/
/); - $tot=0 if(/<\/div>/); - if($tot) { - /^(\w+)\s*:\s*(\d+)/ or next; - $res->{$1} = $2; - } - $res->{localCache} = $1 if(/^Local Cache\s*:\s*(\d+)/i); - $res->{up} = $1 if(/^Server up for\s*:\s*(\d+d\s+\d+h\s+\d+mn)/); -} - -foreach(keys %$res) { - print "$res->{$_}\n" if(/^$type1$/i); -} -if($type2) { - foreach(keys %$res) { - print "$res->{$_}\n" if(/^$type2$/i); - } -} -print "$res->{up}\n$host"; diff --git a/lemonldap-ng-manager/example/mrtg/mrtg.cfg.example b/lemonldap-ng-manager/example/mrtg/mrtg.cfg.example deleted file mode 100644 index e28eb24ca..000000000 --- a/lemonldap-ng-manager/example/mrtg/mrtg.cfg.example +++ /dev/null @@ -1,30 +0,0 @@ -###################################################################### -# Multi Router Traffic Grapher -- Sample Configuration File -###################################################################### -# This file is for use with mrtg-2.5.4c - -# Global configuration -WorkDir: /var/www/mrtg -WriteExpires: Yes - -Title[^]: Traffic Analysis for - -# 128K leased line -# ---------------- -#Title[leased]: a 128K leased line -#PageTop[leased]:

Our 128K link to the outside world

-#Target[leased]: 1:public@router.localnet -#MaxBytes[leased]: 16000 -Target[test.example.com]: `/etc/mrtg/lmng-mrtg 172.16.1.2 https://test.example.com/status OK OK` -Options[test.example.com]: nopercent, growright, nobanner, perminute -PageTop[test.example.com]:

Requests OK from test.example.com

-MaxBytes[test.example.com]: 1000000 -YLegend[test.example.com]: hits/minute -ShortLegend[test.example.com]:   hits/mn -LegendO[test.example.com]: Hits: -LegendI[test.example.com]: Hits: -Legend2[test.example.com]: Hits per minute -Legend4[test.example.com]: Hits max per minute -Title[test.example.com]: Hits per minute -WithPeak[test.example.com]: wmy - diff --git a/lemonldap-ng-manager/example/notfound.html b/lemonldap-ng-manager/example/notfound.html deleted file mode 100644 index 318d9f9be..000000000 --- a/lemonldap-ng-manager/example/notfound.html +++ /dev/null @@ -1,9 +0,0 @@ - - -Page not found - - -

Page not found

-

Please install documentation package to get offline doc

- - diff --git a/lemonldap-ng-manager/example/notfoundfr.html b/lemonldap-ng-manager/example/notfoundfr.html deleted file mode 100644 index c0ece5af9..000000000 --- a/lemonldap-ng-manager/example/notfoundfr.html +++ /dev/null @@ -1,10 +0,0 @@ - - - -Page non trouvée - - -

Page non trouvée

-

Merci d'installer le paquet contenant la documentation française

- - diff --git a/lemonldap-ng-manager/example/notifications.pl b/lemonldap-ng-manager/example/notifications.pl deleted file mode 100755 index 3a18b5e4e..000000000 --- a/lemonldap-ng-manager/example/notifications.pl +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/perl - -use strict; -use Lemonldap::NG::Manager; -use Lemonldap::NG::Manager::Notifications; -use HTML::Template; - -my $cgi = Lemonldap::NG::Manager::Notifications->new( - { - - # SESSION EXPLORER CUSTOMIZATION - #managerSkin => 'default', - - # ACCESS TO CONFIGURATION - - # By default, Lemonldap::NG uses the default storage.conf file to know - # where to find is configuration - # (generaly /etc/lemonldap-ng/storage.conf) - # You can specify by yourself this file : - #configStorage => { type => 'File', dirName => '/path/to/my/file' }, - - # You can also specify directly the configuration - # (see Lemonldap::NG::Handler::SharedConf(3)) - #configStorage => { - # type => 'File', - # directory => '/usr/local/lemonlda-ng/conf/' - #}, - } - ) - or - Lemonldap::NG::Common::CGI->abort('Unable to start notifications explorer'); - -my $skin = $cgi->{managerSkin} or $cgi->abort('managerSkin is not defined'); -my $css = 'tree.css'; -my $css_theme = 'ui-lightness'; -my $skin_dir = 'skins'; -my $main_dir = $cgi->getApacheHtdocsPath; - -my $template = HTML::Template->new( - filename => "$main_dir/$skin_dir/$skin/notifications.tpl", - die_on_bad_params => 0, - cache => 0, - filter => sub { $cgi->translate_template(@_) }, -); -$template->param( SCRIPT_NAME => $ENV{SCRIPT_NAME} ); -$template->param( TREE => $cgi->tree() ); -$template->param( DIR => "$skin_dir/$skin" ); -$template->param( CSS => $css ); -$template->param( CSS_THEME => $css_theme ); -$template->param( VERSION => $Lemonldap::NG::Manager::VERSION ); -$template->param( LANG => shift @{ $cgi->{lang} } ); -$template->param( PORTAL_URL => $cgi->{portal} ); -$template->param( LI_CLASS_CONFIGURATION => "" ); -$template->param( LI_CLASS_SESSION => "" ); -$template->param( LI_CLASS_NOTIFICATION => "active" ); -print $cgi->header('text/html; charset=utf-8'); -print $template->output; - diff --git a/lemonldap-ng-manager/example/scripts/lemonldap-ng-cli b/lemonldap-ng-manager/example/scripts/lemonldap-ng-cli deleted file mode 100644 index 6c447ea0e..000000000 --- a/lemonldap-ng-manager/example/scripts/lemonldap-ng-cli +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/perl -w - -use Lemonldap::NG::Manager::Cli; -use POSIX qw(setuid setgid); -use strict; - -sub giveUpPrivileges { - my ( $user, $group ) = @_; - - $user = "nobody" unless defined($user); - $group = "nobody" unless defined($group); - - # become $user:$group and give up root privileges - setgid( ( getgrnam($group) )[2] ); - setuid( ( getpwnam($user) )[2] ); - - # if we are still root - if ( $> == 0 ) { - print STDERR -"$0 must not be launched as root since local cache can be corrupted.\n"; - print STDERR "Continue (y/N)? "; - my $res = ; - exit 1 unless ( $res =~ /^y/i ); - } -} - -## main program - -if ( !@ARGV ) { - print STDERR "Usage: $0 \n"; - print STDERR "- help: list available actions\n"; - print STDERR "- info: view current configuration information\n"; - exit 1; -} - -giveUpPrivileges( "__APACHEUSER__", "__APACHEGROUP__" ); - -my ( $cli, $action, $method, $ret ); - -$cli = new Lemonldap::NG::Manager::Cli; - -# Do not increment configuration by default -$cli->{confAccess}->{cfgNumFixed} = 1; - -$action = shift(@ARGV); -$method = $cli->determineMethod($action); - -unless ( $cli->can($method) ) { - print STDERR "Action $action unknown\n"; - print STDERR "Enter $0 help to get more information\n"; - exit 1; -} - -# The config is stored in ASCII -foreach(@ARGV){ utf8::decode $_; } -binmode(STDOUT, ':utf8'); - -@ARGV ? $cli->run( $method, @ARGV ) : $cli->run($method); - -# Display error if any -if ( $cli->getError() ) { - print $cli->getError() . "\n"; - exit 1; -} - -# Save configuration if modified -if ( $cli->{confModified} ) { - $ret = $cli->saveConf(); - print "Configuration $ret saved\n"; -} - -exit 0; - -__END__ - -=head1 NAME - -=encoding utf8 - -lemonldap-ng-cli - Command Line Interface to edit LemonLDAP::NG configuration. - -=head1 SYNOPSIS - -Do lemonldap-ng-cli help to get list of all commands - -=head1 DESCRIPTION - -lemonldap-ng-cli allow user to edit the configuration of LemonLDAP::NG via the -command line. - -=head1 SEE ALSO - -L, L - -=head1 AUTHOR - -David Delassus Edavid.jose.delassus@gmail.comE -Sandro Cazzaniga Ecazzaniga.sandro@gmail.comE -Clement Oudot Eclem.oudot@gmail.comE - -=head1 COPYRIGHT AND LICENSE - -Copyright (C) 2012, by David Delassus -Copyright (C) 2013, by Sandro Cazzaniga - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself, either Perl version 5.10.0 or, -at your option, any later version of Perl 5 you may have available. - -=cut diff --git a/lemonldap-ng-manager/example/scripts/lmConfigEditor b/lemonldap-ng-manager/example/scripts/lmConfigEditor deleted file mode 100644 index 833042728..000000000 --- a/lemonldap-ng-manager/example/scripts/lmConfigEditor +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/perl - -use Lemonldap::NG::Common::Conf; -use Lemonldap::NG::Common::Conf::Constants; -use Data::Dumper; -use English qw(-no_match_vars); -use File::Temp; -use POSIX qw(setuid setgid); -use strict; - -eval { - setgid( ( getgrnam('__APACHEGROUP__') )[2] ); - setuid( ( getpwnam('__APACHEUSER__') )[2] ); - print STDERR "Running as uid $EUID and gid $EGID\n"; -}; - -if ( $EUID == 0 ) { - print STDERR - "$0 must not be launched as root since local cache can be corrupted\n" - . "Continue (y/N)? "; - my $res = ; - exit 1 unless ( $res =~ /^y/i ); -} - -my $conf = Lemonldap::NG::Common::Conf->new(); - -unless ($conf) { - print STDERR $Lemonldap::NG::Common::Conf::msg; - exit 1; -} - -my $tmp = $conf->getConf(); -delete $tmp->{reVHosts}; -delete $tmp->{cipher}; -delete $tmp->{cfgAuthor}; -delete $tmp->{cfgAuthorIP}; -delete $tmp->{cfgDate}; -$tmp = Dumper($tmp); -my $refFile = File::Temp->new( UNLINK => 1 ); -my $editFile = File::Temp->new( UNLINK => 1 ); -print $refFile $tmp; -print $editFile $tmp; -close $refFile; -close $editFile; - -system "editor $editFile"; - -if (`diff $refFile $editFile`) { - my $VAR1; - my $buf; - - # Check if the new configuration hash is valid - open F1, $editFile->filename(); - while () { - $buf .= $_; - } - eval $buf; - die $EVAL_ERROR if $EVAL_ERROR; - - # Update author and date - $VAR1->{cfgAuthor} = "lmConfigEditor"; - $VAR1->{cfgAuthorIP} = "localhost"; - $VAR1->{cfgDate} = time(); - - # Store new configuration - my $res = $conf->saveConf($VAR1); - if ( $res > 0 ) { - print STDERR "Configuration $res saved\n"; - } - else { - print STDERR "Configuration was not saved:\n "; - if ( $res == CONFIG_WAS_CHANGED ) { - print STDERR "Configuration has changed\n"; - } - elsif ( $res == DATABASE_LOCKED ) { - print STDERR "Configuration database is or can nor be locked\n"; - } - elsif ( $res == UPLOAD_DENIED ) { - print STDERR "You're not authorized to save this configuration\n"; - } - elsif ( $res == SYNTAX_ERROR ) { - print STDERR "Syntax error in your configuration\n"; - } - elsif ( $res == UNKNOWN_ERROR ) { - print STDERR "Unknown error\n"; - } - } -} -else { - print STDERR "Configuration not changed\n"; -} - diff --git a/lemonldap-ng-manager/example/sessions.pl b/lemonldap-ng-manager/example/sessions.pl deleted file mode 100755 index cd9734472..000000000 --- a/lemonldap-ng-manager/example/sessions.pl +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/perl - -use strict; -use Lemonldap::NG::Manager; -use Lemonldap::NG::Manager::Sessions; -use HTML::Template; - -my $cgi = Lemonldap::NG::Manager::Sessions->new( - { - - # SESSION EXPLORER CUSTOMIZATION - #managerSkin => 'default', - - # ACCESS TO CONFIGURATION - - # By default, Lemonldap::NG uses the default storage.conf file to know - # where to find is configuration - # (generaly /etc/lemonldap-ng/storage.conf) - # You can specify by yourself this file : - #configStorage => { type => 'File', dirName => '/path/to/my/file' }, - - # You can also specify directly the configuration - # (see Lemonldap::NG::Handler::SharedConf(3)) - #configStorage => { - # type => 'File', - # directory => '/usr/local/lemonlda-ng/conf/' - #}, - } -) or Lemonldap::NG::Common::CGI->abort('Unable to start sessions explorer'); - -my $skin = $cgi->{managerSkin} or $cgi->abort('managerSkin is not defined'); -my $css = 'tree.css'; -my $css_theme = 'ui-lightness'; -my $skin_dir = 'skins'; -my $main_dir = $cgi->getApacheHtdocsPath; - -my $template = HTML::Template->new( - filename => "$main_dir/$skin_dir/$skin/sessions.tpl", - die_on_bad_params => 0, - cache => 0, - filter => sub { $cgi->translate_template(@_) }, -); -$template->param( SCRIPT_NAME => $ENV{SCRIPT_NAME} ); -$template->param( TREE => $cgi->tree() ); -$template->param( DIR => "$skin_dir/$skin" ); -$template->param( CSS => $css ); -$template->param( CSS_THEME => $css_theme ); -$template->param( VERSION => $Lemonldap::NG::Manager::VERSION ); -$template->param( LANG => shift @{ $cgi->{lang} } ); -$template->param( PORTAL_URL => $cgi->{portal} ); -$template->param( LI_CLASS_CONFIGURATION => "" ); -$template->param( LI_CLASS_SESSION => "active" ); -$template->param( LI_CLASS_NOTIFICATION => "" ); -print $cgi->header('text/html; charset=utf-8'); -print $template->output; - diff --git a/lemonldap-ng-manager/example/skins/default/css/accordion.css b/lemonldap-ng-manager/example/skins/default/css/accordion.css deleted file mode 100644 index 6a44db42c..000000000 --- a/lemonldap-ng-manager/example/skins/default/css/accordion.css +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Lemonldap::NG styles - * Lightness theme for Manager - */ - -@import url(manager.css); - -/* jQuery Simple Tree */ -.simpleTree -{ - margin:0; - padding:0; -} - -.simpleTree ul -{ - text-align:center; -} - -.simpleTree li -{ - list-style:none; - margin:0; - padding:0 5px; -} - -.simpleTree li span -{ - display:block; - padding:5px 25px; -} - -.simpleTree li.doc span, .simpleTree li.doc-last span -{ - color:#444; - padding:5px; -} - -.simpleTree ul -{ - margin:0; - padding:0; -} - -.simpleTree .root -{ - cursor:pointer; - text-align:center; -} - -.simpleTree .line -{ - line-height:3px; - height:3px; - font-size:3px; -} - -.simpleTree .ajax -{ - background: url(../images/spinner.gif) no-repeat center 10px; - height:30px; - display:none; -} - -.simpleTree .ajax li -{ - display:none; - margin:0; - padding:0; -} - -.simpleTree .trigger { - position:relative; - top:6px; - left:8px; -} diff --git a/lemonldap-ng-manager/example/skins/default/css/bootstrap-theme.css b/lemonldap-ng-manager/example/skins/default/css/bootstrap-theme.css deleted file mode 100644 index f860bbc06..000000000 --- a/lemonldap-ng-manager/example/skins/default/css/bootstrap-theme.css +++ /dev/null @@ -1,442 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-default:disabled, -.btn-default[disabled] { - background-color: #e0e0e0; - background-image: none; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-primary:disabled, -.btn-primary[disabled] { - background-color: #2d6ca2; - background-image: none; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-success:disabled, -.btn-success[disabled] { - background-color: #419641; - background-image: none; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-info:disabled, -.btn-info[disabled] { - background-color: #2aabd2; - background-image: none; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-warning:disabled, -.btn-warning[disabled] { - background-color: #eb9316; - background-image: none; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.btn-danger:disabled, -.btn-danger[disabled] { - background-color: #c12e2a; - background-image: none; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: -o-linear-gradient(top, #222 0%, #282828 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828)); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/lemonldap-ng-manager/example/skins/default/css/bootstrap.css b/lemonldap-ng-manager/example/skins/default/css/bootstrap.css deleted file mode 100644 index 037dd0561..000000000 --- a/lemonldap-ng-manager/example/skins/default/css/bootstrap.css +++ /dev/null @@ -1,6203 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -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; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - 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; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #428bca; - text-decoration: none; -} -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - width: 100% \9; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -cite { - font-style: normal; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #428bca; -} -a.text-primary:hover { - color: #3071a9; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #428bca; -} -a.bg-primary:hover { - background-color: #3071a9; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -blockquote:before, -blockquote:after { - content: ""; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #777; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #777; -} -.form-control::-webkit-input-placeholder { - color: #777; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: 34px; - line-height: 1.42857143 \0; -} -input[type="date"].input-sm, -input[type="time"].input-sm, -input[type="datetime-local"].input-sm, -input[type="month"].input-sm { - line-height: 30px; -} -input[type="date"].input-lg, -input[type="time"].input-lg, -input[type="datetime-local"].input-lg, -input[type="month"].input-lg { - line-height: 46px; -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - min-height: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm, -.form-horizontal .form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.input-lg, -.form-horizontal .form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 25px; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; -} -.input-lg + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.3px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3071a9; - border-color: #285e8e; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - -o-transition: height .35s ease; - transition: height .35s ease; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: 0; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - filter: alpha(opacity=0); - opacity: 0; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #428bca; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #777; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #777; -} -.navbar-inverse .navbar-nav > li > a { - color: #777; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #777; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #777; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #428bca; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar[aria-valuenow="1"], -.progress-bar[aria-valuenow="2"] { - min-width: 30px; -} -.progress-bar[aria-valuenow="0"] { - min-width: 30px; - color: #777; - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; -} -.media > .pull-left { - margin-right: 10px; -} -.media > .pull-right { - margin-left: 10px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #428bca; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #428bca; -} -.panel-primary > .panel-heading .badge { - color: #428bca; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #428bca; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate3d(0, -25%, 0); - -o-transform: translate3d(0, -25%, 0); - transform: translate3d(0, -25%, 0); -} -.modal.in .modal-dialog { - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/lemonldap-ng-manager/example/skins/default/css/manager.css b/lemonldap-ng-manager/example/skins/default/css/manager.css deleted file mode 100644 index f345a7279..000000000 --- a/lemonldap-ng-manager/example/skins/default/css/manager.css +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Lemonldap::NG styles - * Commin styles for Manager - * - * Coding rules: - * selector - * { - * property:value; - * } - */ - -/* Main */ -html,body -{ - margin:0; - padding:0; - height:100%; - min-height:100%; - background: rgb(0,0,0); -} - -body -{ - padding-top: 60px; -} - -img.brand -{ - height:25px; -} - -ul -{ - text-align: left; - list-style-position:inside; - list-style-image:url("../images/bullet_orange.png"); -} - -/* Buttons, Inputs*/ -.buttons -{ - margin: 10px 0; -} - -input, select, textarea -{ - font-weight:bold; -} - -textarea.elastic { - max-height: 8em; - font:bold 9pt sans-serif; -} - -textarea#filearea -{ - font-size:8pt; - font-family:monospace; - background-color:#ddd; -} - -input#text, input#int, input#password, select -{ - text-align:center; -} - -div.int -{ - width: 200px; - margin: auto; -} - -input#applicationListApplicationLogo -{ - height: 56px; -} - -input#skinText -{ - height: 153px; -} - -input#authOptions -{ - margin: 10px 0; -} - -option -{ - margin:5px; -} - -/* Divs */ -#menu, #data -{ - overflow-x:hidden; - overflow-y:auto; -} - -#buttons, #edition, #help -{ - text-align:center; -} - - -#help_content -{ - padding:5px; - overflow:hidden; - text-align:center; -} - -#help_content iframe -{ - width:100%; - height:100%; -} - -#query-switch -{ - padding:0; - margin:10px 0; -} - -/* Popup */ -#popup h3 -{ - text-align:center; - letter-spacing:2px; - border-bottom:1px solid #aaa; - padding:5px; - margin:5px 50px; -} - -#popup ul -{ - list-style-position:inside; - list-style-image:url("../images/bullet_green.png"); - margin:0; - padding:0; -} - -#popup ul.warning { - list-style-image:url("../images/bullet_orange.png"); -} - -#popup ul.error { - list-style-image:url("../images/bullet_red.png"); -} - -.ui-dialog { - border:1px solid #000; - box-shadow:1px 1px 15px #555; - -moz-box-shadow:1px 1px 15px #555; - -webkit-box-shadow:1px 1px 15px #555; -} - -/* Skin selection */ -input#skinText { - text-align: center; -} - -#content_skin img, #skinImagePicker img, #content_applicationListApplication img, #appsLogoPicker img { - margin: 5px; -} - -#skinImagePicker, #appsLogoPicker, #css-switch { - text-align: center; -} - diff --git a/lemonldap-ng-manager/example/skins/default/css/tree.css b/lemonldap-ng-manager/example/skins/default/css/tree.css deleted file mode 100644 index db89200f7..000000000 --- a/lemonldap-ng-manager/example/skins/default/css/tree.css +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Lemonldap::NG styles - * Default theme for Manager - */ - -@import url(manager.css); - -.simpleTree -{ - overflow:auto; - margin:0; - padding:0; -} -.simpleTree li -{ - list-style: none; - margin:0; - padding:0 0 0 34px; - line-height: 14px; -} -.simpleTree li span -{ - display:inline; - clear: left; - white-space: nowrap; - cursor:pointer; -} -.simpleTree ul -{ - margin:0; - padding:0; -} -.simpleTree .root -{ - margin-left:-16px; - background: url(../images/tree/root.gif) no-repeat 16px 0 transparent; - /*background-position: -84px -1646px;width:16px*/ -} -.simpleTree .line -{ - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: url(../images/tree/tree.png) 0 0 no-repeat transparent; - background-position: -84px -1322px; -} -.simpleTree .line-last -{ - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: url(../images/tree/tree.png) 0 0 no-repeat transparent; - background-position: -84px -1712px; -} -.simpleTree .line-over -{ - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: url(../images/tree/tree.png) 0 0 no-repeat transparent; - background-position: -84px -1392px; -} -.simpleTree .line-over-last -{ - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: url(../images/tree/tree.png) 0 0 no-repeat transparent; - background-position: -84px -1462px; -} -.simpleTree .folder-open -{ - margin-left:-16px; - background: url(../images/tree/tree.png) 0 -2px no-repeat transparent; - background-position: 0 -72px;width: 34px; -} -.simpleTree .folder-open-last -{ - margin-left:-16px; - background: url(../images/tree/tree.png) 0 -2px no-repeat transparent; - background-position: 0 -72px; width: 34px; -} -.simpleTree .folder-close -{ - margin-left:-16px; - background: url(../images/tree/tree.png) 0 -2px no-repeat transparent; - background-position: 0 -1394px; width: 34px;height:14px; -} -.simpleTree .folder-close-last -{ - margin-left:-16px; - background: url(../images/tree/tree.png) 0 -2px no-repeat transparent; - background-position: 0 -1322px; width: 34px;height:16px; -} -.simpleTree .folder-hidden, .simpleTree .folder-hidden-last -{ - display:none; -} -.simpleTree .doc -{ - margin-left:-16px; - background: url(../images/tree/tree.png) 0 -1px no-repeat transparent; - background-position: -84px -72px; width: 32px;height:16px; -} -.simpleTree .doc-last -{ - margin-left:-16px; - background: url(../images/tree/tree.png) 0 -1px no-repeat transparent; - background-position: -84px 0; width: 32px;height:16px; -} -.simpleTree .ajax -{ - background: url(../images/spinner.gif) no-repeat 0 0 transparent; - height: 16px; - display:none; -} -.simpleTree .ajax li -{ - display:none; - margin:0; - padding:0; -} -.simpleTree .trigger -{ - display:inline; - margin-left:-32px; - width: 28px; - height: 11px; - cursor:pointer; -} -.simpleTree .text -{ -} -.simpleTree .active -{ - background-color:#F7BE77; - padding:0px 2px; - border: 1px dashed #444; -} -#drag_container -{ - background:transparent; - color:#000; - font: normal 11px arial, tahoma, helvetica, sans-serif; - border: 1px dashed #767676; -} -#drag_container ul -{ - list-style: none; - padding:0; - margin:0; -} - -#drag_container li -{ - list-style: none; - background-color:transparent; - line-height:18px; - white-space: nowrap; - padding:1px 1px 0px 16px; - margin:0; -} -#drag_container li span -{ - padding:0; -} - -#drag_container li.doc, #drag_container li.doc-last -{ - background: url(../images/tree/tree.png) no-repeat -17px 0 transparent; - background-position: -84px -72px;width:32px; -} -#drag_container .folder-close, #drag_container .folder-close-last -{ - background: url(../images/tree/tree.png) no-repeat -17px 0 transparent; - background-position: 0 -1394px; width: 34px; -} - -#drag_container .folder-open, #drag_container .folder-open-last -{ - background: url(../images/tree/tree.png) no-repeat -17px 0 transparent; - background-position: 0 -72px; width: 34px; -} - -.content -{ - display: block; -} -.hidden -{ - display: none; -} diff --git a/lemonldap-ng-manager/example/skins/default/images/1downarrow_16x16.png b/lemonldap-ng-manager/example/skins/default/images/1downarrow_16x16.png deleted file mode 100644 index c83e9dc5788abfebd679e8444e0516a72f2eb3fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 657 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 Z_8%~JoeR+><01e6002ovPDHLkV1lWmmtg<^ diff --git a/lemonldap-ng-manager/example/skins/default/images/apps-logos/bookmark.png b/lemonldap-ng-manager/example/skins/default/images/apps-logos/bookmark.png deleted file mode 100644 index f762a24bcbb70ca2226d1d7bddaac49eea957e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1757 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 RU;zLC002ovPDHLkV1mmsy)^&; diff --git a/lemonldap-ng-manager/example/skins/default/images/apps-logos/custom.png b/lemonldap-ng-manager/example/skins/default/images/apps-logos/custom.png deleted file mode 100644 index 5f372867d7ea27b50aee1876b0615760a4a9f385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2079 zcmV+)2;ldLP){x9>U2&ffkH0PAI@=XgU7xZt=4HA_8VFAU(#rz&EN6gI3NJ&YN zbFs0pI5;?{Y6b=dXliOwSXe06{rvpod`wKtt9L7Z^*~)+{Yz;%;_2x{R#vv03lEPV zIXOjDi;RqtZE^8oxjt*wEHpGUxP80)rF&HZl!4CNZ?TBJj8)8KtYe!Iv1QC9)scQ< z!_c#y&+w>=bTPEX*fmF08|1!CwtemV{wd(*|h9NW0>u}QeXs3kvOoA^&`6Mn=b z{3mq*_DMhCne_{Q$-a(v_Ai1`yf>BNDQG$Jo+2B=VH5D&_%qrayD~4MRh(DWRdl=b zr0*bG<|KbD=d5N#;geg6-~ zP1x(IBQukZ&|QBZuFFr*P0t9$mTRh-f9`cm?Of@g(~nN9smzC^M0CjQ%Q5hMuA zD--^0+%}Y{3z(czO7ONj1Z*oKP&5UKfdF9xgl#$EyZI`b9dwxBlZna583b-EQ`Lg< zZs8cbP4@d3ThO_CA40a@kqO&TPH4eB7VW%Cu(0kq57Y%rU4N6Xg8PIN+$CuHZNV)< zcH9$`tB!>1ET?O)cQCe^g1!4vv9z@ow(}kVTT9W>)|F$k@$(4(>>d%j?-RcF9+7(< z5?%O6y9n5koOwwC0t| z;ty02cc@NY8edc?6Zh9j5)M=nwfh$O1I^LuphNVYGL{~EOwyq$mKIkFYFPGVt;p37 zy8nr~0PkJZEEi46#-!pZ;aAIp%MVwRbhwsf2P;{AtdWG%uf=vYT->NGAY`9tI-zW=W6cSH za!A;ezdaFtEo;ug%JZ=P!!$yirm$$wBQ{=wHOjgWwBq1>G&D8op>IU^#}`OHT}S$< zXRJM4FKi`*ApJ6ITCs|} z*hn@;1kuM}Dg|XiP|0)FioQ%Sx8dw_K2q}abKy6VDMW7&$F^R9eRtu|WB63eWSnnD zK+^FBa>P*9-y6vKMsQB>t}u-NBLg;zo|u!|v;ldkN7i zxBxlgK;FOLb8&Qk6>R(-=B_EkVrDRU1BW3=lDdFY@sj-S8ps!m^2KZOzY|LY1-Hd3 z3QE`#ABxWhK_mu5bLT=aA1OjGcU(n!$qmwu+~(9%5D(`}9h?-RcHD&M{1dqQhVkyu zfjC+YXNIjMmcxzdW7tbwz=o1)KD|`Uu8TG7x>QTS#VU6HECif;NMULsUlrt&_u)FO z96i9&m^k_m8NtMfqcQBJFTbeoU>iJQ*AtMr53gmLa3AZ$0y_sbL`71tB9$;V4`M>S zah*Ad;nv143Q#UkQuvQ@4*Xcfk^em5+72 z$dqZ$)0i>ag}H97c)88T#bXYct5)N!n8&8Ip%mqQ!UC7~nKx$!OB7+)53)jfOJbtc zXcA`o;xcOzl8!`DkPo}orr|Tz35DIb_62ylCF1^m6mbD-S)|AyG%S&<eAS~D6YY9l2K1~I(1SPP*+#4hK`Po zT&t+4lw+k;#>#w4kCv8}oO}GZn##(m7xuksUQK|~|1GAbrgF{O+nb`IBH1cqWxl0H zUteF&B_t%Uc=6&F_Wj6*V7i%Z}F>{2#Q?b?LE9U6%j=002ov JPDHLkV1j}K1HJ$N diff --git a/lemonldap-ng-manager/example/skins/default/images/apps-logos/database.png b/lemonldap-ng-manager/example/skins/default/images/apps-logos/database.png deleted file mode 100644 index 51187383a2f49bf2ee091cec91c826d4ce916bf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2775 zcmV;|3Mlo7P)lpaE}y^Q`~Lp~L!qB9E-ds#t82()=4no)5L#eKc^}XIf5`0wUeD)q zy-iJ6R!fNfWHC$>#HhYO;1n#b!Ktl z`<+|2+Kr8kluKpGei`ip7^rMut;TDqNg;4;8#fdpx0vPP;ANE7|IwUEy&|-jU8}(V zCE$*Xj=Yyy$n-wCXD`b0DS0J~5eQ)r6-Z;gT#3(#7=#cQ1deMF4o0~&aEXP*#gVRU z-A`Fk-o8J-wY3$14?aB3LMHQ%1A~`e+5hBzip3SQsw{>81E#`UN)1@6%na@rW4292jc69Cs^6(Vv4G zgO*TSDdL7Ah^6IdzzsYOykjRDlK|@j0oTc| z)EBOT5+Kwnn9$}v0c8wEX$%6}5-8=<+}xZ3uzk-1P)2LAi&?_qDwOiEg#c**KGGK0 zo&?KANP*NEX+TR+Ig0m=9w=iFWq~mYg~liYMxlg27{f|Y;dwq~uj~QX>2w-kMhJ3~ zlhe_7B0;HGq$~tdI!FsFB~el$eT9$$gg^>`5a6$k0LEYpXf(!vQ3`DgMr(`_SdPuu zty?s2+`x^Yp<4jbR|;P#cf-aeTL{g}^bAUCJm0767x8=_Pboa5P`-z+6k2Jt_E4Te zX@89=l=0BY;Cl+CHCib=UsF~-%J&$(F~s)n9*U)Mpjav+lZgb$L?T)8{os)!N9aF) zj&LYMz;SS_0FG_rN{J&S(sr;d3){A^EEn5#u&rRl94sq{L+y>;xGT|hg`aR8DqdJmpJs?(=2A@ zxiT<7E}th93R6>4MJ%?CP$-O$07^qC10gnTYH9|sBasMzn_bE>G%~`g-~A5%@Www;AFpR(a*8+p`CoYc(6hYw z;x`F~TqefH>A%p=c=|S#7=k4vfq={Q&Q99eHzRGEOP2=t&tLqK>qA5A*wI7!_6WcG z+_NMS>lwH@NUW|d2w*QPEC9?0gO>lx_mA06?0uBifAD>d{^BUPdx6a4Dfub8=W zhg}cvWa|T4X>HrW-Ao4Vr)NV=RSf~x;pW&F7y2)9{=x-jrY2}jZKAe1O7EekaorH_ z{_N-M+5Hf6bFOqp^voejr6Om~UtoB2n4v3!j1J#m z5{k%`H1R`M%U*HrV=Q%};>wT-&k7$d_sxji{azL2G* zrG?w+@wwZ##;^gQl%GF!>h#>7eEZwAuf6u?TpAeU#HrIHJ@7H%Lwds{o}8Cr_T{&9{EamW~caM~3<1BY(jB z!lE}jGkq5jA{L9;p65ljb!~s+?VrATB)62|?|$_6Boj$)jEoWuMfk?od+F)kP9hm6 zo6V8W=g7=wSkC9r#t;ewiPgmjhk`_Fsww0O+!!9_gX14@=FB;E^z=|D<#~MXV?6&t zFW>v#tJmK7$=kh=NF;5&{PN3IcXzitH#;lG$0wiPwyo28=BfQ$yFSE9A?k3ad8D}z_4udgN9*ueA8 z9-?E*7T$j6T~43u`?o!N_Vn%8v7;!4hld>@M09X)u<6~Oz4uyEbNe4Yd+-2TIyRHO zb(4=zoMia=5G%zZ>(({U(eVI@#w5Ar0>xqx1W4N=R$D`MDa-KiFf%jLSW=KmweaAB z57ODOg_~n(E)QPe%$bwtAA5B7UmQI6%oVNmg3wx9#+Zl@VqITfU)P&&z4d2}8&e0p za#8HsxszuO9$&BLX#_uS2~ zwA0d>;`a}Kiw8Eh;|2p13k7od9L1Fte5LQl0o!$mgu_HaK|D`0J2%U*Umxe!AAU%4 z(?(Mj3HA5(zVPD%2M(MA(!e~ha*u!o1c4Z^K9k9G96fq;-oQa0djyRD!rj#wLlF5bwC10&Cbqto;Y!0$Cg2CXe%8sWiz)L_8@TpYs;!CCDF=a&((R7c04vs%vR_8vo*Hru8Mi_xP;rwBIDFn1nabj2pj5G9MP_f! dj(@9V|6d8I?Id#=M?L@m002ovPDHLkV1i_+NdW)= diff --git a/lemonldap-ng-manager/example/skins/default/images/apps-logos/demo.png b/lemonldap-ng-manager/example/skins/default/images/apps-logos/demo.png deleted file mode 100644 index 1b69600003594bd734dff72b00523e7ff061c00a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2247 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 z 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 FV1hnRm_Yyl diff --git a/lemonldap-ng-manager/example/skins/default/images/apps-logos/network.png b/lemonldap-ng-manager/example/skins/default/images/apps-logos/network.png deleted file mode 100644 index e74a67f444fafe56efc2f6a51ca18bd304ede532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2531 zcmV<92^{u`P)4}ZAe8(6d{q6Br0hWr4end_ESIfQ!7PLk`L)d zT1BcVMI}|0iqa6=xFL`Q(S%f@Kn;f225h{H$IFaozjtQt{x0X7ei(ubV;9s%dZbt9 zmCpZnp7WgZJV!X^_#oyS$d7+l1G}WwxA#PPuczcT2QD*quGKcDtVw@~bJN*#Uo--c zQoQfH;)4K)kN#T$Pahf|>iOe6+Y0+{8p(^%z8pDU0?>*r3)MCk7n=6WY~#(j<@UFo z%O1_1{k@jb|2M?@0^}b!a;Q=Y{%Ze@;>f|B6?Ts0DdjaifkrEd6Od(=b|<6OO1Zq) z;+3;iUVf`~d40Y4W%G-N9tXHlFyxJd|K`XAE$)5%pDVrLcRq4paOAgta~t;_7@&~z zh~5?#a&uy>BvGiT6nrK}d%5SpAotxlykm5v_+9n!!{7SmQ=8(cfEP~J7%YYeDOhc!)SB6*H!{{+mPR|J z(={Z$qC& zqJ&_rnKCt+=1Oz*F3N+aP!BEb-#0OYPRdObJY(;p~h1ZsU?YVG-At2 zGi7xnK`Y7b?LG8{n$@+0W}LCQ5p(i#gK8tj7>F$_HZu0^D6-Kq96P(l+4&~xt&AWF zICi@F;s2RwO>Bw4KRj1E&}ellp(iOs9z&%7r4{v-WzSHK+a?NJTIq6prcNhYXJ)z0 zSbvUk-eYF5gUK8%V_9vc{Kiy?T07;$rTXSYWdxp$*xi5k%{>?21u$Pr z4_afE`3ZW*Dk~3F3oSN$}RP?!JB+oA|)oFJf zAKul6FC9l`8{|Swy=l4UKtFTK4UWInK}y4!tMT?N5%9Dal~N#`#8;C2+wd(kzyf4 z`;x%(aYE2Fj$Gsc5c!JOSb{*YZ#++_N1>M_1H};QAWjXfIHQ#qv?mZ<5D3OcdMV_* zc1*3wrB7#b`lLa1|F0Q^wBK0MSr-Achz0-VKU7UwKVY~Bq@2?mM* zeZ_z%^!Ui`G6u;{POkIFFIHG>WprYT?7Ou$e(37%b=5G1`0Xj*0N}7J#qc zm#a>VmwsBR6hLhjZ(}VGT>XiuSp0Ozoo0c)|=5ei9~ z7~ZNTtaUSb^B#Vr2t3Vd(-3JvyJP5f65_-V1&ZA}irhZcN4{9H^~^tft>(J`{_LaC z%eRadjtq_TA?0QXHrA3E$67PSW`=q@;fYt)m|cwVoFvU0ao1uqi^MTG5HMc$=+ArX z8p*MJFr-xQA1mFAXPX;G$0I*rC4}at9U!I&8S|1oGqdbL{0s##5`bY_H%+}dx zCe%9#jc&?DBW0tRkfw&cqd7jdugGV9ZGf@<97`K9oy5{VSf*GhuRit{fBqHTW7hy| z7WbJ;`r?aEJ^Q!2Cx#drDp4u~43t9JiDkYPBZS5|h>fG0SbPPQyk^g6L^-bzPSA=C z)n>wAIbzq&A}mc;CByw=AmY* zt(I0ckU}7oLP$kE&yF7OKk#HRglap(Nku;L5CW1ULzs*taR{mC#Kykx z!ke!@^}U}x)2yz|6M7vS%jocRmR_25Yd^Esk3jRRp}cn$SOk0-hN|0+mw)vA=l)~* z%*@1XckbCgHa<9Bsf4|SNXf_-I6yc-Y(&=X#ElCV<}bbS(&>|@-k83SBuR%bNN{!o z#3EU;ey#Wx0M|L?#N?MYK%56sgxKx{+C)*1)z_NmPMMCv zS{n6Eytr7~Sh!lPEzVc#8|#fulndK&H*F+IR>g@cNO1*|HQ##*wsghr!o!)E{L(Ve z7ElvXj7cT?J>M&ZkzdeCHJo$H#yTaXl-4?zWyV-zGp$t;Mt;}#bzMohCIqX%Jg|&) zZ8!6G_I&}~hA_Z}-u0EXKr9I%dWE1YgeXcW3QEe*_p~2`o|dU}TB}TJ8A~ZTLWl-} zbp-1m>O#=5(+_9Y)43tQuPi(JmnpEm`_qqX01HCkA@Bju;k0!q=WuLhbq1twdjgo| tiLbry%l8Alj^AYt5Z8WQGw}bg{{_YmjtWofDm?%I002ovPDHLkV1i}n@(KU| diff --git a/lemonldap-ng-manager/example/skins/default/images/apps-logos/terminal.png b/lemonldap-ng-manager/example/skins/default/images/apps-logos/terminal.png deleted file mode 100644 index 08d186924b16be71ab62e9b48c7d649249493b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 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 diff --git a/lemonldap-ng-manager/example/skins/default/images/bullet_red.png b/lemonldap-ng-manager/example/skins/default/images/bullet_red.png deleted file mode 100644 index 0cd803115831933aa171497cfe9c1af983035f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=8^mK6yu{izqk}mh50EX6wkMFui zZg|fh<-*g%H9O|;u|DY#DW^u;K&o-|vHe`x?xbw1zYx$2><(A#;6QU!sSfhO( ioL~suuJh6Vfb_?jd)=>7iZy|bXYh3Ob6Mw<&;$Tq>~Ep~ diff --git a/lemonldap-ng-manager/example/skins/default/images/logo_lemonldap-ng.png b/lemonldap-ng-manager/example/skins/default/images/logo_lemonldap-ng.png deleted file mode 100644 index 6e2957309bc71b197dc8cb6874dc143c6962f028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4798 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 diff --git a/lemonldap-ng-manager/example/skins/default/images/spinner.gif b/lemonldap-ng-manager/example/skins/default/images/spinner.gif deleted file mode 100644 index 085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? diff --git a/lemonldap-ng-manager/example/skins/default/images/tree/root.gif b/lemonldap-ng-manager/example/skins/default/images/tree/root.gif deleted file mode 100644 index d693fa166f7480f593929b5e7345107e287c829c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 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 diff --git a/lemonldap-ng-manager/example/skins/default/js/bootstrap.js b/lemonldap-ng-manager/example/skins/default/js/bootstrap.js deleted file mode 100644 index 53da1c77c..000000000 --- a/lemonldap-ng-manager/example/skins/default/js/bootstrap.js +++ /dev/null @@ -1,2114 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.2.0 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.2.0 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.2.0' - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.2.0 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.2.0' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - $el[val](data[state] == null ? this.options[state] : data[state]) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.2.0 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.2.0' - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.keydown = function (e) { - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var href - var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - if (!$target.hasClass('carousel')) return - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.2.0 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.2.0' - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - Plugin.call(actives, 'hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var href - var $this = $(this) - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.2.0 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.2.0' - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('