From 3eeeb27d70ad7d761b1e280d24d717a4ee775a3b Mon Sep 17 00:00:00 2001 From: sxq <812980466@qq.com> Date: Wed, 20 Oct 2021 11:32:31 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90xxl-job-admin=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=8F=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 +- ruoyi-extend/pom.xml | 1 + ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile | 11 + ruoyi-extend/ruoyi-xxl-job-admin/pom.xml | 113 + .../xxl/job/admin/XxlJobAdminApplication.java | 16 + .../job/admin/controller/IndexController.java | 96 + .../admin/controller/JobApiController.java | 72 + .../admin/controller/JobCodeController.java | 96 + .../admin/controller/JobGroupController.java | 197 + .../admin/controller/JobInfoController.java | 180 + .../admin/controller/JobLogController.java | 233 + .../job/admin/controller/UserController.java | 179 + .../annotation/PermissionLimit.java | 29 + .../interceptor/CookieInterceptor.java | 43 + .../interceptor/PermissionInterceptor.java | 59 + .../controller/interceptor/WebMvcConfig.java | 28 + .../resolver/WebExceptionResolver.java | 66 + .../xxl/job/admin/core/alarm/JobAlarm.java | 20 + .../xxl/job/admin/core/alarm/JobAlarmer.java | 65 + .../admin/core/alarm/impl/EmailJobAlarm.java | 117 + .../admin/core/complete/XxlJobCompleter.java | 99 + .../admin/core/conf/XxlJobAdminConfig.java | 158 + .../job/admin/core/cron/CronExpression.java | 1666 +++ .../admin/core/exception/XxlJobException.java | 14 + .../xxl/job/admin/core/model/XxlJobGroup.java | 77 + .../xxl/job/admin/core/model/XxlJobInfo.java | 237 + .../xxl/job/admin/core/model/XxlJobLog.java | 157 + .../job/admin/core/model/XxlJobLogGlue.java | 75 + .../job/admin/core/model/XxlJobLogReport.java | 54 + .../job/admin/core/model/XxlJobRegistry.java | 55 + .../xxl/job/admin/core/model/XxlJobUser.java | 73 + .../job/admin/core/old/RemoteHttpJobBean.java | 32 + .../core/old/XxlJobDynamicScheduler.java | 413 + .../job/admin/core/old/XxlJobThreadPool.java | 58 + .../core/route/ExecutorRouteStrategyEnum.java | 48 + .../job/admin/core/route/ExecutorRouter.java | 24 + .../route/strategy/ExecutorRouteBusyover.java | 48 + .../strategy/ExecutorRouteConsistentHash.java | 85 + .../route/strategy/ExecutorRouteFailover.java | 48 + .../route/strategy/ExecutorRouteFirst.java | 19 + .../core/route/strategy/ExecutorRouteLFU.java | 79 + .../core/route/strategy/ExecutorRouteLRU.java | 76 + .../route/strategy/ExecutorRouteLast.java | 19 + .../route/strategy/ExecutorRouteRandom.java | 23 + .../route/strategy/ExecutorRouteRound.java | 46 + .../core/scheduler/MisfireStrategyEnum.java | 39 + .../core/scheduler/ScheduleTypeEnum.java | 46 + .../admin/core/scheduler/XxlJobScheduler.java | 101 + .../admin/core/thread/JobCompleteHelper.java | 184 + .../core/thread/JobFailMonitorHelper.java | 110 + .../admin/core/thread/JobLogReportHelper.java | 152 + .../admin/core/thread/JobRegistryHelper.java | 204 + .../admin/core/thread/JobScheduleHelper.java | 369 + .../core/thread/JobTriggerPoolHelper.java | 150 + .../admin/core/trigger/TriggerTypeEnum.java | 27 + .../job/admin/core/trigger/XxlJobTrigger.java | 226 + .../xxl/job/admin/core/util/CookieUtil.java | 98 + .../com/xxl/job/admin/core/util/FtlUtil.java | 31 + .../com/xxl/job/admin/core/util/I18nUtil.java | 79 + .../xxl/job/admin/core/util/JacksonUtil.java | 92 + .../job/admin/core/util/LocalCacheUtil.java | 133 + .../com/xxl/job/admin/dao/XxlJobGroupDao.java | 37 + .../com/xxl/job/admin/dao/XxlJobInfoDao.java | 49 + .../com/xxl/job/admin/dao/XxlJobLogDao.java | 62 + .../xxl/job/admin/dao/XxlJobLogGlueDao.java | 24 + .../xxl/job/admin/dao/XxlJobLogReportDao.java | 26 + .../xxl/job/admin/dao/XxlJobRegistryDao.java | 38 + .../com/xxl/job/admin/dao/XxlJobUserDao.java | 31 + .../xxl/job/admin/service/LoginService.java | 110 + .../xxl/job/admin/service/XxlJobService.java | 86 + .../job/admin/service/impl/AdminBizImpl.java | 35 + .../admin/service/impl/XxlJobServiceImpl.java | 434 + .../src/main/resources/application.properties | 65 + .../main/resources/i18n/message_en.properties | 276 + .../resources/i18n/message_zh_CN.properties | 276 + .../resources/i18n/message_zh_TC.properties | 276 + .../src/main/resources/logback.xml | 29 + .../mybatis-mapper/XxlJobGroupMapper.xml | 91 + .../mybatis-mapper/XxlJobInfoMapper.xml | 240 + .../mybatis-mapper/XxlJobLogGlueMapper.xml | 71 + .../mybatis-mapper/XxlJobLogMapper.xml | 273 + .../mybatis-mapper/XxlJobLogReportMapper.xml | 62 + .../mybatis-mapper/XxlJobRegistryMapper.xml | 62 + .../mybatis-mapper/XxlJobUserMapper.xml | 87 + .../Ionicons/css/ionicons.min.css | 11 + .../Ionicons/fonts/ionicons.eot | Bin 0 -> 120724 bytes .../Ionicons/fonts/ionicons.svg | 2230 ++++ .../Ionicons/fonts/ionicons.ttf | Bin 0 -> 188508 bytes .../Ionicons/fonts/ionicons.woff | Bin 0 -> 67904 bytes .../bower_components/PACE/pace.min.js | 2 + .../PACE/themes/blue/pace-theme-flash.css | 77 + .../daterangepicker.css | 269 + .../daterangepicker.js | 1653 +++ .../bootstrap/css/bootstrap.min.css | 6 + .../bootstrap/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../bootstrap/js/bootstrap.min.js | 6 + .../css/dataTables.bootstrap.min.css | 1 + .../js/dataTables.bootstrap.min.js | 8 + .../js/jquery.dataTables.min.js | 166 + .../bower_components/fastclick/fastclick.js | 841 ++ .../font-awesome/css/font-awesome.css.map | 7 + .../font-awesome/css/font-awesome.min.css | 4 + .../font-awesome/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../fonts/fontawesome-webfont.svg | 2671 +++++ .../fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../jquery.slimscroll.min.js | 16 + .../bower_components/jquery/jquery.min.js | 2 + .../bower_components/moment/moment.min.js | 1 + .../adminlte/plugins/iCheck/icheck.min.js | 10 + .../adminlte/plugins/iCheck/square/blue.css | 62 + .../adminlte/plugins/iCheck/square/blue.png | Bin 0 -> 2185 bytes .../plugins/iCheck/square/blue@2x.png | Bin 0 -> 4485 bytes .../src/main/resources/static/favicon.ico | Bin 0 -> 4286 bytes .../src/main/resources/static/js/common.1.js | 156 + .../src/main/resources/static/js/index.js | 207 + .../resources/static/js/jobcode.index.1.js | 97 + .../resources/static/js/jobgroup.index.1.js | 359 + .../resources/static/js/jobinfo.index.1.js | 739 ++ .../resources/static/js/joblog.detail.1.js | 91 + .../resources/static/js/joblog.index.1.js | 396 + .../src/main/resources/static/js/login.1.js | 66 + .../main/resources/static/js/user.index.1.js | 328 + .../codemirror/addon/hint/anyword-hint.js | 41 + .../codemirror/addon/hint/show-hint.css | 36 + .../codemirror/addon/hint/show-hint.js | 434 + .../plugins/codemirror/lib/codemirror.css | 346 + .../plugins/codemirror/lib/codemirror.js | 9698 +++++++++++++++++ .../plugins/codemirror/mode/clike/clike.js | 879 ++ .../codemirror/mode/javascript/javascript.js | 899 ++ .../static/plugins/codemirror/mode/php/php.js | 234 + .../codemirror/mode/powershell/powershell.js | 398 + .../plugins/codemirror/mode/python/python.js | 409 + .../plugins/codemirror/mode/shell/shell.js | 152 + .../static/plugins/cronGen/cronGen.js | 1106 ++ .../static/plugins/cronGen/cronGen_en.js | 1106 ++ .../plugins/echarts/echarts.common.min.js | 22 + .../static/plugins/jquery/jquery.cookie.js | 117 + .../plugins/jquery/jquery.validate.min.js | 4 + .../resources/static/plugins/layer/layer.js | 2 + .../plugins/layer/theme/default/icon-ext.png | Bin 0 -> 5911 bytes .../plugins/layer/theme/default/icon.png | Bin 0 -> 11493 bytes .../plugins/layer/theme/default/layer.css | 1 + .../plugins/layer/theme/default/loading-0.gif | Bin 0 -> 5793 bytes .../plugins/layer/theme/default/loading-1.gif | Bin 0 -> 701 bytes .../plugins/layer/theme/default/loading-2.gif | Bin 0 -> 1787 bytes .../templates/common/common.exception.ftl | 31 + .../templates/common/common.macro.ftl | 239 + .../src/main/resources/templates/help.ftl | 47 + .../src/main/resources/templates/index.ftl | 147 + .../templates/jobcode/jobcode.index.ftl | 164 + .../templates/jobgroup/jobgroup.index.ftl | 172 + .../templates/jobinfo/jobinfo.index.ftl | 540 + .../templates/joblog/joblog.detail.ftl | 72 + .../templates/joblog/joblog.index.ftl | 180 + .../src/main/resources/templates/login.ftl | 45 + .../resources/templates/user/user.index.ftl | 188 + 164 files changed, 38579 insertions(+), 2 deletions(-) create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/pom.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.properties create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/css/ionicons.min.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.eot create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.svg create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.ttf create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.woff create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css.map create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/js/bootstrap.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/fastclick/fastclick.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/css/font-awesome.css.map create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/css/font-awesome.min.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/FontAwesome.otf create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/jquery/jquery.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/moment/moment.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/icheck.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.png create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue@2x.png create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/favicon.ico create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/common.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/index.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/jobcode.index.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.index.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/login.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/anyword-hint.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/clike/clike.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/javascript/javascript.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/php/php.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/powershell/powershell.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/python/python.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/shell/shell.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen_en.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/echarts/echarts.common.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.cookie.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.validate.min.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/layer.js create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon-ext.png create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon.png create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/layer.css create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-0.gif create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-1.gif create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-2.gif create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/common/common.exception.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/help.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/index.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/jobcode/jobcode.index.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/login.ftl create mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/user/user.index.ftl diff --git a/pom.xml b/pom.xml index ab8fe420c..9c3b5dfbe 100644 --- a/pom.xml +++ b/pom.xml @@ -52,8 +52,20 @@ http://${docker.registry.url}:2375 ruoyi 1.2.2 + + + 4.1.58.Final + 2.8.6 + 3.0.7 + 5.3.3 + 1.7.30 + 1.3.2 + 2.1.4 + 8.0.23 + 2.3.0 + - + @@ -391,4 +403,4 @@ - \ No newline at end of file + diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index 6378eb9b8..bee911742 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -13,6 +13,7 @@ ruoyi-monitor-admin + ruoyi-xxl-job-admin diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile b/ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile new file mode 100644 index 000000000..dc1953712 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile @@ -0,0 +1,11 @@ +FROM openjdk:8-jre-slim +MAINTAINER xuxueli + +ENV PARAMS="" + +ENV TZ=PRC +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +ADD target/xxl-job-admin-*.jar /app.jar + +ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"] \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml new file mode 100644 index 000000000..c0ff2fabe --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml @@ -0,0 +1,113 @@ + + 4.0.0 + + ruoyi-extend + com.ruoyi + 3.2.0 + + ruoyi-xxl-job-admin + jar + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring-boot.version} + pom + import + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.springframework.boot + spring-boot-starter-freemarker + + + + + org.springframework.boot + spring-boot-starter-mail + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} + + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + + + + + com.xuxueli + xxl-job-core + ${xxl-job-core-version} + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + com.spotify + docker-maven-plugin + 0.4.13 + + + ${project.artifactId}:${project.version} + ${project.basedir} + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + + + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java new file mode 100644 index 000000000..fce10a81a --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java @@ -0,0 +1,16 @@ +package com.xxl.job.admin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author xuxueli 2018-10-28 00:38:13 + */ +@SpringBootApplication +public class XxlJobAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(XxlJobAdminApplication.class, args); + } + +} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java new file mode 100644 index 000000000..eb63f0bd4 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -0,0 +1,96 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.controller.annotation.PermissionLimit; +import com.xxl.job.admin.service.LoginService; +import com.xxl.job.admin.service.XxlJobService; +import com.xxl.job.core.biz.model.ReturnT; +import org.springframework.beans.propertyeditors.CustomDateEditor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +/** + * index controller + * @author xuxueli 2015-12-19 16:13:16 + */ +@Controller +public class IndexController { + + @Resource + private XxlJobService xxlJobService; + @Resource + private LoginService loginService; + + + @RequestMapping("/") + public String index(Model model) { + + Map dashboardMap = xxlJobService.dashboardInfo(); + model.addAllAttributes(dashboardMap); + + return "index"; + } + + @RequestMapping("/chartInfo") + @ResponseBody + public ReturnT> chartInfo(Date startDate, Date endDate) { + ReturnT> chartInfo = xxlJobService.chartInfo(startDate, endDate); + return chartInfo; + } + + @RequestMapping("/toLogin") + @PermissionLimit(limit=false) + public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) { + if (loginService.ifLogin(request, response) != null) { + modelAndView.setView(new RedirectView("/",true,false)); + return modelAndView; + } + return new ModelAndView("login"); + } + + @RequestMapping(value="login", method=RequestMethod.POST) + @ResponseBody + @PermissionLimit(limit=false) + public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember){ + boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false; + return loginService.login(request, response, userName, password, ifRem); + } + + @RequestMapping(value="logout", method=RequestMethod.POST) + @ResponseBody + @PermissionLimit(limit=false) + public ReturnT logout(HttpServletRequest request, HttpServletResponse response){ + return loginService.logout(request, response); + } + + @RequestMapping("/help") + public String help() { + + /*if (!PermissionInterceptor.ifLogin(request)) { + return "redirect:/toLogin"; + }*/ + + return "help"; + } + + @InitBinder + public void initBinder(WebDataBinder binder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dateFormat.setLenient(false); + binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java new file mode 100644 index 000000000..aa51e7390 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java @@ -0,0 +1,72 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.controller.annotation.PermissionLimit; +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.core.biz.AdminBiz; +import com.xxl.job.core.biz.model.HandleCallbackParam; +import com.xxl.job.core.biz.model.RegistryParam; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.util.GsonTool; +import com.xxl.job.core.util.XxlJobRemotingUtil; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * Created by xuxueli on 17/5/10. + */ +@Controller +@RequestMapping("/api") +public class JobApiController { + + @Resource + private AdminBiz adminBiz; + + /** + * api + * + * @param uri + * @param data + * @return + */ + @RequestMapping("/{uri}") + @ResponseBody + @PermissionLimit(limit=false) + public ReturnT api(HttpServletRequest request, @PathVariable("uri") String uri, @RequestBody(required = false) String data) { + + // valid + if (!"POST".equalsIgnoreCase(request.getMethod())) { + return new ReturnT(ReturnT.FAIL_CODE, "invalid request, HttpMethod not support."); + } + if (uri==null || uri.trim().length()==0) { + return new ReturnT(ReturnT.FAIL_CODE, "invalid request, uri-mapping empty."); + } + if (XxlJobAdminConfig.getAdminConfig().getAccessToken()!=null + && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length()>0 + && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) { + return new ReturnT(ReturnT.FAIL_CODE, "The access token is wrong."); + } + + // services mapping + if ("callback".equals(uri)) { + List callbackParamList = GsonTool.fromJson(data, List.class, HandleCallbackParam.class); + return adminBiz.callback(callbackParamList); + } else if ("registry".equals(uri)) { + RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class); + return adminBiz.registry(registryParam); + } else if ("registryRemove".equals(uri)) { + RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class); + return adminBiz.registryRemove(registryParam); + } else { + return new ReturnT(ReturnT.FAIL_CODE, "invalid request, uri-mapping("+ uri +") not found."); + } + + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java new file mode 100644 index 000000000..fe4a0e848 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -0,0 +1,96 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLogGlue; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.XxlJobInfoDao; +import com.xxl.job.admin.dao.XxlJobLogGlueDao; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.glue.GlueTypeEnum; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; + +/** + * job code controller + * @author xuxueli 2015-12-19 16:13:16 + */ +@Controller +@RequestMapping("/jobcode") +public class JobCodeController { + + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + private XxlJobLogGlueDao xxlJobLogGlueDao; + + @RequestMapping + public String index(HttpServletRequest request, Model model, int jobId) { + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); + List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId); + + if (jobInfo == null) { + throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) { + throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid")); + } + + // valid permission + JobInfoController.validPermission(request, jobInfo.getJobGroup()); + + // Glue类型-字典 + model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); + + model.addAttribute("jobInfo", jobInfo); + model.addAttribute("jobLogGlues", jobLogGlues); + return "jobcode/jobcode.index"; + } + + @RequestMapping("/save") + @ResponseBody + public ReturnT save(Model model, int id, String glueSource, String glueRemark) { + // valid + if (glueRemark==null) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) ); + } + if (glueRemark.length()<4 || glueRemark.length()>100) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit")); + } + XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id); + if (exists_jobInfo == null) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + + // update new code + exists_jobInfo.setGlueSource(glueSource); + exists_jobInfo.setGlueRemark(glueRemark); + exists_jobInfo.setGlueUpdatetime(new Date()); + + exists_jobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(exists_jobInfo); + + // log old code + XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue(); + xxlJobLogGlue.setJobId(exists_jobInfo.getId()); + xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType()); + xxlJobLogGlue.setGlueSource(glueSource); + xxlJobLogGlue.setGlueRemark(glueRemark); + + xxlJobLogGlue.setAddTime(new Date()); + xxlJobLogGlue.setUpdateTime(new Date()); + xxlJobLogGlueDao.save(xxlJobLogGlue); + + // remove code backup more than 30 + xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30); + + return ReturnT.SUCCESS; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java new file mode 100644 index 000000000..4bb4b90a9 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -0,0 +1,197 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobRegistry; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.XxlJobGroupDao; +import com.xxl.job.admin.dao.XxlJobInfoDao; +import com.xxl.job.admin.dao.XxlJobRegistryDao; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.enums.RegistryConfig; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.*; + +/** + * job group controller + * @author xuxueli 2016-10-02 20:52:56 + */ +@Controller +@RequestMapping("/jobgroup") +public class JobGroupController { + + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobRegistryDao xxlJobRegistryDao; + + @RequestMapping + public String index(Model model) { + return "jobgroup/jobgroup.index"; + } + + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + String appname, String title) { + + // page query + List list = xxlJobGroupDao.pageList(start, length, appname, title); + int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title); + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal", list_count); // 总记录数 + maps.put("recordsFiltered", list_count); // 过滤后的总记录数 + maps.put("data", list); // 分页列表 + return maps; + } + + @RequestMapping("/save") + @ResponseBody + public ReturnT save(XxlJobGroup xxlJobGroup){ + + // valid + if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input")+"AppName") ); + } + if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length") ); + } + if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) { + return new ReturnT(500, "AppName"+I18nUtil.getString("system_unvalid") ); + } + if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); + } + if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_title")+I18nUtil.getString("system_unvalid") ); + } + if (xxlJobGroup.getAddressType()!=0) { + if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); + } + if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList")+I18nUtil.getString("system_unvalid") ); + } + + String[] addresss = xxlJobGroup.getAddressList().split(","); + for (String item: addresss) { + if (item==null || item.trim().length()==0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") ); + } + } + } + + // process + xxlJobGroup.setUpdateTime(new Date()); + + int ret = xxlJobGroupDao.save(xxlJobGroup); + return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; + } + + @RequestMapping("/update") + @ResponseBody + public ReturnT update(XxlJobGroup xxlJobGroup){ + // valid + if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input")+"AppName") ); + } + if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length") ); + } + if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); + } + if (xxlJobGroup.getAddressType() == 0) { + // 0=自动注册 + List registryList = findRegistryByAppName(xxlJobGroup.getAppname()); + String addressListStr = null; + if (registryList!=null && !registryList.isEmpty()) { + Collections.sort(registryList); + addressListStr = ""; + for (String item:registryList) { + addressListStr += item + ","; + } + addressListStr = addressListStr.substring(0, addressListStr.length()-1); + } + xxlJobGroup.setAddressList(addressListStr); + } else { + // 1=手动录入 + if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); + } + String[] addresss = xxlJobGroup.getAddressList().split(","); + for (String item: addresss) { + if (item==null || item.trim().length()==0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") ); + } + } + } + + // process + xxlJobGroup.setUpdateTime(new Date()); + + int ret = xxlJobGroupDao.update(xxlJobGroup); + return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; + } + + private List findRegistryByAppName(String appnameParam){ + HashMap> appAddressMap = new HashMap>(); + List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (list != null) { + for (XxlJobRegistry item: list) { + if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { + String appname = item.getRegistryKey(); + List registryList = appAddressMap.get(appname); + if (registryList == null) { + registryList = new ArrayList(); + } + + if (!registryList.contains(item.getRegistryValue())) { + registryList.add(item.getRegistryValue()); + } + appAddressMap.put(appname, registryList); + } + } + } + return appAddressMap.get(appnameParam); + } + + @RequestMapping("/remove") + @ResponseBody + public ReturnT remove(int id){ + + // valid + int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null); + if (count > 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0") ); + } + + List allList = xxlJobGroupDao.findAll(); + if (allList.size() == 1) { + return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_1") ); + } + + int ret = xxlJobGroupDao.remove(id); + return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; + } + + @RequestMapping("/loadById") + @ResponseBody + public ReturnT loadById(int id){ + XxlJobGroup jobGroup = xxlJobGroupDao.load(id); + return jobGroup!=null?new ReturnT(jobGroup):new ReturnT(ReturnT.FAIL_CODE, null); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java new file mode 100644 index 000000000..ea314b323 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -0,0 +1,180 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.core.cron.CronExpression; +import com.xxl.job.admin.core.exception.XxlJobException; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobUser; +import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; +import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum; +import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum; +import com.xxl.job.admin.core.thread.JobScheduleHelper; +import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +import com.xxl.job.admin.core.trigger.TriggerTypeEnum; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.XxlJobGroupDao; +import com.xxl.job.admin.service.LoginService; +import com.xxl.job.admin.service.XxlJobService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; +import com.xxl.job.core.glue.GlueTypeEnum; +import com.xxl.job.core.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.text.ParseException; +import java.util.*; + +/** + * index controller + * @author xuxueli 2015-12-19 16:13:16 + */ +@Controller +@RequestMapping("/jobinfo") +public class JobInfoController { + private static Logger logger = LoggerFactory.getLogger(JobInfoController.class); + + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobService xxlJobService; + + @RequestMapping + public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { + + // 枚举-字典 + model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表 + model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // Glue类型-字典 + model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典 + model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values()); // 调度类型 + model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values()); // 调度过期策略 + + // 执行器列表 + List jobGroupList_all = xxlJobGroupDao.findAll(); + + // filter group + List jobGroupList = filterJobGroupByRole(request, jobGroupList_all); + if (jobGroupList==null || jobGroupList.size()==0) { + throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); + } + + model.addAttribute("JobGroupList", jobGroupList); + model.addAttribute("jobGroup", jobGroup); + + return "jobinfo/jobinfo.index"; + } + + public static List filterJobGroupByRole(HttpServletRequest request, List jobGroupList_all){ + List jobGroupList = new ArrayList<>(); + if (jobGroupList_all!=null && jobGroupList_all.size()>0) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (loginUser.getRole() == 1) { + jobGroupList = jobGroupList_all; + } else { + List groupIdStrs = new ArrayList<>(); + if (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) { + groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); + } + for (XxlJobGroup groupItem:jobGroupList_all) { + if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { + jobGroupList.add(groupItem); + } + } + } + } + return jobGroupList; + } + public static void validPermission(HttpServletRequest request, int jobGroup) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (!loginUser.validPermission(jobGroup)) { + throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username="+ loginUser.getUsername() +"]"); + } + } + + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { + + return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + } + + @RequestMapping("/add") + @ResponseBody + public ReturnT add(XxlJobInfo jobInfo) { + return xxlJobService.add(jobInfo); + } + + @RequestMapping("/update") + @ResponseBody + public ReturnT update(XxlJobInfo jobInfo) { + return xxlJobService.update(jobInfo); + } + + @RequestMapping("/remove") + @ResponseBody + public ReturnT remove(int id) { + return xxlJobService.remove(id); + } + + @RequestMapping("/stop") + @ResponseBody + public ReturnT pause(int id) { + return xxlJobService.stop(id); + } + + @RequestMapping("/start") + @ResponseBody + public ReturnT start(int id) { + return xxlJobService.start(id); + } + + @RequestMapping("/trigger") + @ResponseBody + //@PermissionLimit(limit = false) + public ReturnT triggerJob(int id, String executorParam, String addressList) { + // force cover job param + if (executorParam == null) { + executorParam = ""; + } + + JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); + return ReturnT.SUCCESS; + } + + @RequestMapping("/nextTriggerTime") + @ResponseBody + public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) { + + XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); + paramXxlJobInfo.setScheduleType(scheduleType); + paramXxlJobInfo.setScheduleConf(scheduleConf); + + List result = new ArrayList<>(); + try { + Date lastTime = new Date(); + for (int i = 0; i < 5; i++) { + lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); + if (lastTime != null) { + result.add(DateUtil.formatDateTime(lastTime)); + } else { + break; + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) + e.getMessage()); + } + return new ReturnT>(result); + + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java new file mode 100644 index 000000000..c64049d58 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -0,0 +1,233 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.core.exception.XxlJobException; +import com.xxl.job.admin.core.complete.XxlJobCompleter; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.XxlJobGroupDao; +import com.xxl.job.admin.dao.XxlJobInfoDao; +import com.xxl.job.admin.dao.XxlJobLogDao; +import com.xxl.job.core.biz.ExecutorBiz; +import com.xxl.job.core.biz.model.KillParam; +import com.xxl.job.core.biz.model.LogParam; +import com.xxl.job.core.biz.model.LogResult; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * index controller + * @author xuxueli 2015-12-19 16:13:16 + */ +@Controller +@RequestMapping("/joblog") +public class JobLogController { + private static Logger logger = LoggerFactory.getLogger(JobLogController.class); + + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; + + @RequestMapping + public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) { + + // 执行器列表 + List jobGroupList_all = xxlJobGroupDao.findAll(); + + // filter group + List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all); + if (jobGroupList==null || jobGroupList.size()==0) { + throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); + } + + model.addAttribute("JobGroupList", jobGroupList); + + // 任务 + if (jobId > 0) { + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); + if (jobInfo == null) { + throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid")); + } + + model.addAttribute("jobInfo", jobInfo); + + // valid permission + JobInfoController.validPermission(request, jobInfo.getJobGroup()); + } + + return "joblog/joblog.index"; + } + + @RequestMapping("/getJobsByGroup") + @ResponseBody + public ReturnT> getJobsByGroup(int jobGroup){ + List list = xxlJobInfoDao.getJobsByGroup(jobGroup); + return new ReturnT>(list); + } + + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + int jobGroup, int jobId, int logStatus, String filterTime) { + + // valid permission + JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup + + // parse param + Date triggerTimeStart = null; + Date triggerTimeEnd = null; + if (filterTime!=null && filterTime.trim().length()>0) { + String[] temp = filterTime.split(" - "); + if (temp.length == 2) { + triggerTimeStart = DateUtil.parseDateTime(temp[0]); + triggerTimeEnd = DateUtil.parseDateTime(temp[1]); + } + } + + // page query + List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); + int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal", list_count); // 总记录数 + maps.put("recordsFiltered", list_count); // 过滤后的总记录数 + maps.put("data", list); // 分页列表 + return maps; + } + + @RequestMapping("/logDetailPage") + public String logDetailPage(int id, Model model){ + + // base check + ReturnT logStatue = ReturnT.SUCCESS; + XxlJobLog jobLog = xxlJobLogDao.load(id); + if (jobLog == null) { + throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid")); + } + + model.addAttribute("triggerCode", jobLog.getTriggerCode()); + model.addAttribute("handleCode", jobLog.getHandleCode()); + model.addAttribute("executorAddress", jobLog.getExecutorAddress()); + model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime()); + model.addAttribute("logId", jobLog.getId()); + return "joblog/joblog.detail"; + } + + @RequestMapping("/logDetailCat") + @ResponseBody + public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){ + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); + ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); + + // is end + if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { + XxlJobLog jobLog = xxlJobLogDao.load(logId); + if (jobLog.getHandleCode() > 0) { + logResult.getContent().setEnd(true); + } + } + + return logResult; + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); + } + } + + @RequestMapping("/logKill") + @ResponseBody + public ReturnT logKill(int id){ + // base check + XxlJobLog log = xxlJobLogDao.load(id); + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId()); + if (jobInfo==null) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) { + return new ReturnT(500, I18nUtil.getString("joblog_kill_log_limit")); + } + + // request of kill + ReturnT runResult = null; + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress()); + runResult = executorBiz.kill(new KillParam(jobInfo.getId())); + } catch (Exception e) { + logger.error(e.getMessage(), e); + runResult = new ReturnT(500, e.getMessage()); + } + + if (ReturnT.SUCCESS_CODE == runResult.getCode()) { + log.setHandleCode(ReturnT.FAIL_CODE); + log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():"")); + log.setHandleTime(new Date()); + XxlJobCompleter.updateHandleInfoAndFinish(log); + return new ReturnT(runResult.getMsg()); + } else { + return new ReturnT(500, runResult.getMsg()); + } + } + + @RequestMapping("/clearLog") + @ResponseBody + public ReturnT clearLog(int jobGroup, int jobId, int type){ + + Date clearBeforeTime = null; + int clearBeforeNum = 0; + if (type == 1) { + clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据 + } else if (type == 2) { + clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据 + } else if (type == 3) { + clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据 + } else if (type == 4) { + clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据 + } else if (type == 5) { + clearBeforeNum = 1000; // 清理一千条以前日志数据 + } else if (type == 6) { + clearBeforeNum = 10000; // 清理一万条以前日志数据 + } else if (type == 7) { + clearBeforeNum = 30000; // 清理三万条以前日志数据 + } else if (type == 8) { + clearBeforeNum = 100000; // 清理十万条以前日志数据 + } else if (type == 9) { + clearBeforeNum = 0; // 清理所有日志数据 + } else { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid")); + } + + List logIds = null; + do { + logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000); + if (logIds!=null && logIds.size()>0) { + xxlJobLogDao.clearLog(logIds); + } + } while (logIds!=null && logIds.size()>0); + + return ReturnT.SUCCESS; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java new file mode 100644 index 000000000..3f4c7559b --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java @@ -0,0 +1,179 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.controller.annotation.PermissionLimit; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobUser; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.XxlJobGroupDao; +import com.xxl.job.admin.dao.XxlJobUserDao; +import com.xxl.job.admin.service.LoginService; +import com.xxl.job.core.biz.model.ReturnT; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.DigestUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author xuxueli 2019-05-04 16:39:50 + */ +@Controller +@RequestMapping("/user") +public class UserController { + + @Resource + private XxlJobUserDao xxlJobUserDao; + @Resource + private XxlJobGroupDao xxlJobGroupDao; + + @RequestMapping + @PermissionLimit(adminuser = true) + public String index(Model model) { + + // 执行器列表 + List groupList = xxlJobGroupDao.findAll(); + model.addAttribute("groupList", groupList); + + return "user/user.index"; + } + + @RequestMapping("/pageList") + @ResponseBody + @PermissionLimit(adminuser = true) + public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + String username, int role) { + + // page list + List list = xxlJobUserDao.pageList(start, length, username, role); + int list_count = xxlJobUserDao.pageListCount(start, length, username, role); + + // filter + if (list!=null && list.size()>0) { + for (XxlJobUser item: list) { + item.setPassword(null); + } + } + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal", list_count); // 总记录数 + maps.put("recordsFiltered", list_count); // 过滤后的总记录数 + maps.put("data", list); // 分页列表 + return maps; + } + + @RequestMapping("/add") + @ResponseBody + @PermissionLimit(adminuser = true) + public ReturnT add(XxlJobUser xxlJobUser) { + + // valid username + if (!StringUtils.hasText(xxlJobUser.getUsername())) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input")+I18nUtil.getString("user_username") ); + } + xxlJobUser.setUsername(xxlJobUser.getUsername().trim()); + if (!(xxlJobUser.getUsername().length()>=4 && xxlJobUser.getUsername().length()<=20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + } + // valid password + if (!StringUtils.hasText(xxlJobUser.getPassword())) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input")+I18nUtil.getString("user_password") ); + } + xxlJobUser.setPassword(xxlJobUser.getPassword().trim()); + if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + } + // md5 password + xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes())); + + // check repeat + XxlJobUser existUser = xxlJobUserDao.loadByUserName(xxlJobUser.getUsername()); + if (existUser != null) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat") ); + } + + // write + xxlJobUserDao.save(xxlJobUser); + return ReturnT.SUCCESS; + } + + @RequestMapping("/update") + @ResponseBody + @PermissionLimit(adminuser = true) + public ReturnT update(HttpServletRequest request, XxlJobUser xxlJobUser) { + + // avoid opt login seft + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (loginUser.getUsername().equals(xxlJobUser.getUsername())) { + return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("user_update_loginuser_limit")); + } + + // valid password + if (StringUtils.hasText(xxlJobUser.getPassword())) { + xxlJobUser.setPassword(xxlJobUser.getPassword().trim()); + if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + } + // md5 password + xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes())); + } else { + xxlJobUser.setPassword(null); + } + + // write + xxlJobUserDao.update(xxlJobUser); + return ReturnT.SUCCESS; + } + + @RequestMapping("/remove") + @ResponseBody + @PermissionLimit(adminuser = true) + public ReturnT remove(HttpServletRequest request, int id) { + + // avoid opt login seft + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (loginUser.getId() == id) { + return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("user_update_loginuser_limit")); + } + + xxlJobUserDao.delete(id); + return ReturnT.SUCCESS; + } + + @RequestMapping("/updatePwd") + @ResponseBody + public ReturnT updatePwd(HttpServletRequest request, String password){ + + // valid password + if (password==null || password.trim().length()==0){ + return new ReturnT(ReturnT.FAIL.getCode(), "密码不可为空"); + } + password = password.trim(); + if (!(password.length()>=4 && password.length()<=20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + } + + // md5 password + String md5Password = DigestUtils.md5DigestAsHex(password.getBytes()); + + // update pwd + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + + // do write + XxlJobUser existUser = xxlJobUserDao.loadByUserName(loginUser.getUsername()); + existUser.setPassword(md5Password); + xxlJobUserDao.update(existUser); + + return ReturnT.SUCCESS; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java new file mode 100644 index 000000000..379efd46b --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java @@ -0,0 +1,29 @@ +package com.xxl.job.admin.controller.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 权限限制 + * @author xuxueli 2015-12-12 18:29:02 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface PermissionLimit { + + /** + * 登录拦截 (默认拦截) + */ + boolean limit() default true; + + /** + * 要求管理员权限 + * + * @return + */ + boolean adminuser() default false; + +} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java new file mode 100644 index 000000000..57c1c08d2 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -0,0 +1,43 @@ +package com.xxl.job.admin.controller.interceptor; + +import com.xxl.job.admin.core.util.FtlUtil; +import com.xxl.job.admin.core.util.I18nUtil; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; + +/** + * push cookies to model as cookieMap + * + * @author xuxueli 2015-12-12 18:09:04 + */ +@Component +public class CookieInterceptor extends HandlerInterceptorAdapter { + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, + ModelAndView modelAndView) throws Exception { + + // cookie + if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) { + HashMap cookieMap = new HashMap(); + for (Cookie ck : request.getCookies()) { + cookieMap.put(ck.getName(), ck); + } + modelAndView.addObject("cookieMap", cookieMap); + } + + // static method + if (modelAndView != null) { + modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName())); + } + + super.postHandle(request, response, handler, modelAndView); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java new file mode 100644 index 000000000..5202c2903 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -0,0 +1,59 @@ +package com.xxl.job.admin.controller.interceptor; + +import com.xxl.job.admin.controller.annotation.PermissionLimit; +import com.xxl.job.admin.core.model.XxlJobUser; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.service.LoginService; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 权限拦截 + * + * @author xuxueli 2015-12-12 18:09:04 + */ +@Component +public class PermissionInterceptor extends HandlerInterceptorAdapter { + + @Resource + private LoginService loginService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + if (!(handler instanceof HandlerMethod)) { + return super.preHandle(request, response, handler); + } + + // if need login + boolean needLogin = true; + boolean needAdminuser = false; + HandlerMethod method = (HandlerMethod)handler; + PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class); + if (permission!=null) { + needLogin = permission.limit(); + needAdminuser = permission.adminuser(); + } + + if (needLogin) { + XxlJobUser loginUser = loginService.ifLogin(request, response); + if (loginUser == null) { + response.setStatus(302); + response.setHeader("location", request.getContextPath()+"/toLogin"); + return false; + } + if (needAdminuser && loginUser.getRole()!=1) { + throw new RuntimeException(I18nUtil.getString("system_permission_limit")); + } + request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); + } + + return super.preHandle(request, response, handler); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java new file mode 100644 index 000000000..0be6ba663 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java @@ -0,0 +1,28 @@ +package com.xxl.job.admin.controller.interceptor; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.annotation.Resource; + +/** + * web mvc config + * + * @author xuxueli 2018-04-02 20:48:20 + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Resource + private PermissionInterceptor permissionInterceptor; + @Resource + private CookieInterceptor cookieInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(permissionInterceptor).addPathPatterns("/**"); + registry.addInterceptor(cookieInterceptor).addPathPatterns("/**"); + } + +} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java new file mode 100644 index 000000000..114407b66 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java @@ -0,0 +1,66 @@ +package com.xxl.job.admin.controller.resolver; + +import com.xxl.job.admin.core.exception.XxlJobException; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.admin.core.util.JacksonUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * common exception resolver + * + * @author xuxueli 2016-1-6 19:22:18 + */ +@Component +public class WebExceptionResolver implements HandlerExceptionResolver { + private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class); + + @Override + public ModelAndView resolveException(HttpServletRequest request, + HttpServletResponse response, Object handler, Exception ex) { + + if (!(ex instanceof XxlJobException)) { + logger.error("WebExceptionResolver:{}", ex); + } + + // if json + boolean isJson = false; + if (handler instanceof HandlerMethod) { + HandlerMethod method = (HandlerMethod)handler; + ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class); + if (responseBody != null) { + isJson = true; + } + } + + // error result + ReturnT errorResult = new ReturnT(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n", "
")); + + // response + ModelAndView mv = new ModelAndView(); + if (isJson) { + try { + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(JacksonUtil.writeValueAsString(errorResult)); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return mv; + } else { + + mv.addObject("exceptionMsg", errorResult.getMsg()); + mv.setViewName("/common/common.exception"); + return mv; + } + } + +} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java new file mode 100644 index 000000000..4165ff3a0 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java @@ -0,0 +1,20 @@ +package com.xxl.job.admin.core.alarm; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; + +/** + * @author xuxueli 2020-01-19 + */ +public interface JobAlarm { + + /** + * job alarm + * + * @param info + * @param jobLog + * @return + */ + public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java new file mode 100644 index 000000000..797dc900c --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java @@ -0,0 +1,65 @@ +package com.xxl.job.admin.core.alarm; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class JobAlarmer implements ApplicationContextAware, InitializingBean { + private static Logger logger = LoggerFactory.getLogger(JobAlarmer.class); + + private ApplicationContext applicationContext; + private List jobAlarmList; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + @Override + public void afterPropertiesSet() throws Exception { + Map serviceBeanMap = applicationContext.getBeansOfType(JobAlarm.class); + if (serviceBeanMap != null && serviceBeanMap.size() > 0) { + jobAlarmList = new ArrayList(serviceBeanMap.values()); + } + } + + /** + * job alarm + * + * @param info + * @param jobLog + * @return + */ + public boolean alarm(XxlJobInfo info, XxlJobLog jobLog) { + + boolean result = false; + if (jobAlarmList!=null && jobAlarmList.size()>0) { + result = true; // success means all-success + for (JobAlarm alarm: jobAlarmList) { + boolean resultItem = false; + try { + resultItem = alarm.doAlarm(info, jobLog); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + if (!resultItem) { + result = false; + } + } + } + + return result; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java new file mode 100644 index 000000000..e7290d76f --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java @@ -0,0 +1,117 @@ +package com.xxl.job.admin.core.alarm.impl; + +import com.xxl.job.admin.core.alarm.JobAlarm; +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.model.ReturnT; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; + +import javax.mail.internet.MimeMessage; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * job alarm by email + * + * @author xuxueli 2020-01-19 + */ +@Component +public class EmailJobAlarm implements JobAlarm { + private static Logger logger = LoggerFactory.getLogger(EmailJobAlarm.class); + + /** + * fail alarm + * + * @param jobLog + */ + public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog){ + boolean alarmResult = true; + + // send monitor email + if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { + + // alarmContent + String alarmContent = "Alarm Job LogId=" + jobLog.getId(); + if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) { + alarmContent += "
TriggerMsg=
" + jobLog.getTriggerMsg(); + } + if (jobLog.getHandleCode()>0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) { + alarmContent += "
HandleCode=" + jobLog.getHandleMsg(); + } + + // email info + XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup())); + String personal = I18nUtil.getString("admin_name_full"); + String title = I18nUtil.getString("jobconf_monitor"); + String content = MessageFormat.format(loadEmailJobAlarmTemplate(), + group!=null?group.getTitle():"null", + info.getId(), + info.getJobDesc(), + alarmContent); + + Set emailSet = new HashSet(Arrays.asList(info.getAlarmEmail().split(","))); + for (String email: emailSet) { + + // make mail + try { + MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailFrom(), personal); + helper.setTo(email); + helper.setSubject(title); + helper.setText(content, true); + + XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage); + } catch (Exception e) { + logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e); + + alarmResult = false; + } + + } + } + + return alarmResult; + } + + /** + * load email job alarm template + * + * @return + */ + private static final String loadEmailJobAlarmTemplate(){ + String mailBodyTemplate = "
" + I18nUtil.getString("jobconf_monitor_detail") + ":" + + "\n" + + " " + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
"+ I18nUtil.getString("jobinfo_field_jobgroup") +""+ I18nUtil.getString("jobinfo_field_id") +""+ I18nUtil.getString("jobinfo_field_jobdesc") +""+ I18nUtil.getString("jobconf_monitor_alarm_title") +""+ I18nUtil.getString("jobconf_monitor_alarm_content") +"
{0}{1}{2}"+ I18nUtil.getString("jobconf_monitor_alarm_type") +"{3}
"; + + return mailBodyTemplate; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java new file mode 100644 index 000000000..b9ac59a38 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java @@ -0,0 +1,99 @@ +package com.xxl.job.admin.core.complete; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +import com.xxl.job.admin.core.trigger.TriggerTypeEnum; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.MessageFormat; + +/** + * @author xuxueli 2020-10-30 20:43:10 + */ +public class XxlJobCompleter { + private static Logger logger = LoggerFactory.getLogger(XxlJobCompleter.class); + + /** + * common fresh handle entrance (limit only once) + * + * @param xxlJobLog + * @return + */ + public static int updateHandleInfoAndFinish(XxlJobLog xxlJobLog) { + + // finish + finishJob(xxlJobLog); + + // text最大64kb 避免长度过长 + if (xxlJobLog.getHandleMsg().length() > 15000) { + xxlJobLog.setHandleMsg( xxlJobLog.getHandleMsg().substring(0, 15000) ); + } + + // fresh handle + return XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(xxlJobLog); + } + + + /** + * do somethind to finish job + */ + private static void finishJob(XxlJobLog xxlJobLog){ + + // 1、handle success, to trigger child job + String triggerChildMsg = null; + if (XxlJobContext.HANDLE_COCE_SUCCESS == xxlJobLog.getHandleCode()) { + XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(xxlJobLog.getJobId()); + if (xxlJobInfo!=null && xxlJobInfo.getChildJobId()!=null && xxlJobInfo.getChildJobId().trim().length()>0) { + triggerChildMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_child_run") +"<<<<<<<<<<<
"; + + String[] childJobIds = xxlJobInfo.getChildJobId().split(","); + for (int i = 0; i < childJobIds.length; i++) { + int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1; + if (childJobId > 0) { + + JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null); + ReturnT triggerChildResult = ReturnT.SUCCESS; + + // add msg + triggerChildMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"), + (i+1), + childJobIds.length, + childJobIds[i], + (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?I18nUtil.getString("system_success"):I18nUtil.getString("system_fail")), + triggerChildResult.getMsg()); + } else { + triggerChildMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg2"), + (i+1), + childJobIds.length, + childJobIds[i]); + } + } + + } + } + + if (triggerChildMsg != null) { + xxlJobLog.setHandleMsg( xxlJobLog.getHandleMsg() + triggerChildMsg ); + } + + // 2、fix_delay trigger next + // on the way + + } + + private static boolean isNumeric(String str){ + try { + int result = Integer.valueOf(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java new file mode 100644 index 000000000..380b8a596 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java @@ -0,0 +1,158 @@ +package com.xxl.job.admin.core.conf; + +import com.xxl.job.admin.core.alarm.JobAlarmer; +import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.dao.*; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.util.Arrays; + +/** + * xxl-job config + * + * @author xuxueli 2017-04-28 + */ + +@Component +public class XxlJobAdminConfig implements InitializingBean, DisposableBean { + + private static XxlJobAdminConfig adminConfig = null; + public static XxlJobAdminConfig getAdminConfig() { + return adminConfig; + } + + + // ---------------------- XxlJobScheduler ---------------------- + + private XxlJobScheduler xxlJobScheduler; + + @Override + public void afterPropertiesSet() throws Exception { + adminConfig = this; + + xxlJobScheduler = new XxlJobScheduler(); + xxlJobScheduler.init(); + } + + @Override + public void destroy() throws Exception { + xxlJobScheduler.destroy(); + } + + + // ---------------------- XxlJobScheduler ---------------------- + + // conf + @Value("${xxl.job.i18n}") + private String i18n; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${spring.mail.from}") + private String emailFrom; + + @Value("${xxl.job.triggerpool.fast.max}") + private int triggerPoolFastMax; + + @Value("${xxl.job.triggerpool.slow.max}") + private int triggerPoolSlowMax; + + @Value("${xxl.job.logretentiondays}") + private int logretentiondays; + + // dao, service + + @Resource + private XxlJobLogDao xxlJobLogDao; + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + private XxlJobRegistryDao xxlJobRegistryDao; + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobLogReportDao xxlJobLogReportDao; + @Resource + private JavaMailSender mailSender; + @Resource + private DataSource dataSource; + @Resource + private JobAlarmer jobAlarmer; + + + public String getI18n() { + if (!Arrays.asList("zh_CN", "zh_TC", "en").contains(i18n)) { + return "zh_CN"; + } + return i18n; + } + + public String getAccessToken() { + return accessToken; + } + + public String getEmailFrom() { + return emailFrom; + } + + public int getTriggerPoolFastMax() { + if (triggerPoolFastMax < 200) { + return 200; + } + return triggerPoolFastMax; + } + + public int getTriggerPoolSlowMax() { + if (triggerPoolSlowMax < 100) { + return 100; + } + return triggerPoolSlowMax; + } + + public int getLogretentiondays() { + if (logretentiondays < 7) { + return -1; // Limit greater than or equal to 7, otherwise close + } + return logretentiondays; + } + + public XxlJobLogDao getXxlJobLogDao() { + return xxlJobLogDao; + } + + public XxlJobInfoDao getXxlJobInfoDao() { + return xxlJobInfoDao; + } + + public XxlJobRegistryDao getXxlJobRegistryDao() { + return xxlJobRegistryDao; + } + + public XxlJobGroupDao getXxlJobGroupDao() { + return xxlJobGroupDao; + } + + public XxlJobLogReportDao getXxlJobLogReportDao() { + return xxlJobLogReportDao; + } + + public JavaMailSender getMailSender() { + return mailSender; + } + + public DataSource getDataSource() { + return dataSource; + } + + public JobAlarmer getJobAlarmer() { + return jobAlarmer; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java new file mode 100644 index 000000000..fce23524d --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java @@ -0,0 +1,1666 @@ +/* + * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ + +package com.xxl.job.admin.core.cron; + +import java.io.Serializable; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.SortedSet; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.util.TreeSet; + +/** + * Provides a parser and evaluator for unix-like cron expressions. Cron + * expressions provide the ability to specify complex time combinations such as + * "At 8:00am every Monday through Friday" or "At 1:30am every + * last Friday of the month". + *

+ * Cron expressions are comprised of 6 required fields and one optional field + * separated by white space. The fields respectively are described as follows: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Field Name Allowed Values Allowed Special Characters
Seconds  + * 0-59  + * , - * /
Minutes  + * 0-59  + * , - * /
Hours  + * 0-23  + * , - * /
Day-of-month  + * 1-31  + * , - * ? / L W
Month  + * 0-11 or JAN-DEC  + * , - * /
Day-of-Week  + * 1-7 or SUN-SAT  + * , - * ? / L #
Year (Optional)  + * empty, 1970-2199  + * , - * /
+ *

+ * The '*' character is used to specify all values. For example, "*" + * in the minute field means "every minute". + *

+ * The '?' character is allowed for the day-of-month and day-of-week fields. It + * is used to specify 'no specific value'. This is useful when you need to + * specify something in one of the two fields, but not the other. + *

+ * The '-' character is used to specify ranges For example "10-12" in + * the hour field means "the hours 10, 11 and 12". + *

+ * The ',' character is used to specify additional values. For example + * "MON,WED,FRI" in the day-of-week field means "the days Monday, + * Wednesday, and Friday". + *

+ * The '/' character is used to specify increments. For example "0/15" + * in the seconds field means "the seconds 0, 15, 30, and 45". And + * "5/15" in the seconds field means "the seconds 5, 20, 35, and + * 50". Specifying '*' before the '/' is equivalent to specifying 0 is + * the value to start with. Essentially, for each field in the expression, there + * is a set of numbers that can be turned on or off. For seconds and minutes, + * the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + * 31, and for months 0 to 11 (JAN to DEC). The "/" character simply helps you turn + * on every "nth" value in the given set. Thus "7/6" in the + * month field only turns on month "7", it does NOT mean every 6th + * month, please note that subtlety. + *

+ * The 'L' character is allowed for the day-of-month and day-of-week fields. + * This character is short-hand for "last", but it has different + * meaning in each of the two fields. For example, the value "L" in + * the day-of-month field means "the last day of the month" - day 31 + * for January, day 28 for February on non-leap years. If used in the + * day-of-week field by itself, it simply means "7" or + * "SAT". But if used in the day-of-week field after another value, it + * means "the last xxx day of the month" - for example "6L" + * means "the last friday of the month". You can also specify an offset + * from the last day of the month, such as "L-3" which would mean the third-to-last + * day of the calendar month. When using the 'L' option, it is important not to + * specify lists, or ranges of values, as you'll get confusing/unexpected results. + *

+ * The 'W' character is allowed for the day-of-month field. This character + * is used to specify the weekday (Monday-Friday) nearest the given day. As an + * example, if you were to specify "15W" as the value for the + * day-of-month field, the meaning is: "the nearest weekday to the 15th of + * the month". So if the 15th is a Saturday, the trigger will fire on + * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + * However if you specify "1W" as the value for day-of-month, and the + * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + * 'jump' over the boundary of a month's days. The 'W' character can only be + * specified when the day-of-month is a single day, not a range or list of days. + *

+ * The 'L' and 'W' characters can also be combined for the day-of-month + * expression to yield 'LW', which translates to "last weekday of the + * month". + *

+ * The '#' character is allowed for the day-of-week field. This character is + * used to specify "the nth" XXX day of the month. For example, the + * value of "6#3" in the day-of-week field means the third Friday of + * the month (day 6 = Friday and "#3" = the 3rd one in the month). + * Other examples: "2#1" = the first Monday of the month and + * "4#5" = the fifth Wednesday of the month. Note that if you specify + * "#5" and there is not 5 of the given day-of-week in the month, then + * no firing will occur that month. If the '#' character is used, there can + * only be one expression in the day-of-week field ("3#1,6#3" is + * not valid, since there are two expressions). + *

+ * + *

+ * The legal characters and the names of months and days of the week are not + * case sensitive. + * + *

+ * NOTES: + *

    + *
  • Support for specifying both a day-of-week and a day-of-month value is + * not complete (you'll need to use the '?' character in one of these fields). + *
  • + *
  • Overflowing ranges is supported - that is, having a larger number on + * the left hand side than the right. You might do 22-2 to catch 10 o'clock + * at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + * very important to note that overuse of overflowing ranges creates ranges + * that don't make sense and no effort has been made to determine which + * interpretation CronExpression chooses. An example would be + * "0 0 14-6 ? * FRI-MON".
  • + *
+ *

+ * + * + * @author Sharada Jambula, James House + * @author Contributions from Mads Henderson + * @author Refactoring from CronTrigger to CronExpression by Aaron Craven + * + * Borrowed from quartz v2.3.1 + * + */ +public final class CronExpression implements Serializable, Cloneable { + + private static final long serialVersionUID = 12423409423L; + + protected static final int SECOND = 0; + protected static final int MINUTE = 1; + protected static final int HOUR = 2; + protected static final int DAY_OF_MONTH = 3; + protected static final int MONTH = 4; + protected static final int DAY_OF_WEEK = 5; + protected static final int YEAR = 6; + protected static final int ALL_SPEC_INT = 99; // '*' + protected static final int NO_SPEC_INT = 98; // '?' + protected static final Integer ALL_SPEC = ALL_SPEC_INT; + protected static final Integer NO_SPEC = NO_SPEC_INT; + + protected static final Map monthMap = new HashMap(20); + protected static final Map dayMap = new HashMap(60); + static { + monthMap.put("JAN", 0); + monthMap.put("FEB", 1); + monthMap.put("MAR", 2); + monthMap.put("APR", 3); + monthMap.put("MAY", 4); + monthMap.put("JUN", 5); + monthMap.put("JUL", 6); + monthMap.put("AUG", 7); + monthMap.put("SEP", 8); + monthMap.put("OCT", 9); + monthMap.put("NOV", 10); + monthMap.put("DEC", 11); + + dayMap.put("SUN", 1); + dayMap.put("MON", 2); + dayMap.put("TUE", 3); + dayMap.put("WED", 4); + dayMap.put("THU", 5); + dayMap.put("FRI", 6); + dayMap.put("SAT", 7); + } + + private final String cronExpression; + private TimeZone timeZone = null; + protected transient TreeSet seconds; + protected transient TreeSet minutes; + protected transient TreeSet hours; + protected transient TreeSet daysOfMonth; + protected transient TreeSet months; + protected transient TreeSet daysOfWeek; + protected transient TreeSet years; + + protected transient boolean lastdayOfWeek = false; + protected transient int nthdayOfWeek = 0; + protected transient boolean lastdayOfMonth = false; + protected transient boolean nearestWeekday = false; + protected transient int lastdayOffset = 0; + protected transient boolean expressionParsed = false; + + public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100; + + /** + * Constructs a new CronExpression based on the specified + * parameter. + * + * @param cronExpression String representation of the cron expression the + * new object should represent + * @throws java.text.ParseException + * if the string expression cannot be parsed into a valid + * CronExpression + */ + public CronExpression(String cronExpression) throws ParseException { + if (cronExpression == null) { + throw new IllegalArgumentException("cronExpression cannot be null"); + } + + this.cronExpression = cronExpression.toUpperCase(Locale.US); + + buildExpression(this.cronExpression); + } + + /** + * Constructs a new {@code CronExpression} as a copy of an existing + * instance. + * + * @param expression + * The existing cron expression to be copied + */ + public CronExpression(CronExpression expression) { + /* + * We don't call the other constructor here since we need to swallow the + * ParseException. We also elide some of the sanity checking as it is + * not logically trippable. + */ + this.cronExpression = expression.getCronExpression(); + try { + buildExpression(cronExpression); + } catch (ParseException ex) { + throw new AssertionError(); + } + if (expression.getTimeZone() != null) { + setTimeZone((TimeZone) expression.getTimeZone().clone()); + } + } + + /** + * Indicates whether the given date satisfies the cron expression. Note that + * milliseconds are ignored, so two Dates falling on different milliseconds + * of the same second will always have the same result here. + * + * @param date the date to evaluate + * @return a boolean indicating whether the given date satisfies the cron + * expression + */ + public boolean isSatisfiedBy(Date date) { + Calendar testDateCal = Calendar.getInstance(getTimeZone()); + testDateCal.setTime(date); + testDateCal.set(Calendar.MILLISECOND, 0); + Date originalDate = testDateCal.getTime(); + + testDateCal.add(Calendar.SECOND, -1); + + Date timeAfter = getTimeAfter(testDateCal.getTime()); + + return ((timeAfter != null) && (timeAfter.equals(originalDate))); + } + + /** + * Returns the next date/time after the given date/time which + * satisfies the cron expression. + * + * @param date the date/time at which to begin the search for the next valid + * date/time + * @return the next valid date/time + */ + public Date getNextValidTimeAfter(Date date) { + return getTimeAfter(date); + } + + /** + * Returns the next date/time after the given date/time which does + * not satisfy the expression + * + * @param date the date/time at which to begin the search for the next + * invalid date/time + * @return the next valid date/time + */ + public Date getNextInvalidTimeAfter(Date date) { + long difference = 1000; + + //move back to the nearest second so differences will be accurate + Calendar adjustCal = Calendar.getInstance(getTimeZone()); + adjustCal.setTime(date); + adjustCal.set(Calendar.MILLISECOND, 0); + Date lastDate = adjustCal.getTime(); + + Date newDate; + + //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution. + + //keep getting the next included time until it's farther than one second + // apart. At that point, lastDate is the last valid fire time. We return + // the second immediately following it. + while (difference == 1000) { + newDate = getTimeAfter(lastDate); + if(newDate == null) + break; + + difference = newDate.getTime() - lastDate.getTime(); + + if (difference == 1000) { + lastDate = newDate; + } + } + + return new Date(lastDate.getTime() + 1000); + } + + /** + * Returns the time zone for which this CronExpression + * will be resolved. + */ + public TimeZone getTimeZone() { + if (timeZone == null) { + timeZone = TimeZone.getDefault(); + } + + return timeZone; + } + + /** + * Sets the time zone for which this CronExpression + * will be resolved. + */ + public void setTimeZone(TimeZone timeZone) { + this.timeZone = timeZone; + } + + /** + * Returns the string representation of the CronExpression + * + * @return a string representation of the CronExpression + */ + @Override + public String toString() { + return cronExpression; + } + + /** + * Indicates whether the specified cron expression can be parsed into a + * valid cron expression + * + * @param cronExpression the expression to evaluate + * @return a boolean indicating whether the given expression is a valid cron + * expression + */ + public static boolean isValidExpression(String cronExpression) { + + try { + new CronExpression(cronExpression); + } catch (ParseException pe) { + return false; + } + + return true; + } + + public static void validateExpression(String cronExpression) throws ParseException { + + new CronExpression(cronExpression); + } + + + //////////////////////////////////////////////////////////////////////////// + // + // Expression Parsing Functions + // + //////////////////////////////////////////////////////////////////////////// + + protected void buildExpression(String expression) throws ParseException { + expressionParsed = true; + + try { + + if (seconds == null) { + seconds = new TreeSet(); + } + if (minutes == null) { + minutes = new TreeSet(); + } + if (hours == null) { + hours = new TreeSet(); + } + if (daysOfMonth == null) { + daysOfMonth = new TreeSet(); + } + if (months == null) { + months = new TreeSet(); + } + if (daysOfWeek == null) { + daysOfWeek = new TreeSet(); + } + if (years == null) { + years = new TreeSet(); + } + + int exprOn = SECOND; + + StringTokenizer exprsTok = new StringTokenizer(expression, " \t", + false); + + while (exprsTok.hasMoreTokens() && exprOn <= YEAR) { + String expr = exprsTok.nextToken().trim(); + + // throw an exception if L is used with other days of the month + if(exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { + throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1); + } + // throw an exception if L is used with other days of the week + if(exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { + throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1); + } + if(exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') +1) != -1) { + throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1); + } + + StringTokenizer vTok = new StringTokenizer(expr, ","); + while (vTok.hasMoreTokens()) { + String v = vTok.nextToken(); + storeExpressionVals(0, v, exprOn); + } + + exprOn++; + } + + if (exprOn <= DAY_OF_WEEK) { + throw new ParseException("Unexpected end of expression.", + expression.length()); + } + + if (exprOn <= YEAR) { + storeExpressionVals(0, "*", YEAR); + } + + TreeSet dow = getSet(DAY_OF_WEEK); + TreeSet dom = getSet(DAY_OF_MONTH); + + // Copying the logic from the UnsupportedOperationException below + boolean dayOfMSpec = !dom.contains(NO_SPEC); + boolean dayOfWSpec = !dow.contains(NO_SPEC); + + if (!dayOfMSpec || dayOfWSpec) { + if (!dayOfWSpec || dayOfMSpec) { + throw new ParseException( + "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); + } + } + } catch (ParseException pe) { + throw pe; + } catch (Exception e) { + throw new ParseException("Illegal cron expression format (" + + e.toString() + ")", 0); + } + } + + protected int storeExpressionVals(int pos, String s, int type) + throws ParseException { + + int incr = 0; + int i = skipWhiteSpace(pos, s); + if (i >= s.length()) { + return i; + } + char c = s.charAt(i); + if ((c >= 'A') && (c <= 'Z') && (!s.equals("L")) && (!s.equals("LW")) && (!s.matches("^L-[0-9]*[W]?"))) { + String sub = s.substring(i, i + 3); + int sval = -1; + int eval = -1; + if (type == MONTH) { + sval = getMonthNumber(sub) + 1; + if (sval <= 0) { + throw new ParseException("Invalid Month value: '" + sub + "'", i); + } + if (s.length() > i + 3) { + c = s.charAt(i + 3); + if (c == '-') { + i += 4; + sub = s.substring(i, i + 3); + eval = getMonthNumber(sub) + 1; + if (eval <= 0) { + throw new ParseException("Invalid Month value: '" + sub + "'", i); + } + } + } + } else if (type == DAY_OF_WEEK) { + sval = getDayOfWeekNumber(sub); + if (sval < 0) { + throw new ParseException("Invalid Day-of-Week value: '" + + sub + "'", i); + } + if (s.length() > i + 3) { + c = s.charAt(i + 3); + if (c == '-') { + i += 4; + sub = s.substring(i, i + 3); + eval = getDayOfWeekNumber(sub); + if (eval < 0) { + throw new ParseException( + "Invalid Day-of-Week value: '" + sub + + "'", i); + } + } else if (c == '#') { + try { + i += 4; + nthdayOfWeek = Integer.parseInt(s.substring(i)); + if (nthdayOfWeek < 1 || nthdayOfWeek > 5) { + throw new Exception(); + } + } catch (Exception e) { + throw new ParseException( + "A numeric value between 1 and 5 must follow the '#' option", + i); + } + } else if (c == 'L') { + lastdayOfWeek = true; + i++; + } + } + + } else { + throw new ParseException( + "Illegal characters for this position: '" + sub + "'", + i); + } + if (eval != -1) { + incr = 1; + } + addToSet(sval, eval, incr, type); + return (i + 3); + } + + if (c == '?') { + i++; + if ((i + 1) < s.length() + && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) { + throw new ParseException("Illegal character after '?': " + + s.charAt(i), i); + } + if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) { + throw new ParseException( + "'?' can only be specified for Day-of-Month or Day-of-Week.", + i); + } + if (type == DAY_OF_WEEK && !lastdayOfMonth) { + int val = daysOfMonth.last(); + if (val == NO_SPEC_INT) { + throw new ParseException( + "'?' can only be specified for Day-of-Month -OR- Day-of-Week.", + i); + } + } + + addToSet(NO_SPEC_INT, -1, 0, type); + return i; + } + + if (c == '*' || c == '/') { + if (c == '*' && (i + 1) >= s.length()) { + addToSet(ALL_SPEC_INT, -1, incr, type); + return i + 1; + } else if (c == '/' + && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s + .charAt(i + 1) == '\t')) { + throw new ParseException("'/' must be followed by an integer.", i); + } else if (c == '*') { + i++; + } + c = s.charAt(i); + if (c == '/') { // is an increment specified? + i++; + if (i >= s.length()) { + throw new ParseException("Unexpected end of string.", i); + } + + incr = getNumericValue(s, i); + + i++; + if (incr > 10) { + i++; + } + checkIncrementRange(incr, type, i); + } else { + incr = 1; + } + + addToSet(ALL_SPEC_INT, -1, incr, type); + return i; + } else if (c == 'L') { + i++; + if (type == DAY_OF_MONTH) { + lastdayOfMonth = true; + } + if (type == DAY_OF_WEEK) { + addToSet(7, 7, 0, type); + } + if(type == DAY_OF_MONTH && s.length() > i) { + c = s.charAt(i); + if(c == '-') { + ValueSet vs = getValue(0, s, i+1); + lastdayOffset = vs.value; + if(lastdayOffset > 30) + throw new ParseException("Offset from last day must be <= 30", i+1); + i = vs.pos; + } + if(s.length() > i) { + c = s.charAt(i); + if(c == 'W') { + nearestWeekday = true; + i++; + } + } + } + return i; + } else if (c >= '0' && c <= '9') { + int val = Integer.parseInt(String.valueOf(c)); + i++; + if (i >= s.length()) { + addToSet(val, -1, -1, type); + } else { + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(val, s, i); + val = vs.value; + i = vs.pos; + } + i = checkNext(i, s, val, type); + return i; + } + } else { + throw new ParseException("Unexpected character: " + c, i); + } + + return i; + } + + private void checkIncrementRange(int incr, int type, int idxPos) throws ParseException { + if (incr > 59 && (type == SECOND || type == MINUTE)) { + throw new ParseException("Increment > 60 : " + incr, idxPos); + } else if (incr > 23 && (type == HOUR)) { + throw new ParseException("Increment > 24 : " + incr, idxPos); + } else if (incr > 31 && (type == DAY_OF_MONTH)) { + throw new ParseException("Increment > 31 : " + incr, idxPos); + } else if (incr > 7 && (type == DAY_OF_WEEK)) { + throw new ParseException("Increment > 7 : " + incr, idxPos); + } else if (incr > 12 && (type == MONTH)) { + throw new ParseException("Increment > 12 : " + incr, idxPos); + } + } + + protected int checkNext(int pos, String s, int val, int type) + throws ParseException { + + int end = -1; + int i = pos; + + if (i >= s.length()) { + addToSet(val, end, -1, type); + return i; + } + + char c = s.charAt(pos); + + if (c == 'L') { + if (type == DAY_OF_WEEK) { + if(val < 1 || val > 7) + throw new ParseException("Day-of-Week values must be between 1 and 7", -1); + lastdayOfWeek = true; + } else { + throw new ParseException("'L' option is not valid here. (pos=" + i + ")", i); + } + TreeSet set = getSet(type); + set.add(val); + i++; + return i; + } + + if (c == 'W') { + if (type == DAY_OF_MONTH) { + nearestWeekday = true; + } else { + throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i); + } + if(val > 31) + throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i); + TreeSet set = getSet(type); + set.add(val); + i++; + return i; + } + + if (c == '#') { + if (type != DAY_OF_WEEK) { + throw new ParseException("'#' option is not valid here. (pos=" + i + ")", i); + } + i++; + try { + nthdayOfWeek = Integer.parseInt(s.substring(i)); + if (nthdayOfWeek < 1 || nthdayOfWeek > 5) { + throw new Exception(); + } + } catch (Exception e) { + throw new ParseException( + "A numeric value between 1 and 5 must follow the '#' option", + i); + } + + TreeSet set = getSet(type); + set.add(val); + i++; + return i; + } + + if (c == '-') { + i++; + c = s.charAt(i); + int v = Integer.parseInt(String.valueOf(c)); + end = v; + i++; + if (i >= s.length()) { + addToSet(val, end, 1, type); + return i; + } + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(v, s, i); + end = vs.value; + i = vs.pos; + } + if (i < s.length() && ((c = s.charAt(i)) == '/')) { + i++; + c = s.charAt(i); + int v2 = Integer.parseInt(String.valueOf(c)); + i++; + if (i >= s.length()) { + addToSet(val, end, v2, type); + return i; + } + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(v2, s, i); + int v3 = vs.value; + addToSet(val, end, v3, type); + i = vs.pos; + return i; + } else { + addToSet(val, end, v2, type); + return i; + } + } else { + addToSet(val, end, 1, type); + return i; + } + } + + if (c == '/') { + if ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s.charAt(i + 1) == '\t') { + throw new ParseException("'/' must be followed by an integer.", i); + } + + i++; + c = s.charAt(i); + int v2 = Integer.parseInt(String.valueOf(c)); + i++; + if (i >= s.length()) { + checkIncrementRange(v2, type, i); + addToSet(val, end, v2, type); + return i; + } + c = s.charAt(i); + if (c >= '0' && c <= '9') { + ValueSet vs = getValue(v2, s, i); + int v3 = vs.value; + checkIncrementRange(v3, type, i); + addToSet(val, end, v3, type); + i = vs.pos; + return i; + } else { + throw new ParseException("Unexpected character '" + c + "' after '/'", i); + } + } + + addToSet(val, end, 0, type); + i++; + return i; + } + + public String getCronExpression() { + return cronExpression; + } + + public String getExpressionSummary() { + StringBuilder buf = new StringBuilder(); + + buf.append("seconds: "); + buf.append(getExpressionSetSummary(seconds)); + buf.append("\n"); + buf.append("minutes: "); + buf.append(getExpressionSetSummary(minutes)); + buf.append("\n"); + buf.append("hours: "); + buf.append(getExpressionSetSummary(hours)); + buf.append("\n"); + buf.append("daysOfMonth: "); + buf.append(getExpressionSetSummary(daysOfMonth)); + buf.append("\n"); + buf.append("months: "); + buf.append(getExpressionSetSummary(months)); + buf.append("\n"); + buf.append("daysOfWeek: "); + buf.append(getExpressionSetSummary(daysOfWeek)); + buf.append("\n"); + buf.append("lastdayOfWeek: "); + buf.append(lastdayOfWeek); + buf.append("\n"); + buf.append("nearestWeekday: "); + buf.append(nearestWeekday); + buf.append("\n"); + buf.append("NthDayOfWeek: "); + buf.append(nthdayOfWeek); + buf.append("\n"); + buf.append("lastdayOfMonth: "); + buf.append(lastdayOfMonth); + buf.append("\n"); + buf.append("years: "); + buf.append(getExpressionSetSummary(years)); + buf.append("\n"); + + return buf.toString(); + } + + protected String getExpressionSetSummary(java.util.Set set) { + + if (set.contains(NO_SPEC)) { + return "?"; + } + if (set.contains(ALL_SPEC)) { + return "*"; + } + + StringBuilder buf = new StringBuilder(); + + Iterator itr = set.iterator(); + boolean first = true; + while (itr.hasNext()) { + Integer iVal = itr.next(); + String val = iVal.toString(); + if (!first) { + buf.append(","); + } + buf.append(val); + first = false; + } + + return buf.toString(); + } + + protected String getExpressionSetSummary(java.util.ArrayList list) { + + if (list.contains(NO_SPEC)) { + return "?"; + } + if (list.contains(ALL_SPEC)) { + return "*"; + } + + StringBuilder buf = new StringBuilder(); + + Iterator itr = list.iterator(); + boolean first = true; + while (itr.hasNext()) { + Integer iVal = itr.next(); + String val = iVal.toString(); + if (!first) { + buf.append(","); + } + buf.append(val); + first = false; + } + + return buf.toString(); + } + + protected int skipWhiteSpace(int i, String s) { + for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\t'); i++) { + } + + return i; + } + + protected int findNextWhiteSpace(int i, String s) { + for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\t'); i++) { + } + + return i; + } + + protected void addToSet(int val, int end, int incr, int type) + throws ParseException { + + TreeSet set = getSet(type); + + if (type == SECOND || type == MINUTE) { + if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) { + throw new ParseException( + "Minute and Second values must be between 0 and 59", + -1); + } + } else if (type == HOUR) { + if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) { + throw new ParseException( + "Hour values must be between 0 and 23", -1); + } + } else if (type == DAY_OF_MONTH) { + if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) + && (val != NO_SPEC_INT)) { + throw new ParseException( + "Day of month values must be between 1 and 31", -1); + } + } else if (type == MONTH) { + if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) { + throw new ParseException( + "Month values must be between 1 and 12", -1); + } + } else if (type == DAY_OF_WEEK) { + if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT) + && (val != NO_SPEC_INT)) { + throw new ParseException( + "Day-of-Week values must be between 1 and 7", -1); + } + } + + if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) { + if (val != -1) { + set.add(val); + } else { + set.add(NO_SPEC); + } + + return; + } + + int startAt = val; + int stopAt = end; + + if (val == ALL_SPEC_INT && incr <= 0) { + incr = 1; + set.add(ALL_SPEC); // put in a marker, but also fill values + } + + if (type == SECOND || type == MINUTE) { + if (stopAt == -1) { + stopAt = 59; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 0; + } + } else if (type == HOUR) { + if (stopAt == -1) { + stopAt = 23; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 0; + } + } else if (type == DAY_OF_MONTH) { + if (stopAt == -1) { + stopAt = 31; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1; + } + } else if (type == MONTH) { + if (stopAt == -1) { + stopAt = 12; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1; + } + } else if (type == DAY_OF_WEEK) { + if (stopAt == -1) { + stopAt = 7; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1; + } + } else if (type == YEAR) { + if (stopAt == -1) { + stopAt = MAX_YEAR; + } + if (startAt == -1 || startAt == ALL_SPEC_INT) { + startAt = 1970; + } + } + + // if the end of the range is before the start, then we need to overflow into + // the next day, month etc. This is done by adding the maximum amount for that + // type, and using modulus max to determine the value being added. + int max = -1; + if (stopAt < startAt) { + switch (type) { + case SECOND : max = 60; break; + case MINUTE : max = 60; break; + case HOUR : max = 24; break; + case MONTH : max = 12; break; + case DAY_OF_WEEK : max = 7; break; + case DAY_OF_MONTH : max = 31; break; + case YEAR : throw new IllegalArgumentException("Start year must be less than stop year"); + default : throw new IllegalArgumentException("Unexpected type encountered"); + } + stopAt += max; + } + + for (int i = startAt; i <= stopAt; i += incr) { + if (max == -1) { + // ie: there's no max to overflow over + set.add(i); + } else { + // take the modulus to get the real value + int i2 = i % max; + + // 1-indexed ranges should not include 0, and should include their max + if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH) ) { + i2 = max; + } + + set.add(i2); + } + } + } + + TreeSet getSet(int type) { + switch (type) { + case SECOND: + return seconds; + case MINUTE: + return minutes; + case HOUR: + return hours; + case DAY_OF_MONTH: + return daysOfMonth; + case MONTH: + return months; + case DAY_OF_WEEK: + return daysOfWeek; + case YEAR: + return years; + default: + return null; + } + } + + protected ValueSet getValue(int v, String s, int i) { + char c = s.charAt(i); + StringBuilder s1 = new StringBuilder(String.valueOf(v)); + while (c >= '0' && c <= '9') { + s1.append(c); + i++; + if (i >= s.length()) { + break; + } + c = s.charAt(i); + } + ValueSet val = new ValueSet(); + + val.pos = (i < s.length()) ? i : i + 1; + val.value = Integer.parseInt(s1.toString()); + return val; + } + + protected int getNumericValue(String s, int i) { + int endOfVal = findNextWhiteSpace(i, s); + String val = s.substring(i, endOfVal); + return Integer.parseInt(val); + } + + protected int getMonthNumber(String s) { + Integer integer = monthMap.get(s); + + if (integer == null) { + return -1; + } + + return integer; + } + + protected int getDayOfWeekNumber(String s) { + Integer integer = dayMap.get(s); + + if (integer == null) { + return -1; + } + + return integer; + } + + //////////////////////////////////////////////////////////////////////////// + // + // Computation Functions + // + //////////////////////////////////////////////////////////////////////////// + + public Date getTimeAfter(Date afterTime) { + + // Computation is based on Gregorian year only. + Calendar cl = new java.util.GregorianCalendar(getTimeZone()); + + // move ahead one second, since we're computing the time *after* the + // given time + afterTime = new Date(afterTime.getTime() + 1000); + // CronTrigger does not deal with milliseconds + cl.setTime(afterTime); + cl.set(Calendar.MILLISECOND, 0); + + boolean gotOne = false; + // loop until we've computed the next time, or we've past the endTime + while (!gotOne) { + + //if (endTime != null && cl.getTime().after(endTime)) return null; + if(cl.get(Calendar.YEAR) > 2999) { // prevent endless loop... + return null; + } + + SortedSet st = null; + int t = 0; + + int sec = cl.get(Calendar.SECOND); + int min = cl.get(Calendar.MINUTE); + + // get second................................................. + st = seconds.tailSet(sec); + if (st != null && st.size() != 0) { + sec = st.first(); + } else { + sec = seconds.first(); + min++; + cl.set(Calendar.MINUTE, min); + } + cl.set(Calendar.SECOND, sec); + + min = cl.get(Calendar.MINUTE); + int hr = cl.get(Calendar.HOUR_OF_DAY); + t = -1; + + // get minute................................................. + st = minutes.tailSet(min); + if (st != null && st.size() != 0) { + t = min; + min = st.first(); + } else { + min = minutes.first(); + hr++; + } + if (min != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, min); + setCalendarHour(cl, hr); + continue; + } + cl.set(Calendar.MINUTE, min); + + hr = cl.get(Calendar.HOUR_OF_DAY); + int day = cl.get(Calendar.DAY_OF_MONTH); + t = -1; + + // get hour................................................... + st = hours.tailSet(hr); + if (st != null && st.size() != 0) { + t = hr; + hr = st.first(); + } else { + hr = hours.first(); + day++; + } + if (hr != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + setCalendarHour(cl, hr); + continue; + } + cl.set(Calendar.HOUR_OF_DAY, hr); + + day = cl.get(Calendar.DAY_OF_MONTH); + int mon = cl.get(Calendar.MONTH) + 1; + // '+ 1' because calendar is 0-based for this field, and we are + // 1-based + t = -1; + int tmon = mon; + + // get day................................................... + boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC); + boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC); + if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule + st = daysOfMonth.tailSet(day); + if (lastdayOfMonth) { + if(!nearestWeekday) { + t = day; + day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + day -= lastdayOffset; + if(t > day) { + mon++; + if(mon > 12) { + mon = 1; + tmon = 3333; // ensure test of mon != tmon further below fails + cl.add(Calendar.YEAR, 1); + } + day = 1; + } + } else { + t = day; + day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + day -= lastdayOffset; + + java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); + tcal.set(Calendar.SECOND, 0); + tcal.set(Calendar.MINUTE, 0); + tcal.set(Calendar.HOUR_OF_DAY, 0); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); + + int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + int dow = tcal.get(Calendar.DAY_OF_WEEK); + + if(dow == Calendar.SATURDAY && day == 1) { + day += 2; + } else if(dow == Calendar.SATURDAY) { + day -= 1; + } else if(dow == Calendar.SUNDAY && day == ldom) { + day -= 2; + } else if(dow == Calendar.SUNDAY) { + day += 1; + } + + tcal.set(Calendar.SECOND, sec); + tcal.set(Calendar.MINUTE, min); + tcal.set(Calendar.HOUR_OF_DAY, hr); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + Date nTime = tcal.getTime(); + if(nTime.before(afterTime)) { + day = 1; + mon++; + } + } + } else if(nearestWeekday) { + t = day; + day = daysOfMonth.first(); + + java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); + tcal.set(Calendar.SECOND, 0); + tcal.set(Calendar.MINUTE, 0); + tcal.set(Calendar.HOUR_OF_DAY, 0); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); + + int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + int dow = tcal.get(Calendar.DAY_OF_WEEK); + + if(dow == Calendar.SATURDAY && day == 1) { + day += 2; + } else if(dow == Calendar.SATURDAY) { + day -= 1; + } else if(dow == Calendar.SUNDAY && day == ldom) { + day -= 2; + } else if(dow == Calendar.SUNDAY) { + day += 1; + } + + + tcal.set(Calendar.SECOND, sec); + tcal.set(Calendar.MINUTE, min); + tcal.set(Calendar.HOUR_OF_DAY, hr); + tcal.set(Calendar.DAY_OF_MONTH, day); + tcal.set(Calendar.MONTH, mon - 1); + Date nTime = tcal.getTime(); + if(nTime.before(afterTime)) { + day = daysOfMonth.first(); + mon++; + } + } else if (st != null && st.size() != 0) { + t = day; + day = st.first(); + // make sure we don't over-run a short month, such as february + int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + if (day > lastDay) { + day = daysOfMonth.first(); + mon++; + } + } else { + day = daysOfMonth.first(); + mon++; + } + + if (day != t || mon != tmon) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, and we + // are 1-based + continue; + } + } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule + if (lastdayOfWeek) { // are we looking for the last XXX day of + // the month? + int dow = daysOfWeek.first(); // desired + // d-o-w + int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w + int daysToAdd = 0; + if (cDow < dow) { + daysToAdd = dow - cDow; + } + if (cDow > dow) { + daysToAdd = dow + (7 - cDow); + } + + int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + + if (day + daysToAdd > lDay) { // did we already miss the + // last one? + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon); + // no '- 1' here because we are promoting the month + continue; + } + + // find date of last occurrence of this day in this month... + while ((day + daysToAdd + 7) <= lDay) { + daysToAdd += 7; + } + + day += daysToAdd; + + if (daysToAdd > 0) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' here because we are not promoting the month + continue; + } + + } else if (nthdayOfWeek != 0) { + // are we looking for the Nth XXX day in the month? + int dow = daysOfWeek.first(); // desired + // d-o-w + int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w + int daysToAdd = 0; + if (cDow < dow) { + daysToAdd = dow - cDow; + } else if (cDow > dow) { + daysToAdd = dow + (7 - cDow); + } + + boolean dayShifted = false; + if (daysToAdd > 0) { + dayShifted = true; + } + + day += daysToAdd; + int weekOfMonth = day / 7; + if (day % 7 > 0) { + weekOfMonth++; + } + + daysToAdd = (nthdayOfWeek - weekOfMonth) * 7; + day += daysToAdd; + if (daysToAdd < 0 + || day > getLastDayOfMonth(mon, cl + .get(Calendar.YEAR))) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon); + // no '- 1' here because we are promoting the month + continue; + } else if (daysToAdd > 0 || dayShifted) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' here because we are NOT promoting the month + continue; + } + } else { + int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w + int dow = daysOfWeek.first(); // desired + // d-o-w + st = daysOfWeek.tailSet(cDow); + if (st != null && st.size() > 0) { + dow = st.first(); + } + + int daysToAdd = 0; + if (cDow < dow) { + daysToAdd = dow - cDow; + } + if (cDow > dow) { + daysToAdd = dow + (7 - cDow); + } + + int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); + + if (day + daysToAdd > lDay) { // will we pass the end of + // the month? + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon); + // no '- 1' here because we are promoting the month + continue; + } else if (daysToAdd > 0) { // are we swithing days? + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, + // and we are 1-based + continue; + } + } + } else { // dayOfWSpec && !dayOfMSpec + throw new UnsupportedOperationException( + "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."); + } + cl.set(Calendar.DAY_OF_MONTH, day); + + mon = cl.get(Calendar.MONTH) + 1; + // '+ 1' because calendar is 0-based for this field, and we are + // 1-based + int year = cl.get(Calendar.YEAR); + t = -1; + + // test for expressions that never generate a valid fire date, + // but keep looping... + if (year > MAX_YEAR) { + return null; + } + + // get month................................................... + st = months.tailSet(mon); + if (st != null && st.size() != 0) { + t = mon; + mon = st.first(); + } else { + mon = months.first(); + year++; + } + if (mon != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, and we are + // 1-based + cl.set(Calendar.YEAR, year); + continue; + } + cl.set(Calendar.MONTH, mon - 1); + // '- 1' because calendar is 0-based for this field, and we are + // 1-based + + year = cl.get(Calendar.YEAR); + t = -1; + + // get year................................................... + st = years.tailSet(year); + if (st != null && st.size() != 0) { + t = year; + year = st.first(); + } else { + return null; // ran out of years... + } + + if (year != t) { + cl.set(Calendar.SECOND, 0); + cl.set(Calendar.MINUTE, 0); + cl.set(Calendar.HOUR_OF_DAY, 0); + cl.set(Calendar.DAY_OF_MONTH, 1); + cl.set(Calendar.MONTH, 0); + // '- 1' because calendar is 0-based for this field, and we are + // 1-based + cl.set(Calendar.YEAR, year); + continue; + } + cl.set(Calendar.YEAR, year); + + gotOne = true; + } // while( !done ) + + return cl.getTime(); + } + + /** + * Advance the calendar to the particular hour paying particular attention + * to daylight saving problems. + * + * @param cal the calendar to operate on + * @param hour the hour to set + */ + protected void setCalendarHour(Calendar cal, int hour) { + cal.set(java.util.Calendar.HOUR_OF_DAY, hour); + if (cal.get(java.util.Calendar.HOUR_OF_DAY) != hour && hour != 24) { + cal.set(java.util.Calendar.HOUR_OF_DAY, hour + 1); + } + } + + /** + * NOT YET IMPLEMENTED: Returns the time before the given time + * that the CronExpression matches. + */ + public Date getTimeBefore(Date endTime) { + // FUTURE_TODO: implement QUARTZ-423 + return null; + } + + /** + * NOT YET IMPLEMENTED: Returns the final time that the + * CronExpression will match. + */ + public Date getFinalFireTime() { + // FUTURE_TODO: implement QUARTZ-423 + return null; + } + + protected boolean isLeapYear(int year) { + return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); + } + + protected int getLastDayOfMonth(int monthNum, int year) { + + switch (monthNum) { + case 1: + return 31; + case 2: + return (isLeapYear(year)) ? 29 : 28; + case 3: + return 31; + case 4: + return 30; + case 5: + return 31; + case 6: + return 30; + case 7: + return 31; + case 8: + return 31; + case 9: + return 30; + case 10: + return 31; + case 11: + return 30; + case 12: + return 31; + default: + throw new IllegalArgumentException("Illegal month number: " + + monthNum); + } + } + + + private void readObject(java.io.ObjectInputStream stream) + throws java.io.IOException, ClassNotFoundException { + + stream.defaultReadObject(); + try { + buildExpression(cronExpression); + } catch (Exception ignore) { + } // never happens + } + + @Override + @Deprecated + public Object clone() { + return new CronExpression(this); + } +} + +class ValueSet { + public int value; + + public int pos; +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java new file mode 100644 index 000000000..faa6063c4 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java @@ -0,0 +1,14 @@ +package com.xxl.job.admin.core.exception; + +/** + * @author xuxueli 2019-05-04 23:19:29 + */ +public class XxlJobException extends RuntimeException { + + public XxlJobException() { + } + public XxlJobException(String message) { + super(message); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java new file mode 100644 index 000000000..dde4b3996 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java @@ -0,0 +1,77 @@ +package com.xxl.job.admin.core.model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * Created by xuxueli on 16/9/30. + */ +public class XxlJobGroup { + + private int id; + private String appname; + private String title; + private int addressType; // 执行器地址类型:0=自动注册、1=手动录入 + private String addressList; // 执行器地址列表,多地址逗号分隔(手动录入) + private Date updateTime; + + // registry list + private List registryList; // 执行器地址列表(系统注册) + public List getRegistryList() { + if (addressList!=null && addressList.trim().length()>0) { + registryList = new ArrayList(Arrays.asList(addressList.split(","))); + } + return registryList; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getAppname() { + return appname; + } + + public void setAppname(String appname) { + this.appname = appname; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getAddressType() { + return addressType; + } + + public void setAddressType(int addressType) { + this.addressType = addressType; + } + + public String getAddressList() { + return addressList; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public void setAddressList(String addressList) { + this.addressList = addressList; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java new file mode 100644 index 000000000..e47b6dc65 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java @@ -0,0 +1,237 @@ +package com.xxl.job.admin.core.model; + +import java.util.Date; + +/** + * xxl-job info + * + * @author xuxueli 2016-1-12 18:25:49 + */ +public class XxlJobInfo { + + private int id; // 主键ID + + private int jobGroup; // 执行器主键ID + private String jobDesc; + + private Date addTime; + private Date updateTime; + + private String author; // 负责人 + private String alarmEmail; // 报警邮件 + + private String scheduleType; // 调度类型 + private String scheduleConf; // 调度配置,值含义取决于调度类型 + private String misfireStrategy; // 调度过期策略 + + private String executorRouteStrategy; // 执行器路由策略 + private String executorHandler; // 执行器,任务Handler名称 + private String executorParam; // 执行器,任务参数 + private String executorBlockStrategy; // 阻塞处理策略 + private int executorTimeout; // 任务执行超时时间,单位秒 + private int executorFailRetryCount; // 失败重试次数 + + private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + private String glueSource; // GLUE源代码 + private String glueRemark; // GLUE备注 + private Date glueUpdatetime; // GLUE更新时间 + + private String childJobId; // 子任务ID,多个逗号分隔 + + private int triggerStatus; // 调度状态:0-停止,1-运行 + private long triggerLastTime; // 上次调度时间 + private long triggerNextTime; // 下次调度时间 + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getJobGroup() { + return jobGroup; + } + + public void setJobGroup(int jobGroup) { + this.jobGroup = jobGroup; + } + + public String getJobDesc() { + return jobDesc; + } + + public void setJobDesc(String jobDesc) { + this.jobDesc = jobDesc; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getAlarmEmail() { + return alarmEmail; + } + + public void setAlarmEmail(String alarmEmail) { + this.alarmEmail = alarmEmail; + } + + public String getScheduleType() { + return scheduleType; + } + + public void setScheduleType(String scheduleType) { + this.scheduleType = scheduleType; + } + + public String getScheduleConf() { + return scheduleConf; + } + + public void setScheduleConf(String scheduleConf) { + this.scheduleConf = scheduleConf; + } + + public String getMisfireStrategy() { + return misfireStrategy; + } + + public void setMisfireStrategy(String misfireStrategy) { + this.misfireStrategy = misfireStrategy; + } + + public String getExecutorRouteStrategy() { + return executorRouteStrategy; + } + + public void setExecutorRouteStrategy(String executorRouteStrategy) { + this.executorRouteStrategy = executorRouteStrategy; + } + + public String getExecutorHandler() { + return executorHandler; + } + + public void setExecutorHandler(String executorHandler) { + this.executorHandler = executorHandler; + } + + public String getExecutorParam() { + return executorParam; + } + + public void setExecutorParam(String executorParam) { + this.executorParam = executorParam; + } + + public String getExecutorBlockStrategy() { + return executorBlockStrategy; + } + + public void setExecutorBlockStrategy(String executorBlockStrategy) { + this.executorBlockStrategy = executorBlockStrategy; + } + + public int getExecutorTimeout() { + return executorTimeout; + } + + public void setExecutorTimeout(int executorTimeout) { + this.executorTimeout = executorTimeout; + } + + public int getExecutorFailRetryCount() { + return executorFailRetryCount; + } + + public void setExecutorFailRetryCount(int executorFailRetryCount) { + this.executorFailRetryCount = executorFailRetryCount; + } + + public String getGlueType() { + return glueType; + } + + public void setGlueType(String glueType) { + this.glueType = glueType; + } + + public String getGlueSource() { + return glueSource; + } + + public void setGlueSource(String glueSource) { + this.glueSource = glueSource; + } + + public String getGlueRemark() { + return glueRemark; + } + + public void setGlueRemark(String glueRemark) { + this.glueRemark = glueRemark; + } + + public Date getGlueUpdatetime() { + return glueUpdatetime; + } + + public void setGlueUpdatetime(Date glueUpdatetime) { + this.glueUpdatetime = glueUpdatetime; + } + + public String getChildJobId() { + return childJobId; + } + + public void setChildJobId(String childJobId) { + this.childJobId = childJobId; + } + + public int getTriggerStatus() { + return triggerStatus; + } + + public void setTriggerStatus(int triggerStatus) { + this.triggerStatus = triggerStatus; + } + + public long getTriggerLastTime() { + return triggerLastTime; + } + + public void setTriggerLastTime(long triggerLastTime) { + this.triggerLastTime = triggerLastTime; + } + + public long getTriggerNextTime() { + return triggerNextTime; + } + + public void setTriggerNextTime(long triggerNextTime) { + this.triggerNextTime = triggerNextTime; + } +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java new file mode 100644 index 000000000..7d3072aa6 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java @@ -0,0 +1,157 @@ +package com.xxl.job.admin.core.model; + +import java.util.Date; + +/** + * xxl-job log, used to track trigger process + * @author xuxueli 2015-12-19 23:19:09 + */ +public class XxlJobLog { + + private long id; + + // job info + private int jobGroup; + private int jobId; + + // execute info + private String executorAddress; + private String executorHandler; + private String executorParam; + private String executorShardingParam; + private int executorFailRetryCount; + + // trigger info + private Date triggerTime; + private int triggerCode; + private String triggerMsg; + + // handle info + private Date handleTime; + private int handleCode; + private String handleMsg; + + // alarm info + private int alarmStatus; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getJobGroup() { + return jobGroup; + } + + public void setJobGroup(int jobGroup) { + this.jobGroup = jobGroup; + } + + public int getJobId() { + return jobId; + } + + public void setJobId(int jobId) { + this.jobId = jobId; + } + + public String getExecutorAddress() { + return executorAddress; + } + + public void setExecutorAddress(String executorAddress) { + this.executorAddress = executorAddress; + } + + public String getExecutorHandler() { + return executorHandler; + } + + public void setExecutorHandler(String executorHandler) { + this.executorHandler = executorHandler; + } + + public String getExecutorParam() { + return executorParam; + } + + public void setExecutorParam(String executorParam) { + this.executorParam = executorParam; + } + + public String getExecutorShardingParam() { + return executorShardingParam; + } + + public void setExecutorShardingParam(String executorShardingParam) { + this.executorShardingParam = executorShardingParam; + } + + public int getExecutorFailRetryCount() { + return executorFailRetryCount; + } + + public void setExecutorFailRetryCount(int executorFailRetryCount) { + this.executorFailRetryCount = executorFailRetryCount; + } + + public Date getTriggerTime() { + return triggerTime; + } + + public void setTriggerTime(Date triggerTime) { + this.triggerTime = triggerTime; + } + + public int getTriggerCode() { + return triggerCode; + } + + public void setTriggerCode(int triggerCode) { + this.triggerCode = triggerCode; + } + + public String getTriggerMsg() { + return triggerMsg; + } + + public void setTriggerMsg(String triggerMsg) { + this.triggerMsg = triggerMsg; + } + + public Date getHandleTime() { + return handleTime; + } + + public void setHandleTime(Date handleTime) { + this.handleTime = handleTime; + } + + public int getHandleCode() { + return handleCode; + } + + public void setHandleCode(int handleCode) { + this.handleCode = handleCode; + } + + public String getHandleMsg() { + return handleMsg; + } + + public void setHandleMsg(String handleMsg) { + this.handleMsg = handleMsg; + } + + public int getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(int alarmStatus) { + this.alarmStatus = alarmStatus; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java new file mode 100644 index 000000000..2f59ffa84 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java @@ -0,0 +1,75 @@ +package com.xxl.job.admin.core.model; + +import java.util.Date; + +/** + * xxl-job log for glue, used to track job code process + * @author xuxueli 2016-5-19 17:57:46 + */ +public class XxlJobLogGlue { + + private int id; + private int jobId; // 任务主键ID + private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + private String glueSource; + private String glueRemark; + private Date addTime; + private Date updateTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getJobId() { + return jobId; + } + + public void setJobId(int jobId) { + this.jobId = jobId; + } + + public String getGlueType() { + return glueType; + } + + public void setGlueType(String glueType) { + this.glueType = glueType; + } + + public String getGlueSource() { + return glueSource; + } + + public void setGlueSource(String glueSource) { + this.glueSource = glueSource; + } + + public String getGlueRemark() { + return glueRemark; + } + + public void setGlueRemark(String glueRemark) { + this.glueRemark = glueRemark; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java new file mode 100644 index 000000000..e58ff1a9e --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java @@ -0,0 +1,54 @@ +package com.xxl.job.admin.core.model; + +import java.util.Date; + +public class XxlJobLogReport { + + private int id; + + private Date triggerDay; + + private int runningCount; + private int sucCount; + private int failCount; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Date getTriggerDay() { + return triggerDay; + } + + public void setTriggerDay(Date triggerDay) { + this.triggerDay = triggerDay; + } + + public int getRunningCount() { + return runningCount; + } + + public void setRunningCount(int runningCount) { + this.runningCount = runningCount; + } + + public int getSucCount() { + return sucCount; + } + + public void setSucCount(int sucCount) { + this.sucCount = sucCount; + } + + public int getFailCount() { + return failCount; + } + + public void setFailCount(int failCount) { + this.failCount = failCount; + } +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java new file mode 100644 index 000000000..924d6d336 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java @@ -0,0 +1,55 @@ +package com.xxl.job.admin.core.model; + +import java.util.Date; + +/** + * Created by xuxueli on 16/9/30. + */ +public class XxlJobRegistry { + + private int id; + private String registryGroup; + private String registryKey; + private String registryValue; + private Date updateTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getRegistryGroup() { + return registryGroup; + } + + public void setRegistryGroup(String registryGroup) { + this.registryGroup = registryGroup; + } + + public String getRegistryKey() { + return registryKey; + } + + public void setRegistryKey(String registryKey) { + this.registryKey = registryKey; + } + + public String getRegistryValue() { + return registryValue; + } + + public void setRegistryValue(String registryValue) { + this.registryValue = registryValue; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java new file mode 100644 index 000000000..db17327a8 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java @@ -0,0 +1,73 @@ +package com.xxl.job.admin.core.model; + +import org.springframework.util.StringUtils; + +/** + * @author xuxueli 2019-05-04 16:43:12 + */ +public class XxlJobUser { + + private int id; + private String username; // 账号 + private String password; // 密码 + private int role; // 角色:0-普通用户、1-管理员 + private String permission; // 权限:执行器ID列表,多个逗号分割 + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + // plugin + public boolean validPermission(int jobGroup){ + if (this.role == 1) { + return true; + } else { + if (StringUtils.hasText(this.permission)) { + for (String permissionItem : this.permission.split(",")) { + if (String.valueOf(jobGroup).equals(permissionItem)) { + return true; + } + } + } + return false; + } + + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java new file mode 100644 index 000000000..b2dd15155 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java @@ -0,0 +1,32 @@ +//package com.xxl.job.admin.core.jobbean; +// +//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +//import com.xxl.job.admin.core.trigger.TriggerTypeEnum; +//import org.quartz.JobExecutionContext; +//import org.quartz.JobExecutionException; +//import org.quartz.JobKey; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.scheduling.quartz.QuartzJobBean; +// +///** +// * http job bean +// * “@DisallowConcurrentExecution” disable concurrent, thread size can not be only one, better given more +// * @author xuxueli 2015-12-17 18:20:34 +// */ +////@DisallowConcurrentExecution +//public class RemoteHttpJobBean extends QuartzJobBean { +// private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class); +// +// @Override +// protected void executeInternal(JobExecutionContext context) +// throws JobExecutionException { +// +// // load jobId +// JobKey jobKey = context.getTrigger().getJobKey(); +// Integer jobId = Integer.valueOf(jobKey.getName()); +// +// +// } +// +//} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java new file mode 100644 index 000000000..1e62aa190 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java @@ -0,0 +1,413 @@ +//package com.xxl.job.admin.core.schedule; +// +//import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +//import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean; +//import com.xxl.job.admin.core.model.XxlJobInfo; +//import com.xxl.job.admin.core.thread.JobFailMonitorHelper; +//import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper; +//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +//import com.xxl.job.admin.core.util.I18nUtil; +//import com.xxl.job.core.biz.AdminBiz; +//import com.xxl.job.core.biz.ExecutorBiz; +//import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; +//import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory; +//import com.xxl.rpc.remoting.invoker.call.CallType; +//import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean; +//import com.xxl.rpc.remoting.invoker.route.LoadBalance; +//import com.xxl.rpc.remoting.net.NetEnum; +//import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler; +//import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory; +//import com.xxl.rpc.serialize.Serializer; +//import org.quartz.*; +//import org.quartz.Trigger.TriggerState; +//import org.quartz.impl.triggers.CronTriggerImpl; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.util.Assert; +// +//import javax.servlet.ServletException; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import java.util.Date; +//import java.util.concurrent.ConcurrentHashMap; +// +///** +// * base quartz scheduler util +// * @author xuxueli 2015-12-19 16:13:53 +// */ +//public final class XxlJobDynamicScheduler { +// private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler_old.class); +// +// // ---------------------- param ---------------------- +// +// // scheduler +// private static Scheduler scheduler; +// public void setScheduler(Scheduler scheduler) { +// XxlJobDynamicScheduler_old.scheduler = scheduler; +// } +// +// +// // ---------------------- init + destroy ---------------------- +// public void start() throws Exception { +// // valid +// Assert.notNull(scheduler, "quartz scheduler is null"); +// +// // init i18n +// initI18n(); +// +// // admin registry monitor run +// JobRegistryMonitorHelper.getInstance().start(); +// +// // admin monitor run +// JobFailMonitorHelper.getInstance().start(); +// +// // admin-server +// initRpcProvider(); +// +// logger.info(">>>>>>>>> init xxl-job admin success."); +// } +// +// +// public void destroy() throws Exception { +// // admin trigger pool stop +// JobTriggerPoolHelper.toStop(); +// +// // admin registry stop +// JobRegistryMonitorHelper.getInstance().toStop(); +// +// // admin monitor stop +// JobFailMonitorHelper.getInstance().toStop(); +// +// // admin-server +// stopRpcProvider(); +// } +// +// +// // ---------------------- I18n ---------------------- +// +// private void initI18n(){ +// for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) { +// item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name()))); +// } +// } +// +// +// // ---------------------- admin rpc provider (no server version) ---------------------- +// private static ServletServerHandler servletServerHandler; +// private void initRpcProvider(){ +// // init +// XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory(); +// xxlRpcProviderFactory.initConfig( +// NetEnum.NETTY_HTTP, +// Serializer.SerializeEnum.HESSIAN.getSerializer(), +// null, +// 0, +// XxlJobAdminConfig.getAdminConfig().getAccessToken(), +// null, +// null); +// +// // add services +// xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz()); +// +// // servlet handler +// servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory); +// } +// private void stopRpcProvider() throws Exception { +// XxlRpcInvokerFactory.getInstance().stop(); +// } +// public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { +// servletServerHandler.handle(null, request, response); +// } +// +// +// // ---------------------- executor-client ---------------------- +// private static ConcurrentHashMap executorBizRepository = new ConcurrentHashMap(); +// public static ExecutorBiz getExecutorBiz(String address) throws Exception { +// // valid +// if (address==null || address.trim().length()==0) { +// return null; +// } +// +// // load-cache +// address = address.trim(); +// ExecutorBiz executorBiz = executorBizRepository.get(address); +// if (executorBiz != null) { +// return executorBiz; +// } +// +// // set-cache +// executorBiz = (ExecutorBiz) new XxlRpcReferenceBean( +// NetEnum.NETTY_HTTP, +// Serializer.SerializeEnum.HESSIAN.getSerializer(), +// CallType.SYNC, +// LoadBalance.ROUND, +// ExecutorBiz.class, +// null, +// 5000, +// address, +// XxlJobAdminConfig.getAdminConfig().getAccessToken(), +// null, +// null).getObject(); +// +// executorBizRepository.put(address, executorBiz); +// return executorBiz; +// } +// +// +// // ---------------------- schedule util ---------------------- +// +// /** +// * fill job info +// * +// * @param jobInfo +// */ +// public static void fillJobInfo(XxlJobInfo jobInfo) { +// +// String name = String.valueOf(jobInfo.getId()); +// +// // trigger key +// TriggerKey triggerKey = TriggerKey.triggerKey(name); +// try { +// +// // trigger cron +// Trigger trigger = scheduler.getTrigger(triggerKey); +// if (trigger!=null && trigger instanceof CronTriggerImpl) { +// String cronExpression = ((CronTriggerImpl) trigger).getCronExpression(); +// jobInfo.setJobCron(cronExpression); +// } +// +// // trigger state +// TriggerState triggerState = scheduler.getTriggerState(triggerKey); +// if (triggerState!=null) { +// jobInfo.setJobStatus(triggerState.name()); +// } +// +// //JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup())); +// //JobDetail jobDetail = scheduler.getJobDetail(jobKey); +// //String jobClass = jobDetail.getJobClass().getName(); +// +// } catch (SchedulerException e) { +// logger.error(e.getMessage(), e); +// } +// } +// +// +// /** +// * add trigger + job +// * +// * @param jobName +// * @param cronExpression +// * @return +// * @throws SchedulerException +// */ +// public static boolean addJob(String jobName, String cronExpression) throws SchedulerException { +// // 1、job key +// TriggerKey triggerKey = TriggerKey.triggerKey(jobName); +// JobKey jobKey = new JobKey(jobName); +// +// // 2、valid +// if (scheduler.checkExists(triggerKey)) { +// return true; // PASS +// } +// +// // 3、corn trigger +// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度 +// CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); +// +// // 4、job detail +// Class jobClass_ = RemoteHttpJobBean.class; // Class.forName(jobInfo.getJobClass()); +// JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build(); +// +// /*if (jobInfo.getJobData()!=null) { +// JobDataMap jobDataMap = jobDetail.getJobDataMap(); +// jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class)); +// // JobExecutionContext context.getMergedJobDataMap().get("mailGuid"); +// }*/ +// +// // 5、schedule job +// Date date = scheduler.scheduleJob(jobDetail, cronTrigger); +// +// logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date); +// return true; +// } +// +// +// /** +// * remove trigger + job +// * +// * @param jobName +// * @return +// * @throws SchedulerException +// */ +// public static boolean removeJob(String jobName) throws SchedulerException { +// +// JobKey jobKey = new JobKey(jobName); +// scheduler.deleteJob(jobKey); +// +// /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName); +// if (scheduler.checkExists(triggerKey)) { +// scheduler.unscheduleJob(triggerKey); // trigger + job +// }*/ +// +// logger.info(">>>>>>>>>>> removeJob success(quartz), jobKey:{}", jobKey); +// return true; +// } +// +// +// /** +// * updateJobCron +// * +// * @param jobName +// * @param cronExpression +// * @return +// * @throws SchedulerException +// */ +// public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException { +// +// // 1、job key +// TriggerKey triggerKey = TriggerKey.triggerKey(jobName); +// +// // 2、valid +// if (!scheduler.checkExists(triggerKey)) { +// return true; // PASS +// } +// +// CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey); +// +// // 3、avoid repeat cron +// String oldCron = oldTrigger.getCronExpression(); +// if (oldCron.equals(cronExpression)){ +// return true; // PASS +// } +// +// // 4、new cron trigger +// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); +// oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); +// +// // 5、rescheduleJob +// scheduler.rescheduleJob(triggerKey, oldTrigger); +// +// /* +// JobKey jobKey = new JobKey(jobName); +// +// // old job detail +// JobDetail jobDetail = scheduler.getJobDetail(jobKey); +// +// // new trigger +// HashSet triggerSet = new HashSet(); +// triggerSet.add(cronTrigger); +// // cover trigger of job detail +// scheduler.scheduleJob(jobDetail, triggerSet, true);*/ +// +// logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName); +// return true; +// } +// +// +// /** +// * pause +// * +// * @param jobName +// * @return +// * @throws SchedulerException +// */ +// /*public static boolean pauseJob(String jobName) throws SchedulerException { +// +// TriggerKey triggerKey = TriggerKey.triggerKey(jobName); +// +// boolean result = false; +// if (scheduler.checkExists(triggerKey)) { +// scheduler.pauseTrigger(triggerKey); +// result = true; +// } +// +// logger.info(">>>>>>>>>>> pauseJob {}, triggerKey:{}", (result?"success":"fail"),triggerKey); +// return result; +// }*/ +// +// +// /** +// * resume +// * +// * @param jobName +// * @return +// * @throws SchedulerException +// */ +// /*public static boolean resumeJob(String jobName) throws SchedulerException { +// +// TriggerKey triggerKey = TriggerKey.triggerKey(jobName); +// +// boolean result = false; +// if (scheduler.checkExists(triggerKey)) { +// scheduler.resumeTrigger(triggerKey); +// result = true; +// } +// +// logger.info(">>>>>>>>>>> resumeJob {}, triggerKey:{}", (result?"success":"fail"), triggerKey); +// return result; +// }*/ +// +// +// /** +// * run +// * +// * @param jobName +// * @return +// * @throws SchedulerException +// */ +// /*public static boolean triggerJob(String jobName) throws SchedulerException { +// // TriggerKey : name + group +// JobKey jobKey = new JobKey(jobName); +// TriggerKey triggerKey = TriggerKey.triggerKey(jobName); +// +// boolean result = false; +// if (scheduler.checkExists(triggerKey)) { +// scheduler.triggerJob(jobKey); +// result = true; +// logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey); +// } else { +// logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey); +// } +// return result; +// }*/ +// +// +// /** +// * finaAllJobList +// * +// * @return +// *//* +// @Deprecated +// public static List> finaAllJobList(){ +// List> jobList = new ArrayList>(); +// +// try { +// if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) { +// return null; +// } +// String groupName = scheduler.getJobGroupNames().get(0); +// Set jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName)); +// if (jobKeys!=null && jobKeys.size()>0) { +// for (JobKey jobKey : jobKeys) { +// TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP); +// Trigger trigger = scheduler.getTrigger(triggerKey); +// JobDetail jobDetail = scheduler.getJobDetail(jobKey); +// TriggerState triggerState = scheduler.getTriggerState(triggerKey); +// Map jobMap = new HashMap(); +// jobMap.put("TriggerKey", triggerKey); +// jobMap.put("Trigger", trigger); +// jobMap.put("JobDetail", jobDetail); +// jobMap.put("TriggerState", triggerState); +// jobList.add(jobMap); +// } +// } +// +// } catch (SchedulerException e) { +// logger.error(e.getMessage(), e); +// return null; +// } +// return jobList; +// }*/ +// +//} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java new file mode 100644 index 000000000..ad0743079 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java @@ -0,0 +1,58 @@ +//package com.xxl.job.admin.core.quartz; +// +//import org.quartz.SchedulerConfigException; +//import org.quartz.spi.ThreadPool; +// +///** +// * single thread pool, for async trigger +// * +// * @author xuxueli 2019-03-06 +// */ +//public class XxlJobThreadPool implements ThreadPool { +// +// @Override +// public boolean runInThread(Runnable runnable) { +// +// // async run +// runnable.run(); +// return true; +// +// //return false; +// } +// +// @Override +// public int blockForAvailableThreads() { +// return 1; +// } +// +// @Override +// public void initialize() throws SchedulerConfigException { +// +// } +// +// @Override +// public void shutdown(boolean waitForJobsToComplete) { +// +// } +// +// @Override +// public int getPoolSize() { +// return 1; +// } +// +// @Override +// public void setInstanceId(String schedInstId) { +// +// } +// +// @Override +// public void setInstanceName(String schedName) { +// +// } +// +// // support +// public void setThreadCount(int count) { +// // +// } +// +//} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java new file mode 100644 index 000000000..7fff93a9d --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -0,0 +1,48 @@ +package com.xxl.job.admin.core.route; + +import com.xxl.job.admin.core.route.strategy.*; +import com.xxl.job.admin.core.util.I18nUtil; + +/** + * Created by xuxueli on 17/3/10. + */ +public enum ExecutorRouteStrategyEnum { + + FIRST(I18nUtil.getString("jobconf_route_first"), new ExecutorRouteFirst()), + LAST(I18nUtil.getString("jobconf_route_last"), new ExecutorRouteLast()), + ROUND(I18nUtil.getString("jobconf_route_round"), new ExecutorRouteRound()), + RANDOM(I18nUtil.getString("jobconf_route_random"), new ExecutorRouteRandom()), + CONSISTENT_HASH(I18nUtil.getString("jobconf_route_consistenthash"), new ExecutorRouteConsistentHash()), + LEAST_FREQUENTLY_USED(I18nUtil.getString("jobconf_route_lfu"), new ExecutorRouteLFU()), + LEAST_RECENTLY_USED(I18nUtil.getString("jobconf_route_lru"), new ExecutorRouteLRU()), + FAILOVER(I18nUtil.getString("jobconf_route_failover"), new ExecutorRouteFailover()), + BUSYOVER(I18nUtil.getString("jobconf_route_busyover"), new ExecutorRouteBusyover()), + SHARDING_BROADCAST(I18nUtil.getString("jobconf_route_shard"), null); + + ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { + this.title = title; + this.router = router; + } + + private String title; + private ExecutorRouter router; + + public String getTitle() { + return title; + } + public ExecutorRouter getRouter() { + return router; + } + + public static ExecutorRouteStrategyEnum match(String name, ExecutorRouteStrategyEnum defaultItem){ + if (name != null) { + for (ExecutorRouteStrategyEnum item: ExecutorRouteStrategyEnum.values()) { + if (item.name().equals(name)) { + return item; + } + } + } + return defaultItem; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java new file mode 100644 index 000000000..5de9a1d08 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java @@ -0,0 +1,24 @@ +package com.xxl.job.admin.core.route; + +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * Created by xuxueli on 17/3/10. + */ +public abstract class ExecutorRouter { + protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class); + + /** + * route address + * + * @param addressList + * @return ReturnT.content=address + */ + public abstract ReturnT route(TriggerParam triggerParam, List addressList); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java new file mode 100644 index 000000000..868560fc2 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java @@ -0,0 +1,48 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.ExecutorBiz; +import com.xxl.job.core.biz.model.IdleBeatParam; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; + +/** + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteBusyover extends ExecutorRouter { + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + StringBuffer idleBeatResultSB = new StringBuffer(); + for (String address : addressList) { + // beat + ReturnT idleBeatResult = null; + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address); + idleBeatResult = executorBiz.idleBeat(new IdleBeatParam(triggerParam.getJobId())); + } catch (Exception e) { + logger.error(e.getMessage(), e); + idleBeatResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); + } + idleBeatResultSB.append( (idleBeatResultSB.length()>0)?"

":"") + .append(I18nUtil.getString("jobconf_idleBeat") + ":") + .append("
address:").append(address) + .append("
code:").append(idleBeatResult.getCode()) + .append("
msg:").append(idleBeatResult.getMsg()); + + // beat success + if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) { + idleBeatResult.setMsg(idleBeatResultSB.toString()); + idleBeatResult.setContent(address); + return idleBeatResult; + } + } + + return new ReturnT(ReturnT.FAIL_CODE, idleBeatResultSB.toString()); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java new file mode 100644 index 000000000..41ac671c6 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java @@ -0,0 +1,85 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; + * a、virtual node:解决不均衡问题 + * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteConsistentHash extends ExecutorRouter { + + private static int VIRTUAL_NODE_NUM = 100; + + /** + * get hash code on 2^32 ring (md5散列的方式计算hash值) + * @param key + * @return + */ + private static long hash(String key) { + + // md5 byte + MessageDigest md5; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("MD5 not supported", e); + } + md5.reset(); + byte[] keyBytes = null; + try { + keyBytes = key.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("Unknown string :" + key, e); + } + + md5.update(keyBytes); + byte[] digest = md5.digest(); + + // hash code, Truncate to 32-bits + long hashCode = ((long) (digest[3] & 0xFF) << 24) + | ((long) (digest[2] & 0xFF) << 16) + | ((long) (digest[1] & 0xFF) << 8) + | (digest[0] & 0xFF); + + long truncateHashCode = hashCode & 0xffffffffL; + return truncateHashCode; + } + + public String hashJob(int jobId, List addressList) { + + // ------A1------A2-------A3------ + // -----------J1------------------ + TreeMap addressRing = new TreeMap(); + for (String address: addressList) { + for (int i = 0; i < VIRTUAL_NODE_NUM; i++) { + long addressHash = hash("SHARD-" + address + "-NODE-" + i); + addressRing.put(addressHash, address); + } + } + + long jobHash = hash(String.valueOf(jobId)); + SortedMap lastRing = addressRing.tailMap(jobHash); + if (!lastRing.isEmpty()) { + return lastRing.get(lastRing.firstKey()); + } + return addressRing.firstEntry().getValue(); + } + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + String address = hashJob(triggerParam.getJobId(), addressList); + return new ReturnT(address); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java new file mode 100644 index 000000000..a2e4c909a --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java @@ -0,0 +1,48 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.ExecutorBiz; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; + +/** + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteFailover extends ExecutorRouter { + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + + StringBuffer beatResultSB = new StringBuffer(); + for (String address : addressList) { + // beat + ReturnT beatResult = null; + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address); + beatResult = executorBiz.beat(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + beatResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); + } + beatResultSB.append( (beatResultSB.length()>0)?"

":"") + .append(I18nUtil.getString("jobconf_beat") + ":") + .append("
address:").append(address) + .append("
code:").append(beatResult.getCode()) + .append("
msg:").append(beatResult.getMsg()); + + // beat success + if (beatResult.getCode() == ReturnT.SUCCESS_CODE) { + + beatResult.setMsg(beatResultSB.toString()); + beatResult.setContent(address); + return beatResult; + } + } + return new ReturnT(ReturnT.FAIL_CODE, beatResultSB.toString()); + + } +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java new file mode 100644 index 000000000..de4d7afb0 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java @@ -0,0 +1,19 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; + +/** + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteFirst extends ExecutorRouter { + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList){ + return new ReturnT(addressList.get(0)); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java new file mode 100644 index 000000000..9df197262 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java @@ -0,0 +1,79 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 单个JOB对应的每个执行器,使用频率最低的优先被选举 + * a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数 + * b、LRU(Least Recently Used):最近最久未使用,时间 + * + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteLFU extends ExecutorRouter { + + private static ConcurrentMap> jobLfuMap = new ConcurrentHashMap>(); + private static long CACHE_VALID_TIME = 0; + + public String route(int jobId, List addressList) { + + // cache clear + if (System.currentTimeMillis() > CACHE_VALID_TIME) { + jobLfuMap.clear(); + CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24; + } + + // lfu item init + HashMap lfuItemMap = jobLfuMap.get(jobId); // Key排序可以用TreeMap+构造入参Compare;Value排序暂时只能通过ArrayList; + if (lfuItemMap == null) { + lfuItemMap = new HashMap(); + jobLfuMap.putIfAbsent(jobId, lfuItemMap); // 避免重复覆盖 + } + + // put new + for (String address: addressList) { + if (!lfuItemMap.containsKey(address) || lfuItemMap.get(address) >1000000 ) { + lfuItemMap.put(address, new Random().nextInt(addressList.size())); // 初始化时主动Random一次,缓解首次压力 + } + } + // remove old + List delKeys = new ArrayList<>(); + for (String existKey: lfuItemMap.keySet()) { + if (!addressList.contains(existKey)) { + delKeys.add(existKey); + } + } + if (delKeys.size() > 0) { + for (String delKey: delKeys) { + lfuItemMap.remove(delKey); + } + } + + // load least userd count address + List> lfuItemList = new ArrayList>(lfuItemMap.entrySet()); + Collections.sort(lfuItemList, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + return o1.getValue().compareTo(o2.getValue()); + } + }); + + Map.Entry addressItem = lfuItemList.get(0); + String minAddress = addressItem.getKey(); + addressItem.setValue(addressItem.getValue() + 1); + + return addressItem.getKey(); + } + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + String address = route(triggerParam.getJobId(), addressList); + return new ReturnT(address); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java new file mode 100644 index 000000000..2d5400677 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java @@ -0,0 +1,76 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 单个JOB对应的每个执行器,最久为使用的优先被选举 + * a、LFU(Least Frequently Used):最不经常使用,频率/次数 + * b(*)、LRU(Least Recently Used):最近最久未使用,时间 + * + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteLRU extends ExecutorRouter { + + private static ConcurrentMap> jobLRUMap = new ConcurrentHashMap>(); + private static long CACHE_VALID_TIME = 0; + + public String route(int jobId, List addressList) { + + // cache clear + if (System.currentTimeMillis() > CACHE_VALID_TIME) { + jobLRUMap.clear(); + CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24; + } + + // init lru + LinkedHashMap lruItem = jobLRUMap.get(jobId); + if (lruItem == null) { + /** + * LinkedHashMap + * a、accessOrder:true=访问顺序排序(get/put时排序);false=插入顺序排期; + * b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法; + */ + lruItem = new LinkedHashMap(16, 0.75f, true); + jobLRUMap.putIfAbsent(jobId, lruItem); + } + + // put new + for (String address: addressList) { + if (!lruItem.containsKey(address)) { + lruItem.put(address, address); + } + } + // remove old + List delKeys = new ArrayList<>(); + for (String existKey: lruItem.keySet()) { + if (!addressList.contains(existKey)) { + delKeys.add(existKey); + } + } + if (delKeys.size() > 0) { + for (String delKey: delKeys) { + lruItem.remove(delKey); + } + } + + // load + String eldestKey = lruItem.entrySet().iterator().next().getKey(); + String eldestValue = lruItem.get(eldestKey); + return eldestValue; + } + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + String address = route(triggerParam.getJobId(), addressList); + return new ReturnT(address); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java new file mode 100644 index 000000000..4ff3cf6ba --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java @@ -0,0 +1,19 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; + +/** + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteLast extends ExecutorRouter { + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + return new ReturnT(addressList.get(addressList.size()-1)); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java new file mode 100644 index 000000000..5ea4a3841 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java @@ -0,0 +1,23 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; +import java.util.Random; + +/** + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteRandom extends ExecutorRouter { + + private static Random localRandom = new Random(); + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + String address = addressList.get(localRandom.nextInt(addressList.size())); + return new ReturnT(address); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java new file mode 100644 index 000000000..d0ea2baab --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java @@ -0,0 +1,46 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteRound extends ExecutorRouter { + + private static ConcurrentMap routeCountEachJob = new ConcurrentHashMap<>(); + private static long CACHE_VALID_TIME = 0; + + private static int count(int jobId) { + // cache clear + if (System.currentTimeMillis() > CACHE_VALID_TIME) { + routeCountEachJob.clear(); + CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24; + } + + AtomicInteger count = routeCountEachJob.get(jobId); + if (count == null || count.get() > 1000000) { + // 初始化时主动Random一次,缓解首次压力 + count = new AtomicInteger(new Random().nextInt(100)); + } else { + // count++ + count.addAndGet(1); + } + routeCountEachJob.put(jobId, count); + return count.get(); + } + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + String address = addressList.get(count(triggerParam.getJobId())%addressList.size()); + return new ReturnT(address); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java new file mode 100644 index 000000000..0b9b4a9c8 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java @@ -0,0 +1,39 @@ +package com.xxl.job.admin.core.scheduler; + +import com.xxl.job.admin.core.util.I18nUtil; + +/** + * @author xuxueli 2020-10-29 21:11:23 + */ +public enum MisfireStrategyEnum { + + /** + * do nothing + */ + DO_NOTHING(I18nUtil.getString("misfire_strategy_do_nothing")), + + /** + * fire once now + */ + FIRE_ONCE_NOW(I18nUtil.getString("misfire_strategy_fire_once_now")); + + private String title; + + MisfireStrategyEnum(String title) { + this.title = title; + } + + public String getTitle() { + return title; + } + + public static MisfireStrategyEnum match(String name, MisfireStrategyEnum defaultItem){ + for (MisfireStrategyEnum item: MisfireStrategyEnum.values()) { + if (item.name().equals(name)) { + return item; + } + } + return defaultItem; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java new file mode 100644 index 000000000..aa334fda0 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java @@ -0,0 +1,46 @@ +package com.xxl.job.admin.core.scheduler; + +import com.xxl.job.admin.core.util.I18nUtil; + +/** + * @author xuxueli 2020-10-29 21:11:23 + */ +public enum ScheduleTypeEnum { + + NONE(I18nUtil.getString("schedule_type_none")), + + /** + * schedule by cron + */ + CRON(I18nUtil.getString("schedule_type_cron")), + + /** + * schedule by fixed rate (in seconds) + */ + FIX_RATE(I18nUtil.getString("schedule_type_fix_rate")), + + /** + * schedule by fix delay (in seconds), after the last time + */ + /*FIX_DELAY(I18nUtil.getString("schedule_type_fix_delay"))*/; + + private String title; + + ScheduleTypeEnum(String title) { + this.title = title; + } + + public String getTitle() { + return title; + } + + public static ScheduleTypeEnum match(String name, ScheduleTypeEnum defaultItem){ + for (ScheduleTypeEnum item: ScheduleTypeEnum.values()) { + if (item.name().equals(name)) { + return item; + } + } + return defaultItem; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java new file mode 100644 index 000000000..bb2cda8bc --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java @@ -0,0 +1,101 @@ +package com.xxl.job.admin.core.scheduler; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.thread.*; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.ExecutorBiz; +import com.xxl.job.core.biz.client.ExecutorBizClient; +import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author xuxueli 2018-10-28 00:18:17 + */ + +public class XxlJobScheduler { + private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class); + + + public void init() throws Exception { + // init i18n + initI18n(); + + // admin trigger pool start + JobTriggerPoolHelper.toStart(); + + // admin registry monitor run + JobRegistryHelper.getInstance().start(); + + // admin fail-monitor run + JobFailMonitorHelper.getInstance().start(); + + // admin lose-monitor run ( depend on JobTriggerPoolHelper ) + JobCompleteHelper.getInstance().start(); + + // admin log report start + JobLogReportHelper.getInstance().start(); + + // start-schedule ( depend on JobTriggerPoolHelper ) + JobScheduleHelper.getInstance().start(); + + logger.info(">>>>>>>>> init xxl-job admin success."); + } + + + public void destroy() throws Exception { + + // stop-schedule + JobScheduleHelper.getInstance().toStop(); + + // admin log report stop + JobLogReportHelper.getInstance().toStop(); + + // admin lose-monitor stop + JobCompleteHelper.getInstance().toStop(); + + // admin fail-monitor stop + JobFailMonitorHelper.getInstance().toStop(); + + // admin registry stop + JobRegistryHelper.getInstance().toStop(); + + // admin trigger pool stop + JobTriggerPoolHelper.toStop(); + + } + + // ---------------------- I18n ---------------------- + + private void initI18n(){ + for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) { + item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name()))); + } + } + + // ---------------------- executor-client ---------------------- + private static ConcurrentMap executorBizRepository = new ConcurrentHashMap(); + public static ExecutorBiz getExecutorBiz(String address) throws Exception { + // valid + if (address==null || address.trim().length()==0) { + return null; + } + + // load-cache + address = address.trim(); + ExecutorBiz executorBiz = executorBizRepository.get(address); + if (executorBiz != null) { + return executorBiz; + } + + // set-cache + executorBiz = new ExecutorBizClient(address, XxlJobAdminConfig.getAdminConfig().getAccessToken()); + + executorBizRepository.put(address, executorBiz); + return executorBiz; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java new file mode 100644 index 000000000..5698926a2 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java @@ -0,0 +1,184 @@ +package com.xxl.job.admin.core.thread; + +import com.xxl.job.admin.core.complete.XxlJobCompleter; +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.model.HandleCallbackParam; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.List; +import java.util.concurrent.*; + +/** + * job lose-monitor instance + * + * @author xuxueli 2015-9-1 18:05:56 + */ +public class JobCompleteHelper { + private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class); + + private static JobCompleteHelper instance = new JobCompleteHelper(); + public static JobCompleteHelper getInstance(){ + return instance; + } + + // ---------------------- monitor ---------------------- + + private ThreadPoolExecutor callbackThreadPool = null; + private Thread monitorThread; + private volatile boolean toStop = false; + public void start(){ + + // for callback + callbackThreadPool = new ThreadPoolExecutor( + 2, + 20, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(3000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode()); + } + }, + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + r.run(); + logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now)."); + } + }); + + + // for monitor + monitorThread = new Thread(new Runnable() { + + @Override + public void run() { + + // wait for JobTriggerPoolHelper-init + try { + TimeUnit.MILLISECONDS.sleep(50); + } catch (InterruptedException e) { + if (!toStop) { + logger.error(e.getMessage(), e); + } + } + + // monitor + while (!toStop) { + try { + // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; + Date losedTime = DateUtil.addMinutes(new Date(), -10); + List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime); + + if (losedJobIds!=null && losedJobIds.size()>0) { + for (Long logId: losedJobIds) { + + XxlJobLog jobLog = new XxlJobLog(); + jobLog.setId(logId); + + jobLog.setHandleTime(new Date()); + jobLog.setHandleCode(ReturnT.FAIL_CODE); + jobLog.setHandleMsg( I18nUtil.getString("joblog_lost_fail") ); + + XxlJobCompleter.updateHandleInfoAndFinish(jobLog); + } + + } + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e); + } + } + + try { + TimeUnit.SECONDS.sleep(60); + } catch (Exception e) { + if (!toStop) { + logger.error(e.getMessage(), e); + } + } + + } + + logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop"); + + } + }); + monitorThread.setDaemon(true); + monitorThread.setName("xxl-job, admin JobLosedMonitorHelper"); + monitorThread.start(); + } + + public void toStop(){ + toStop = true; + + // stop registryOrRemoveThreadPool + callbackThreadPool.shutdownNow(); + + // stop monitorThread (interrupt and wait) + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + + + // ---------------------- helper ---------------------- + + public ReturnT callback(List callbackParamList) { + + callbackThreadPool.execute(new Runnable() { + @Override + public void run() { + for (HandleCallbackParam handleCallbackParam: callbackParamList) { + ReturnT callbackResult = callback(handleCallbackParam); + logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", + (callbackResult.getCode()== ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult); + } + } + }); + + return ReturnT.SUCCESS; + } + + private ReturnT callback(HandleCallbackParam handleCallbackParam) { + // valid log item + XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId()); + if (log == null) { + return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); + } + if (log.getHandleCode() > 0) { + return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc + } + + // handle msg + StringBuffer handleMsg = new StringBuffer(); + if (log.getHandleMsg()!=null) { + handleMsg.append(log.getHandleMsg()).append("
"); + } + if (handleCallbackParam.getHandleMsg() != null) { + handleMsg.append(handleCallbackParam.getHandleMsg()); + } + + // success, save log + log.setHandleTime(new Date()); + log.setHandleCode(handleCallbackParam.getHandleCode()); + log.setHandleMsg(handleMsg.toString()); + XxlJobCompleter.updateHandleInfoAndFinish(log); + + return ReturnT.SUCCESS; + } + + + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java new file mode 100644 index 000000000..33e4d250d --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -0,0 +1,110 @@ +package com.xxl.job.admin.core.thread; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.trigger.TriggerTypeEnum; +import com.xxl.job.admin.core.util.I18nUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * job monitor instance + * + * @author xuxueli 2015-9-1 18:05:56 + */ +public class JobFailMonitorHelper { + private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class); + + private static JobFailMonitorHelper instance = new JobFailMonitorHelper(); + public static JobFailMonitorHelper getInstance(){ + return instance; + } + + // ---------------------- monitor ---------------------- + + private Thread monitorThread; + private volatile boolean toStop = false; + public void start(){ + monitorThread = new Thread(new Runnable() { + + @Override + public void run() { + + // monitor + while (!toStop) { + try { + + List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000); + if (failLogIds!=null && !failLogIds.isEmpty()) { + for (long failLogId: failLogIds) { + + // lock log + int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1); + if (lockRet < 1) { + continue; + } + XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); + XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId()); + + // 1、fail retry monitor + if (log.getExecutorFailRetryCount() > 0) { + JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null); + String retryMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<<
"; + log.setTriggerMsg(log.getTriggerMsg() + retryMsg); + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log); + } + + // 2、fail alarm monitor + int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 + if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { + boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); + newAlarmStatus = alarmResult?2:3; + } else { + newAlarmStatus = 1; + } + + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus); + } + } + + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e); + } + } + + try { + TimeUnit.SECONDS.sleep(10); + } catch (Exception e) { + if (!toStop) { + logger.error(e.getMessage(), e); + } + } + + } + + logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop"); + + } + }); + monitorThread.setDaemon(true); + monitorThread.setName("xxl-job, admin JobFailMonitorHelper"); + monitorThread.start(); + } + + public void toStop(){ + toStop = true; + // interrupt and wait + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java new file mode 100644 index 000000000..2387a0c42 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java @@ -0,0 +1,152 @@ +package com.xxl.job.admin.core.thread; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobLogReport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * job log report helper + * + * @author xuxueli 2019-11-22 + */ +public class JobLogReportHelper { + private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class); + + private static JobLogReportHelper instance = new JobLogReportHelper(); + public static JobLogReportHelper getInstance(){ + return instance; + } + + + private Thread logrThread; + private volatile boolean toStop = false; + public void start(){ + logrThread = new Thread(new Runnable() { + + @Override + public void run() { + + // last clean log time + long lastCleanLogTime = 0; + + + while (!toStop) { + + // 1、log-report refresh: refresh log report in 3 days + try { + + for (int i = 0; i < 3; i++) { + + // today + Calendar itemDay = Calendar.getInstance(); + itemDay.add(Calendar.DAY_OF_MONTH, -i); + itemDay.set(Calendar.HOUR_OF_DAY, 0); + itemDay.set(Calendar.MINUTE, 0); + itemDay.set(Calendar.SECOND, 0); + itemDay.set(Calendar.MILLISECOND, 0); + + Date todayFrom = itemDay.getTime(); + + itemDay.set(Calendar.HOUR_OF_DAY, 23); + itemDay.set(Calendar.MINUTE, 59); + itemDay.set(Calendar.SECOND, 59); + itemDay.set(Calendar.MILLISECOND, 999); + + Date todayTo = itemDay.getTime(); + + // refresh log-report every minute + XxlJobLogReport xxlJobLogReport = new XxlJobLogReport(); + xxlJobLogReport.setTriggerDay(todayFrom); + xxlJobLogReport.setRunningCount(0); + xxlJobLogReport.setSucCount(0); + xxlJobLogReport.setFailCount(0); + + Map triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLogReport(todayFrom, todayTo); + if (triggerCountMap!=null && triggerCountMap.size()>0) { + int triggerDayCount = triggerCountMap.containsKey("triggerDayCount")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))):0; + int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))):0; + int triggerDayCountSuc = triggerCountMap.containsKey("triggerDayCountSuc")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountSuc"))):0; + int triggerDayCountFail = triggerDayCount - triggerDayCountRunning - triggerDayCountSuc; + + xxlJobLogReport.setRunningCount(triggerDayCountRunning); + xxlJobLogReport.setSucCount(triggerDayCountSuc); + xxlJobLogReport.setFailCount(triggerDayCountFail); + } + + // do refresh + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().update(xxlJobLogReport); + if (ret < 1) { + XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport); + } + } + + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job log report thread error:{}", e); + } + } + + // 2、log-clean: switch open & once each day + if (XxlJobAdminConfig.getAdminConfig().getLogretentiondays()>0 + && System.currentTimeMillis() - lastCleanLogTime > 24*60*60*1000) { + + // expire-time + Calendar expiredDay = Calendar.getInstance(); + expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminConfig.getAdminConfig().getLogretentiondays()); + expiredDay.set(Calendar.HOUR_OF_DAY, 0); + expiredDay.set(Calendar.MINUTE, 0); + expiredDay.set(Calendar.SECOND, 0); + expiredDay.set(Calendar.MILLISECOND, 0); + Date clearBeforeTime = expiredDay.getTime(); + + // clean expired log + List logIds = null; + do { + logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, 0, 1000); + if (logIds!=null && logIds.size()>0) { + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds); + } + } while (logIds!=null && logIds.size()>0); + + // update clean time + lastCleanLogTime = System.currentTimeMillis(); + } + + try { + TimeUnit.MINUTES.sleep(1); + } catch (Exception e) { + if (!toStop) { + logger.error(e.getMessage(), e); + } + } + + } + + logger.info(">>>>>>>>>>> xxl-job, job log report thread stop"); + + } + }); + logrThread.setDaemon(true); + logrThread.setName("xxl-job, admin JobLogReportHelper"); + logrThread.start(); + } + + public void toStop(){ + toStop = true; + // interrupt and wait + logrThread.interrupt(); + try { + logrThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java new file mode 100644 index 000000000..37edfd985 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -0,0 +1,204 @@ +package com.xxl.job.admin.core.thread; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobRegistry; +import com.xxl.job.core.biz.model.RegistryParam; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.enums.RegistryConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.concurrent.*; + +/** + * job registry instance + * @author xuxueli 2016-10-02 19:10:24 + */ +public class JobRegistryHelper { + private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class); + + private static JobRegistryHelper instance = new JobRegistryHelper(); + public static JobRegistryHelper getInstance(){ + return instance; + } + + private ThreadPoolExecutor registryOrRemoveThreadPool = null; + private Thread registryMonitorThread; + private volatile boolean toStop = false; + + public void start(){ + + // for registry or remove + registryOrRemoveThreadPool = new ThreadPoolExecutor( + 2, + 10, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(2000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode()); + } + }, + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + r.run(); + logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now)."); + } + }); + + // for monitor + registryMonitorThread = new Thread(new Runnable() { + @Override + public void run() { + while (!toStop) { + try { + // auto registry group + List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0); + if (groupList!=null && !groupList.isEmpty()) { + + // remove dead address (admin/executor) + List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (ids!=null && ids.size()>0) { + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); + } + + // fresh online address (admin/executor) + HashMap> appAddressMap = new HashMap>(); + List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (list != null) { + for (XxlJobRegistry item: list) { + if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { + String appname = item.getRegistryKey(); + List registryList = appAddressMap.get(appname); + if (registryList == null) { + registryList = new ArrayList(); + } + + if (!registryList.contains(item.getRegistryValue())) { + registryList.add(item.getRegistryValue()); + } + appAddressMap.put(appname, registryList); + } + } + } + + // fresh group address + for (XxlJobGroup group: groupList) { + List registryList = appAddressMap.get(group.getAppname()); + String addressListStr = null; + if (registryList!=null && !registryList.isEmpty()) { + Collections.sort(registryList); + StringBuilder addressListSB = new StringBuilder(); + for (String item:registryList) { + addressListSB.append(item).append(","); + } + addressListStr = addressListSB.toString(); + addressListStr = addressListStr.substring(0, addressListStr.length()-1); + } + group.setAddressList(addressListStr); + group.setUpdateTime(new Date()); + + XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group); + } + } + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e); + } + } + try { + TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT); + } catch (InterruptedException e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e); + } + } + } + logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop"); + } + }); + registryMonitorThread.setDaemon(true); + registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread"); + registryMonitorThread.start(); + } + + public void toStop(){ + toStop = true; + + // stop registryOrRemoveThreadPool + registryOrRemoveThreadPool.shutdownNow(); + + // stop monitir (interrupt and wait) + registryMonitorThread.interrupt(); + try { + registryMonitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + + + // ---------------------- helper ---------------------- + + public ReturnT registry(RegistryParam registryParam) { + + // valid + if (!StringUtils.hasText(registryParam.getRegistryGroup()) + || !StringUtils.hasText(registryParam.getRegistryKey()) + || !StringUtils.hasText(registryParam.getRegistryValue())) { + return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); + } + + // async execute + registryOrRemoveThreadPool.execute(new Runnable() { + @Override + public void run() { + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + if (ret < 1) { + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + + // fresh + freshGroupRegistryInfo(registryParam); + } + } + }); + + return ReturnT.SUCCESS; + } + + public ReturnT registryRemove(RegistryParam registryParam) { + + // valid + if (!StringUtils.hasText(registryParam.getRegistryGroup()) + || !StringUtils.hasText(registryParam.getRegistryKey()) + || !StringUtils.hasText(registryParam.getRegistryValue())) { + return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); + } + + // async execute + registryOrRemoveThreadPool.execute(new Runnable() { + @Override + public void run() { + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue()); + if (ret > 0) { + // fresh + freshGroupRegistryInfo(registryParam); + } + } + }); + + return ReturnT.SUCCESS; + } + + private void freshGroupRegistryInfo(RegistryParam registryParam){ + // Under consideration, prevent affecting core tables + } + + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java new file mode 100644 index 000000000..831bcf6a6 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java @@ -0,0 +1,369 @@ +package com.xxl.job.admin.core.thread; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.cron.CronExpression; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum; +import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum; +import com.xxl.job.admin.core.trigger.TriggerTypeEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * @author xuxueli 2019-05-21 + */ +public class JobScheduleHelper { + private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class); + + private static JobScheduleHelper instance = new JobScheduleHelper(); + public static JobScheduleHelper getInstance(){ + return instance; + } + + public static final long PRE_READ_MS = 5000; // pre read + + private Thread scheduleThread; + private Thread ringThread; + private volatile boolean scheduleThreadToStop = false; + private volatile boolean ringThreadToStop = false; + private volatile static Map> ringData = new ConcurrentHashMap<>(); + + public void start(){ + + // schedule thread + scheduleThread = new Thread(new Runnable() { + @Override + public void run() { + + try { + TimeUnit.MILLISECONDS.sleep(5000 - System.currentTimeMillis()%1000 ); + } catch (InterruptedException e) { + if (!scheduleThreadToStop) { + logger.error(e.getMessage(), e); + } + } + logger.info(">>>>>>>>> init xxl-job admin scheduler success."); + + // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20) + int preReadCount = (XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax() + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax()) * 20; + + while (!scheduleThreadToStop) { + + // Scan Job + long start = System.currentTimeMillis(); + + Connection conn = null; + Boolean connAutoCommit = null; + PreparedStatement preparedStatement = null; + + boolean preReadSuc = true; + try { + + conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection(); + connAutoCommit = conn.getAutoCommit(); + conn.setAutoCommit(false); + + preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" ); + preparedStatement.execute(); + + // tx start + + // 1、pre read + long nowTime = System.currentTimeMillis(); + List scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount); + if (scheduleList!=null && scheduleList.size()>0) { + // 2、push time-ring + for (XxlJobInfo jobInfo: scheduleList) { + + // time-ring jump + if (nowTime > jobInfo.getTriggerNextTime() + PRE_READ_MS) { + // 2.1、trigger-expire > 5s:pass && make next-trigger-time + logger.warn(">>>>>>>>>>> xxl-job, schedule misfire, jobId = " + jobInfo.getId()); + + // 1、misfire match + MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); + if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) { + // FIRE_ONCE_NOW 》 trigger + JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null); + logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() ); + } + + // 2、fresh next + refreshNextValidTime(jobInfo, new Date()); + + } else if (nowTime > jobInfo.getTriggerNextTime()) { + // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time + + // 1、trigger + JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null); + logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() ); + + // 2、fresh next + refreshNextValidTime(jobInfo, new Date()); + + // next-trigger-time in 5s, pre-read again + if (jobInfo.getTriggerStatus()==1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) { + + // 1、make ring second + int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60); + + // 2、push time ring + pushTimeRing(ringSecond, jobInfo.getId()); + + // 3、fresh next + refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime())); + + } + + } else { + // 2.3、trigger-pre-read:time-ring trigger && make next-trigger-time + + // 1、make ring second + int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60); + + // 2、push time ring + pushTimeRing(ringSecond, jobInfo.getId()); + + // 3、fresh next + refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime())); + + } + + } + + // 3、update trigger info + for (XxlJobInfo jobInfo: scheduleList) { + XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleUpdate(jobInfo); + } + + } else { + preReadSuc = false; + } + + // tx stop + + + } catch (Exception e) { + if (!scheduleThreadToStop) { + logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}", e); + } + } finally { + + // commit + if (conn != null) { + try { + conn.commit(); + } catch (SQLException e) { + if (!scheduleThreadToStop) { + logger.error(e.getMessage(), e); + } + } + try { + conn.setAutoCommit(connAutoCommit); + } catch (SQLException e) { + if (!scheduleThreadToStop) { + logger.error(e.getMessage(), e); + } + } + try { + conn.close(); + } catch (SQLException e) { + if (!scheduleThreadToStop) { + logger.error(e.getMessage(), e); + } + } + } + + // close PreparedStatement + if (null != preparedStatement) { + try { + preparedStatement.close(); + } catch (SQLException e) { + if (!scheduleThreadToStop) { + logger.error(e.getMessage(), e); + } + } + } + } + long cost = System.currentTimeMillis()-start; + + + // Wait seconds, align second + if (cost < 1000) { // scan-overtime, not wait + try { + // pre-read period: success > scan each second; fail > skip this period; + TimeUnit.MILLISECONDS.sleep((preReadSuc?1000:PRE_READ_MS) - System.currentTimeMillis()%1000); + } catch (InterruptedException e) { + if (!scheduleThreadToStop) { + logger.error(e.getMessage(), e); + } + } + } + + } + + logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread stop"); + } + }); + scheduleThread.setDaemon(true); + scheduleThread.setName("xxl-job, admin JobScheduleHelper#scheduleThread"); + scheduleThread.start(); + + + // ring thread + ringThread = new Thread(new Runnable() { + @Override + public void run() { + + while (!ringThreadToStop) { + + // align second + try { + TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis() % 1000); + } catch (InterruptedException e) { + if (!ringThreadToStop) { + logger.error(e.getMessage(), e); + } + } + + try { + // second data + List ringItemData = new ArrayList<>(); + int nowSecond = Calendar.getInstance().get(Calendar.SECOND); // 避免处理耗时太长,跨过刻度,向前校验一个刻度; + for (int i = 0; i < 2; i++) { + List tmpData = ringData.remove( (nowSecond+60-i)%60 ); + if (tmpData != null) { + ringItemData.addAll(tmpData); + } + } + + // ring trigger + logger.debug(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData) ); + if (ringItemData.size() > 0) { + // do trigger + for (int jobId: ringItemData) { + // do trigger + JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null); + } + // clear + ringItemData.clear(); + } + } catch (Exception e) { + if (!ringThreadToStop) { + logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e); + } + } + } + logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread stop"); + } + }); + ringThread.setDaemon(true); + ringThread.setName("xxl-job, admin JobScheduleHelper#ringThread"); + ringThread.start(); + } + + private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { + Date nextValidTime = generateNextValidTime(jobInfo, fromTime); + if (nextValidTime != null) { + jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime()); + jobInfo.setTriggerNextTime(nextValidTime.getTime()); + } else { + jobInfo.setTriggerStatus(0); + jobInfo.setTriggerLastTime(0); + jobInfo.setTriggerNextTime(0); + logger.warn(">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}", + jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf()); + } + } + + private void pushTimeRing(int ringSecond, int jobId){ + // push async ring + List ringItemData = ringData.get(ringSecond); + if (ringItemData == null) { + ringItemData = new ArrayList(); + ringData.put(ringSecond, ringItemData); + } + ringItemData.add(jobId); + + logger.debug(">>>>>>>>>>> xxl-job, schedule push time-ring : " + ringSecond + " = " + Arrays.asList(ringItemData) ); + } + + public void toStop(){ + + // 1、stop schedule + scheduleThreadToStop = true; + try { + TimeUnit.SECONDS.sleep(1); // wait + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + if (scheduleThread.getState() != Thread.State.TERMINATED){ + // interrupt and wait + scheduleThread.interrupt(); + try { + scheduleThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + + // if has ring data + boolean hasRingData = false; + if (!ringData.isEmpty()) { + for (int second : ringData.keySet()) { + List tmpData = ringData.get(second); + if (tmpData!=null && tmpData.size()>0) { + hasRingData = true; + break; + } + } + } + if (hasRingData) { + try { + TimeUnit.SECONDS.sleep(8); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + + // stop ring (wait job-in-memory stop) + ringThreadToStop = true; + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + if (ringThread.getState() != Thread.State.TERMINATED){ + // interrupt and wait + ringThread.interrupt(); + try { + ringThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + + logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper stop"); + } + + + // ---------------------- tools ---------------------- + public static Date generateNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (ScheduleTypeEnum.CRON == scheduleTypeEnum) { + Date nextValidTime = new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime); + return nextValidTime; + } else if (ScheduleTypeEnum.FIX_RATE == scheduleTypeEnum /*|| ScheduleTypeEnum.FIX_DELAY == scheduleTypeEnum*/) { + return new Date(fromTime.getTime() + Integer.valueOf(jobInfo.getScheduleConf())*1000 ); + } + return null; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java new file mode 100644 index 000000000..398713dd9 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java @@ -0,0 +1,150 @@ +package com.xxl.job.admin.core.thread; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.trigger.TriggerTypeEnum; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * job trigger thread pool helper + * + * @author xuxueli 2018-07-03 21:08:07 + */ +public class JobTriggerPoolHelper { + private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class); + + + // ---------------------- trigger pool ---------------------- + + // fast/slow thread pool + private ThreadPoolExecutor fastTriggerPool = null; + private ThreadPoolExecutor slowTriggerPool = null; + + public void start(){ + fastTriggerPool = new ThreadPoolExecutor( + 10, + XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(), + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(1000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode()); + } + }); + + slowTriggerPool = new ThreadPoolExecutor( + 10, + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(), + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(2000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode()); + } + }); + } + + + public void stop() { + //triggerPool.shutdown(); + fastTriggerPool.shutdownNow(); + slowTriggerPool.shutdownNow(); + logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success."); + } + + + // job timeout count + private volatile long minTim = System.currentTimeMillis()/60000; // ms > min + private volatile ConcurrentMap jobTimeoutCountMap = new ConcurrentHashMap<>(); + + + /** + * add trigger + */ + public void addTrigger(final int jobId, + final TriggerTypeEnum triggerType, + final int failRetryCount, + final String executorShardingParam, + final String executorParam, + final String addressList) { + + // choose thread pool + ThreadPoolExecutor triggerPool_ = fastTriggerPool; + AtomicInteger jobTimeoutCount = jobTimeoutCountMap.get(jobId); + if (jobTimeoutCount!=null && jobTimeoutCount.get() > 10) { // job-timeout 10 times in 1 min + triggerPool_ = slowTriggerPool; + } + + // trigger + triggerPool_.execute(new Runnable() { + @Override + public void run() { + + long start = System.currentTimeMillis(); + + try { + // do trigger + XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } finally { + + // check timeout-count-map + long minTim_now = System.currentTimeMillis()/60000; + if (minTim != minTim_now) { + minTim = minTim_now; + jobTimeoutCountMap.clear(); + } + + // incr timeout-count-map + long cost = System.currentTimeMillis()-start; + if (cost > 500) { // ob-timeout threshold 500ms + AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(jobId, new AtomicInteger(1)); + if (timeoutCount != null) { + timeoutCount.incrementAndGet(); + } + } + + } + + } + }); + } + + + + // ---------------------- helper ---------------------- + + private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper(); + + public static void toStart() { + helper.start(); + } + public static void toStop() { + helper.stop(); + } + + /** + * @param jobId + * @param triggerType + * @param failRetryCount + * >=0: use this param + * <0: use param from job info config + * @param executorShardingParam + * @param executorParam + * null: use job param + * not null: cover job param + */ + public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) { + helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java new file mode 100644 index 000000000..446c90e91 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java @@ -0,0 +1,27 @@ +package com.xxl.job.admin.core.trigger; + +import com.xxl.job.admin.core.util.I18nUtil; + +/** + * trigger type enum + * + * @author xuxueli 2018-09-16 04:56:41 + */ +public enum TriggerTypeEnum { + + MANUAL(I18nUtil.getString("jobconf_trigger_type_manual")), + CRON(I18nUtil.getString("jobconf_trigger_type_cron")), + RETRY(I18nUtil.getString("jobconf_trigger_type_retry")), + PARENT(I18nUtil.getString("jobconf_trigger_type_parent")), + API(I18nUtil.getString("jobconf_trigger_type_api")), + MISFIRE(I18nUtil.getString("jobconf_trigger_type_misfire")); + + private TriggerTypeEnum(String title){ + this.title = title; + } + private String title; + public String getTitle() { + return title; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java new file mode 100644 index 000000000..748befc6b --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -0,0 +1,226 @@ +package com.xxl.job.admin.core.trigger; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; +import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.ExecutorBiz; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; +import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; +import com.xxl.job.core.util.IpUtil; +import com.xxl.job.core.util.ThrowableUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +/** + * xxl-job trigger + * Created by xuxueli on 17/7/13. + */ +public class XxlJobTrigger { + private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class); + + /** + * trigger job + * + * @param jobId + * @param triggerType + * @param failRetryCount + * >=0: use this param + * <0: use param from job info config + * @param executorShardingParam + * @param executorParam + * null: use job param + * not null: cover job param + * @param addressList + * null: use executor addressList + * not null: cover + */ + public static void trigger(int jobId, + TriggerTypeEnum triggerType, + int failRetryCount, + String executorShardingParam, + String executorParam, + String addressList) { + + // load data + XxlJobInfo jobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(jobId); + if (jobInfo == null) { + logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId); + return; + } + if (executorParam != null) { + jobInfo.setExecutorParam(executorParam); + } + int finalFailRetryCount = failRetryCount>=0?failRetryCount:jobInfo.getExecutorFailRetryCount(); + XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(jobInfo.getJobGroup()); + + // cover addressList + if (addressList!=null && addressList.trim().length()>0) { + group.setAddressType(1); + group.setAddressList(addressList.trim()); + } + + // sharding param + int[] shardingParam = null; + if (executorShardingParam!=null){ + String[] shardingArr = executorShardingParam.split("/"); + if (shardingArr.length==2 && isNumeric(shardingArr[0]) && isNumeric(shardingArr[1])) { + shardingParam = new int[2]; + shardingParam[0] = Integer.valueOf(shardingArr[0]); + shardingParam[1] = Integer.valueOf(shardingArr[1]); + } + } + if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) + && group.getRegistryList()!=null && !group.getRegistryList().isEmpty() + && shardingParam==null) { + for (int i = 0; i < group.getRegistryList().size(); i++) { + processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size()); + } + } else { + if (shardingParam == null) { + shardingParam = new int[]{0, 1}; + } + processTrigger(group, jobInfo, finalFailRetryCount, triggerType, shardingParam[0], shardingParam[1]); + } + + } + + private static boolean isNumeric(String str){ + try { + int result = Integer.valueOf(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + /** + * @param group job group, registry list may be empty + * @param jobInfo + * @param finalFailRetryCount + * @param triggerType + * @param index sharding index + * @param total sharding index + */ + private static void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total){ + + // param + ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION); // block strategy + ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null); // route strategy + String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum)?String.valueOf(index).concat("/").concat(String.valueOf(total)):null; + + // 1、save log-id + XxlJobLog jobLog = new XxlJobLog(); + jobLog.setJobGroup(jobInfo.getJobGroup()); + jobLog.setJobId(jobInfo.getId()); + jobLog.setTriggerTime(new Date()); + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog); + logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId()); + + // 2、init trigger-param + TriggerParam triggerParam = new TriggerParam(); + triggerParam.setJobId(jobInfo.getId()); + triggerParam.setExecutorHandler(jobInfo.getExecutorHandler()); + triggerParam.setExecutorParams(jobInfo.getExecutorParam()); + triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); + triggerParam.setExecutorTimeout(jobInfo.getExecutorTimeout()); + triggerParam.setLogId(jobLog.getId()); + triggerParam.setLogDateTime(jobLog.getTriggerTime().getTime()); + triggerParam.setGlueType(jobInfo.getGlueType()); + triggerParam.setGlueSource(jobInfo.getGlueSource()); + triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime()); + triggerParam.setBroadcastIndex(index); + triggerParam.setBroadcastTotal(total); + + // 3、init address + String address = null; + ReturnT routeAddressResult = null; + if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) { + if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) { + if (index < group.getRegistryList().size()) { + address = group.getRegistryList().get(index); + } else { + address = group.getRegistryList().get(0); + } + } else { + routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList()); + if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) { + address = routeAddressResult.getContent(); + } + } + } else { + routeAddressResult = new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("jobconf_trigger_address_empty")); + } + + // 4、trigger remote executor + ReturnT triggerResult = null; + if (address != null) { + triggerResult = runExecutor(triggerParam, address); + } else { + triggerResult = new ReturnT(ReturnT.FAIL_CODE, null); + } + + // 5、collection trigger info + StringBuffer triggerMsgSb = new StringBuffer(); + triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append(":").append(triggerType.getTitle()); + triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":").append(IpUtil.getIp()); + triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":") + .append( (group.getAddressType() == 0)?I18nUtil.getString("jobgroup_field_addressType_0"):I18nUtil.getString("jobgroup_field_addressType_1") ); + triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList()); + triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle()); + if (shardingParam != null) { + triggerMsgSb.append("("+shardingParam+")"); + } + triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle()); + triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_timeout")).append(":").append(jobInfo.getExecutorTimeout()); + triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":").append(finalFailRetryCount); + + triggerMsgSb.append("

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<<
") + .append((routeAddressResult!=null&&routeAddressResult.getMsg()!=null)?routeAddressResult.getMsg()+"

":"").append(triggerResult.getMsg()!=null?triggerResult.getMsg():""); + + // 6、save log trigger-info + jobLog.setExecutorAddress(address); + jobLog.setExecutorHandler(jobInfo.getExecutorHandler()); + jobLog.setExecutorParam(jobInfo.getExecutorParam()); + jobLog.setExecutorShardingParam(shardingParam); + jobLog.setExecutorFailRetryCount(finalFailRetryCount); + //jobLog.setTriggerTime(); + jobLog.setTriggerCode(triggerResult.getCode()); + jobLog.setTriggerMsg(triggerMsgSb.toString()); + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(jobLog); + + logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); + } + + /** + * run executor + * @param triggerParam + * @param address + * @return + */ + public static ReturnT runExecutor(TriggerParam triggerParam, String address){ + ReturnT runResult = null; + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address); + runResult = executorBiz.run(triggerParam); + } catch (Exception e) { + logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e); + runResult = new ReturnT(ReturnT.FAIL_CODE, ThrowableUtil.toString(e)); + } + + StringBuffer runResultSB = new StringBuffer(I18nUtil.getString("jobconf_trigger_run") + ":"); + runResultSB.append("
address:").append(address); + runResultSB.append("
code:").append(runResult.getCode()); + runResultSB.append("
msg:").append(runResult.getMsg()); + + runResult.setMsg(runResultSB.toString()); + return runResult; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java new file mode 100644 index 000000000..a1523aa47 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java @@ -0,0 +1,98 @@ +package com.xxl.job.admin.core.util; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Cookie.Util + * + * @author xuxueli 2015-12-12 18:01:06 + */ +public class CookieUtil { + + // 默认缓存时间,单位/秒, 2H + private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE; + // 保存路径,根路径 + private static final String COOKIE_PATH = "/"; + + /** + * 保存 + * + * @param response + * @param key + * @param value + * @param ifRemember + */ + public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) { + int age = ifRemember?COOKIE_MAX_AGE:-1; + set(response, key, value, null, COOKIE_PATH, age, true); + } + + /** + * 保存 + * + * @param response + * @param key + * @param value + * @param maxAge + */ + private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) { + Cookie cookie = new Cookie(key, value); + if (domain != null) { + cookie.setDomain(domain); + } + cookie.setPath(path); + cookie.setMaxAge(maxAge); + cookie.setHttpOnly(isHttpOnly); + response.addCookie(cookie); + } + + /** + * 查询value + * + * @param request + * @param key + * @return + */ + public static String getValue(HttpServletRequest request, String key) { + Cookie cookie = get(request, key); + if (cookie != null) { + return cookie.getValue(); + } + return null; + } + + /** + * 查询Cookie + * + * @param request + * @param key + */ + private static Cookie get(HttpServletRequest request, String key) { + Cookie[] arr_cookie = request.getCookies(); + if (arr_cookie != null && arr_cookie.length > 0) { + for (Cookie cookie : arr_cookie) { + if (cookie.getName().equals(key)) { + return cookie; + } + } + } + return null; + } + + /** + * 删除Cookie + * + * @param request + * @param response + * @param key + */ + public static void remove(HttpServletRequest request, HttpServletResponse response, String key) { + Cookie cookie = get(request, key); + if (cookie != null) { + set(response, key, "", null, COOKIE_PATH, 0, true); + } + } + +} \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java new file mode 100644 index 000000000..e90af434f --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java @@ -0,0 +1,31 @@ +package com.xxl.job.admin.core.util; + +import freemarker.ext.beans.BeansWrapper; +import freemarker.ext.beans.BeansWrapperBuilder; +import freemarker.template.Configuration; +import freemarker.template.TemplateHashModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ftl util + * + * @author xuxueli 2018-01-17 20:37:48 + */ +public class FtlUtil { + private static Logger logger = LoggerFactory.getLogger(FtlUtil.class); + + private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build(); //BeansWrapper.getDefaultInstance(); + + public static TemplateHashModel generateStaticModel(String packageName) { + try { + TemplateHashModel staticModels = wrapper.getStaticModels(); + TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName); + return fileStatics; + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java new file mode 100644 index 000000000..772a96ec0 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java @@ -0,0 +1,79 @@ +package com.xxl.job.admin.core.util; + +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.EncodedResource; +import org.springframework.core.io.support.PropertiesLoaderUtils; + +import java.io.IOException; +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +/** + * i18n util + * + * @author xuxueli 2018-01-17 20:39:06 + */ +public class I18nUtil { + private static Logger logger = LoggerFactory.getLogger(I18nUtil.class); + + private static Properties prop = null; + public static Properties loadI18nProp(){ + if (prop != null) { + return prop; + } + try { + // build i18n prop + String i18n = XxlJobAdminConfig.getAdminConfig().getI18n(); + String i18nFile = MessageFormat.format("i18n/message_{0}.properties", i18n); + + // load prop + Resource resource = new ClassPathResource(i18nFile); + EncodedResource encodedResource = new EncodedResource(resource,"UTF-8"); + prop = PropertiesLoaderUtils.loadProperties(encodedResource); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return prop; + } + + /** + * get val of i18n key + * + * @param key + * @return + */ + public static String getString(String key) { + return loadI18nProp().getProperty(key); + } + + /** + * get mult val of i18n mult key, as json + * + * @param keys + * @return + */ + public static String getMultString(String... keys) { + Map map = new HashMap(); + + Properties prop = loadI18nProp(); + if (keys!=null && keys.length>0) { + for (String key: keys) { + map.put(key, prop.getProperty(key)); + } + } else { + for (String key: prop.stringPropertyNames()) { + map.put(key, prop.getProperty(key)); + } + } + + String json = JacksonUtil.writeValueAsString(map); + return json; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java new file mode 100644 index 000000000..4f4ea3ccb --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java @@ -0,0 +1,92 @@ +package com.xxl.job.admin.core.util; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +/** + * Jackson util + * + * 1、obj need private and set/get; + * 2、do not support inner class; + * + * @author xuxueli 2015-9-25 18:02:56 + */ +public class JacksonUtil { + private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class); + + private final static ObjectMapper objectMapper = new ObjectMapper(); + public static ObjectMapper getInstance() { + return objectMapper; + } + + /** + * bean、array、List、Map --> json + * + * @param obj + * @return json string + * @throws Exception + */ + public static String writeValueAsString(Object obj) { + try { + return getInstance().writeValueAsString(obj); + } catch (JsonGenerationException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * string --> bean、Map、List(array) + * + * @param jsonStr + * @param clazz + * @return obj + * @throws Exception + */ + public static T readValue(String jsonStr, Class clazz) { + try { + return getInstance().readValue(jsonStr, clazz); + } catch (JsonParseException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * string --> List... + * + * @param jsonStr + * @param parametrized + * @param parameterClasses + * @param + * @return + */ + public static T readValue(String jsonStr, Class parametrized, Class... parameterClasses) { + try { + JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses); + return getInstance().readValue(jsonStr, javaType); + } catch (JsonParseException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; + } +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java new file mode 100644 index 000000000..fbab0613f --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java @@ -0,0 +1,133 @@ +package com.xxl.job.admin.core.util; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * local cache tool + * + * @author xuxueli 2018-01-22 21:37:34 + */ +public class LocalCacheUtil { + + private static ConcurrentMap cacheRepository = new ConcurrentHashMap(); // 类型建议用抽象父类,兼容性更好; + private static class LocalCacheData{ + private String key; + private Object val; + private long timeoutTime; + + public LocalCacheData() { + } + + public LocalCacheData(String key, Object val, long timeoutTime) { + this.key = key; + this.val = val; + this.timeoutTime = timeoutTime; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Object getVal() { + return val; + } + + public void setVal(Object val) { + this.val = val; + } + + public long getTimeoutTime() { + return timeoutTime; + } + + public void setTimeoutTime(long timeoutTime) { + this.timeoutTime = timeoutTime; + } + } + + + /** + * set cache + * + * @param key + * @param val + * @param cacheTime + * @return + */ + public static boolean set(String key, Object val, long cacheTime){ + + // clean timeout cache, before set new cache (avoid cache too much) + cleanTimeoutCache(); + + // set new cache + if (key==null || key.trim().length()==0) { + return false; + } + if (val == null) { + remove(key); + } + if (cacheTime <= 0) { + remove(key); + } + long timeoutTime = System.currentTimeMillis() + cacheTime; + LocalCacheData localCacheData = new LocalCacheData(key, val, timeoutTime); + cacheRepository.put(localCacheData.getKey(), localCacheData); + return true; + } + + /** + * remove cache + * + * @param key + * @return + */ + public static boolean remove(String key){ + if (key==null || key.trim().length()==0) { + return false; + } + cacheRepository.remove(key); + return true; + } + + /** + * get cache + * + * @param key + * @return + */ + public static Object get(String key){ + if (key==null || key.trim().length()==0) { + return null; + } + LocalCacheData localCacheData = cacheRepository.get(key); + if (localCacheData!=null && System.currentTimeMillis()=localCacheData.getTimeoutTime()) { + cacheRepository.remove(key); + } + } + } + return true; + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java new file mode 100644 index 000000000..b608d9fbc --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java @@ -0,0 +1,37 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobGroup; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Created by xuxueli on 16/9/30. + */ +@Mapper +public interface XxlJobGroupDao { + + public List findAll(); + + public List findByAddressType(@Param("addressType") int addressType); + + public int save(XxlJobGroup xxlJobGroup); + + public int update(XxlJobGroup xxlJobGroup); + + public int remove(@Param("id") int id); + + public XxlJobGroup load(@Param("id") int id); + + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("appname") String appname, + @Param("title") String title); + + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("appname") String appname, + @Param("title") String title); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java new file mode 100644 index 000000000..d640efffe --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java @@ -0,0 +1,49 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + * job info + * @author xuxueli 2016-1-12 18:03:45 + */ +@Mapper +public interface XxlJobInfoDao { + + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("triggerStatus") int triggerStatus, + @Param("jobDesc") String jobDesc, + @Param("executorHandler") String executorHandler, + @Param("author") String author); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("triggerStatus") int triggerStatus, + @Param("jobDesc") String jobDesc, + @Param("executorHandler") String executorHandler, + @Param("author") String author); + + public int save(XxlJobInfo info); + + public XxlJobInfo loadById(@Param("id") int id); + + public int update(XxlJobInfo xxlJobInfo); + + public int delete(@Param("id") long id); + + public List getJobsByGroup(@Param("jobGroup") int jobGroup); + + public int findAllCount(); + + public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize ); + + public int scheduleUpdate(XxlJobInfo xxlJobInfo); + + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java new file mode 100644 index 000000000..62fa3b4f9 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java @@ -0,0 +1,62 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobLog; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * job log + * @author xuxueli 2016-1-12 18:03:06 + */ +@Mapper +public interface XxlJobLogDao { + + // exist jobId not use jobGroup, not exist use jobGroup + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") int logStatus); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") int logStatus); + + public XxlJobLog load(@Param("id") long id); + + public long save(XxlJobLog xxlJobLog); + + public int updateTriggerInfo(XxlJobLog xxlJobLog); + + public int updateHandleInfo(XxlJobLog xxlJobLog); + + public int delete(@Param("jobId") int jobId); + + public Map findLogReport(@Param("from") Date from, + @Param("to") Date to); + + public List findClearLogIds(@Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("clearBeforeTime") Date clearBeforeTime, + @Param("clearBeforeNum") int clearBeforeNum, + @Param("pagesize") int pagesize); + public int clearLog(@Param("logIds") List logIds); + + public List findFailJobLogIds(@Param("pagesize") int pagesize); + + public int updateAlarmStatus(@Param("logId") long logId, + @Param("oldAlarmStatus") int oldAlarmStatus, + @Param("newAlarmStatus") int newAlarmStatus); + + public List findLostJobIds(@Param("losedTime") Date losedTime); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java new file mode 100644 index 000000000..3028aed22 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java @@ -0,0 +1,24 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobLogGlue; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * job log for glue + * @author xuxueli 2016-5-19 18:04:56 + */ +@Mapper +public interface XxlJobLogGlueDao { + + public int save(XxlJobLogGlue xxlJobLogGlue); + + public List findByJobId(@Param("jobId") int jobId); + + public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit); + + public int deleteByJobId(@Param("jobId") int jobId); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java new file mode 100644 index 000000000..f4b3dc81e --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java @@ -0,0 +1,26 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobLogReport; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * job log + * @author xuxueli 2019-11-22 + */ +@Mapper +public interface XxlJobLogReportDao { + + public int save(XxlJobLogReport xxlJobLogReport); + + public int update(XxlJobLogReport xxlJobLogReport); + + public List queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, + @Param("triggerDayTo") Date triggerDayTo); + + public XxlJobLogReport queryLogReportTotal(); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java new file mode 100644 index 000000000..1005c46c9 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java @@ -0,0 +1,38 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobRegistry; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * Created by xuxueli on 16/9/30. + */ +@Mapper +public interface XxlJobRegistryDao { + + public List findDead(@Param("timeout") int timeout, + @Param("nowTime") Date nowTime); + + public int removeDead(@Param("ids") List ids); + + public List findAll(@Param("timeout") int timeout, + @Param("nowTime") Date nowTime); + + public int registryUpdate(@Param("registryGroup") String registryGroup, + @Param("registryKey") String registryKey, + @Param("registryValue") String registryValue, + @Param("updateTime") Date updateTime); + + public int registrySave(@Param("registryGroup") String registryGroup, + @Param("registryKey") String registryKey, + @Param("registryValue") String registryValue, + @Param("updateTime") Date updateTime); + + public int registryDelete(@Param("registryGroup") String registryGroup, + @Param("registryKey") String registryKey, + @Param("registryValue") String registryValue); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java new file mode 100644 index 000000000..e84049475 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java @@ -0,0 +1,31 @@ +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobUser; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * @author xuxueli 2019-05-04 16:44:59 + */ +@Mapper +public interface XxlJobUserDao { + + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("username") String username, + @Param("role") int role); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("username") String username, + @Param("role") int role); + + public XxlJobUser loadByUserName(@Param("username") String username); + + public int save(XxlJobUser xxlJobUser); + + public int update(XxlJobUser xxlJobUser); + + public int delete(@Param("id") int id); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java new file mode 100644 index 000000000..960aedd9c --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java @@ -0,0 +1,110 @@ +package com.xxl.job.admin.service; + +import com.xxl.job.admin.core.model.XxlJobUser; +import com.xxl.job.admin.core.util.CookieUtil; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.core.util.JacksonUtil; +import com.xxl.job.admin.dao.XxlJobUserDao; +import com.xxl.job.core.biz.model.ReturnT; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.DigestUtils; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigInteger; + +/** + * @author xuxueli 2019-05-04 22:13:264 + */ +@Configuration +public class LoginService { + + public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY"; + + @Resource + private XxlJobUserDao xxlJobUserDao; + + + private String makeToken(XxlJobUser xxlJobUser){ + String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser); + String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16); + return tokenHex; + } + private XxlJobUser parseToken(String tokenHex){ + XxlJobUser xxlJobUser = null; + if (tokenHex != null) { + String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray()); // username_password(md5) + xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class); + } + return xxlJobUser; + } + + + public ReturnT login(HttpServletRequest request, HttpServletResponse response, String username, String password, boolean ifRemember){ + + // param + if (username==null || username.trim().length()==0 || password==null || password.trim().length()==0){ + return new ReturnT(500, I18nUtil.getString("login_param_empty")); + } + + // valid passowrd + XxlJobUser xxlJobUser = xxlJobUserDao.loadByUserName(username); + if (xxlJobUser == null) { + return new ReturnT(500, I18nUtil.getString("login_param_unvalid")); + } + String passwordMd5 = DigestUtils.md5DigestAsHex(password.getBytes()); + if (!passwordMd5.equals(xxlJobUser.getPassword())) { + return new ReturnT(500, I18nUtil.getString("login_param_unvalid")); + } + + String loginToken = makeToken(xxlJobUser); + + // do login + CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember); + return ReturnT.SUCCESS; + } + + /** + * logout + * + * @param request + * @param response + */ + public ReturnT logout(HttpServletRequest request, HttpServletResponse response){ + CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY); + return ReturnT.SUCCESS; + } + + /** + * logout + * + * @param request + * @return + */ + public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response){ + String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY); + if (cookieToken != null) { + XxlJobUser cookieUser = null; + try { + cookieUser = parseToken(cookieToken); + } catch (Exception e) { + logout(request, response); + } + if (cookieUser != null) { + XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername()); + if (dbUser != null) { + if (cookieUser.getPassword().equals(dbUser.getPassword())) { + return dbUser; + } + } + } + } + return null; + } + + public static void main(String[] args) { + System.out.println("121312"); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java new file mode 100644 index 000000000..61da3a27c --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java @@ -0,0 +1,86 @@ +package com.xxl.job.admin.service; + + +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.core.biz.model.ReturnT; + +import java.util.Date; +import java.util.Map; + +/** + * core job action for xxl-job + * + * @author xuxueli 2016-5-28 15:30:33 + */ +public interface XxlJobService { + + /** + * page list + * + * @param start + * @param length + * @param jobGroup + * @param jobDesc + * @param executorHandler + * @param author + * @return + */ + public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author); + + /** + * add job + * + * @param jobInfo + * @return + */ + public ReturnT add(XxlJobInfo jobInfo); + + /** + * update job + * + * @param jobInfo + * @return + */ + public ReturnT update(XxlJobInfo jobInfo); + + /** + * remove job + * * + * @param id + * @return + */ + public ReturnT remove(int id); + + /** + * start job + * + * @param id + * @return + */ + public ReturnT start(int id); + + /** + * stop job + * + * @param id + * @return + */ + public ReturnT stop(int id); + + /** + * dashboard info + * + * @return + */ + public Map dashboardInfo(); + + /** + * chart info + * + * @param startDate + * @param endDate + * @return + */ + public ReturnT> chartInfo(Date startDate, Date endDate); + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java new file mode 100644 index 000000000..3c01e94dc --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -0,0 +1,35 @@ +package com.xxl.job.admin.service.impl; + +import com.xxl.job.admin.core.thread.JobCompleteHelper; +import com.xxl.job.admin.core.thread.JobRegistryHelper; +import com.xxl.job.core.biz.AdminBiz; +import com.xxl.job.core.biz.model.HandleCallbackParam; +import com.xxl.job.core.biz.model.RegistryParam; +import com.xxl.job.core.biz.model.ReturnT; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author xuxueli 2017-07-27 21:54:20 + */ +@Service +public class AdminBizImpl implements AdminBiz { + + + @Override + public ReturnT callback(List callbackParamList) { + return JobCompleteHelper.getInstance().callback(callbackParamList); + } + + @Override + public ReturnT registry(RegistryParam registryParam) { + return JobRegistryHelper.getInstance().registry(registryParam); + } + + @Override + public ReturnT registryRemove(RegistryParam registryParam) { + return JobRegistryHelper.getInstance().registryRemove(registryParam); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java new file mode 100644 index 000000000..530ee41c8 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -0,0 +1,434 @@ +package com.xxl.job.admin.service.impl; + +import com.xxl.job.admin.core.cron.CronExpression; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLogReport; +import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; +import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum; +import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum; +import com.xxl.job.admin.core.thread.JobScheduleHelper; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.*; +import com.xxl.job.admin.service.XxlJobService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; +import com.xxl.job.core.glue.GlueTypeEnum; +import com.xxl.job.core.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.*; + +/** + * core job action for xxl-job + * @author xuxueli 2016-5-28 15:30:33 + */ +@Service +public class XxlJobServiceImpl implements XxlJobService { + private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class); + + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; + @Resource + private XxlJobLogGlueDao xxlJobLogGlueDao; + @Resource + private XxlJobLogReportDao xxlJobLogReportDao; + + @Override + public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { + + // page list + List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal", list_count); // 总记录数 + maps.put("recordsFiltered", list_count); // 过滤后的总记录数 + maps.put("data", list); // 分页列表 + return maps; + } + + @Override + public ReturnT add(XxlJobInfo jobInfo) { + + // valid base + XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (group == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose")+I18nUtil.getString("jobinfo_field_jobgroup")) ); + } + if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) ); + } + if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) ); + } + + // valid trigger + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (scheduleTypeEnum == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { + if (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { + return new ReturnT(ReturnT.FAIL_CODE, "Cron"+I18nUtil.getString("system_unvalid")); + } + } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { + if (jobInfo.getScheduleConf() == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")) ); + } + try { + int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); + if (fixSecond < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + } catch (Exception e) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + } + + // valid job + if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype")+I18nUtil.getString("system_unvalid")) ); + } + if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+"JobHandler") ); + } + // 》fix "\r" in shell + if (GlueTypeEnum.GLUE_SHELL==GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource()!=null) { + jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r", "")); + } + + // valid advanced + if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) ); + } + if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy")+I18nUtil.getString("system_unvalid")) ); + } + if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) ); + } + + // 》ChildJobId valid + if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) { + String[] childJobIds = jobInfo.getChildJobId().split(","); + for (String childJobIdItem: childJobIds) { + if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) { + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); + if (childJobInfo==null) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem)); + } + } else { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem)); + } + } + + // join , avoid "xxx,," + String temp = ""; + for (String item:childJobIds) { + temp += item + ","; + } + temp = temp.substring(0, temp.length()-1); + + jobInfo.setChildJobId(temp); + } + + // add in db + jobInfo.setAddTime(new Date()); + jobInfo.setUpdateTime(new Date()); + jobInfo.setGlueUpdatetime(new Date()); + xxlJobInfoDao.save(jobInfo); + if (jobInfo.getId() < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) ); + } + + return new ReturnT(String.valueOf(jobInfo.getId())); + } + + private boolean isNumeric(String str){ + try { + int result = Integer.valueOf(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + @Override + public ReturnT update(XxlJobInfo jobInfo) { + + // valid base + if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) ); + } + if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) ); + } + + // valid trigger + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (scheduleTypeEnum == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { + if (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { + return new ReturnT(ReturnT.FAIL_CODE, "Cron"+I18nUtil.getString("system_unvalid") ); + } + } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { + if (jobInfo.getScheduleConf() == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + try { + int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); + if (fixSecond < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + } catch (Exception e) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + } + + // valid advanced + if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) ); + } + if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy")+I18nUtil.getString("system_unvalid")) ); + } + if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) ); + } + + // 》ChildJobId valid + if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) { + String[] childJobIds = jobInfo.getChildJobId().split(","); + for (String childJobIdItem: childJobIds) { + if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) { + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); + if (childJobInfo==null) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem)); + } + } else { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem)); + } + } + + // join , avoid "xxx,," + String temp = ""; + for (String item:childJobIds) { + temp += item + ","; + } + temp = temp.substring(0, temp.length()-1); + + jobInfo.setChildJobId(temp); + } + + // group valid + XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (jobGroup == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup")+I18nUtil.getString("system_unvalid")) ); + } + + // stage job info + XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId()); + if (exists_jobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) ); + } + + // next trigger time (5s后生效,避开预读周期) + long nextTriggerTime = exists_jobInfo.getTriggerNextTime(); + boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); + if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { + try { + Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + nextTriggerTime = nextValidTime.getTime(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + } + + exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); + exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); + exists_jobInfo.setAuthor(jobInfo.getAuthor()); + exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); + exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); + exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); + exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); + exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); + exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); + exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); + exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); + exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); + exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount()); + exists_jobInfo.setChildJobId(jobInfo.getChildJobId()); + exists_jobInfo.setTriggerNextTime(nextTriggerTime); + + exists_jobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(exists_jobInfo); + + + return ReturnT.SUCCESS; + } + + @Override + public ReturnT remove(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); + if (xxlJobInfo == null) { + return ReturnT.SUCCESS; + } + + xxlJobInfoDao.delete(id); + xxlJobLogDao.delete(id); + xxlJobLogGlueDao.deleteByJobId(id); + return ReturnT.SUCCESS; + } + + @Override + public ReturnT start(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); + + // valid + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); + if (ScheduleTypeEnum.NONE == scheduleTypeEnum) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type_none_limit_start")) ); + } + + // next trigger time (5s后生效,避开预读周期) + long nextTriggerTime = 0; + try { + Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + nextTriggerTime = nextValidTime.getTime(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); + } + + xxlJobInfo.setTriggerStatus(1); + xxlJobInfo.setTriggerLastTime(0); + xxlJobInfo.setTriggerNextTime(nextTriggerTime); + + xxlJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(xxlJobInfo); + return ReturnT.SUCCESS; + } + + @Override + public ReturnT stop(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); + + xxlJobInfo.setTriggerStatus(0); + xxlJobInfo.setTriggerLastTime(0); + xxlJobInfo.setTriggerNextTime(0); + + xxlJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(xxlJobInfo); + return ReturnT.SUCCESS; + } + + @Override + public Map dashboardInfo() { + + int jobInfoCount = xxlJobInfoDao.findAllCount(); + int jobLogCount = 0; + int jobLogSuccessCount = 0; + XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal(); + if (xxlJobLogReport != null) { + jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount(); + jobLogSuccessCount = xxlJobLogReport.getSucCount(); + } + + // executor count + Set executorAddressSet = new HashSet(); + List groupList = xxlJobGroupDao.findAll(); + + if (groupList!=null && !groupList.isEmpty()) { + for (XxlJobGroup group: groupList) { + if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) { + executorAddressSet.addAll(group.getRegistryList()); + } + } + } + + int executorCount = executorAddressSet.size(); + + Map dashboardMap = new HashMap(); + dashboardMap.put("jobInfoCount", jobInfoCount); + dashboardMap.put("jobLogCount", jobLogCount); + dashboardMap.put("jobLogSuccessCount", jobLogSuccessCount); + dashboardMap.put("executorCount", executorCount); + return dashboardMap; + } + + @Override + public ReturnT> chartInfo(Date startDate, Date endDate) { + + // process + List triggerDayList = new ArrayList(); + List triggerDayCountRunningList = new ArrayList(); + List triggerDayCountSucList = new ArrayList(); + List triggerDayCountFailList = new ArrayList(); + int triggerCountRunningTotal = 0; + int triggerCountSucTotal = 0; + int triggerCountFailTotal = 0; + + List logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate); + + if (logReportList!=null && logReportList.size()>0) { + for (XxlJobLogReport item: logReportList) { + String day = DateUtil.formatDate(item.getTriggerDay()); + int triggerDayCountRunning = item.getRunningCount(); + int triggerDayCountSuc = item.getSucCount(); + int triggerDayCountFail = item.getFailCount(); + + triggerDayList.add(day); + triggerDayCountRunningList.add(triggerDayCountRunning); + triggerDayCountSucList.add(triggerDayCountSuc); + triggerDayCountFailList.add(triggerDayCountFail); + + triggerCountRunningTotal += triggerDayCountRunning; + triggerCountSucTotal += triggerDayCountSuc; + triggerCountFailTotal += triggerDayCountFail; + } + } else { + for (int i = -6; i <= 0; i++) { + triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i))); + triggerDayCountRunningList.add(0); + triggerDayCountSucList.add(0); + triggerDayCountFailList.add(0); + } + } + + Map result = new HashMap(); + result.put("triggerDayList", triggerDayList); + result.put("triggerDayCountRunningList", triggerDayCountRunningList); + result.put("triggerDayCountSucList", triggerDayCountSucList); + result.put("triggerDayCountFailList", triggerDayCountFailList); + + result.put("triggerCountRunningTotal", triggerCountRunningTotal); + result.put("triggerCountSucTotal", triggerCountSucTotal); + result.put("triggerCountFailTotal", triggerCountFailTotal); + + return new ReturnT>(result); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.properties new file mode 100644 index 000000000..004bac73c --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.properties @@ -0,0 +1,65 @@ +### web +server.port=8080 +server.servlet.context-path=/xxl-job-admin + +### actuator +management.server.servlet.context-path=/actuator +management.health.mail.enabled=false + +### resources +spring.mvc.servlet.load-on-startup=0 +spring.mvc.static-path-pattern=/static/** +spring.resources.static-locations=classpath:/static/ + +### freemarker +spring.freemarker.templateLoaderPath=classpath:/templates/ +spring.freemarker.suffix=.ftl +spring.freemarker.charset=UTF-8 +spring.freemarker.request-context-attribute=request +spring.freemarker.settings.number_format=0.########## + +### mybatis +mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml +#mybatis.type-aliases-package=com.xxl.job.admin.core.model + +### xxl-job, datasource +spring.datasource.url=jdbc:mysql://192.168.199.15:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai +spring.datasource.username=root +spring.datasource.password=root +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +### datasource-pool +spring.datasource.type=com.zaxxer.hikari.HikariDataSource +spring.datasource.hikari.minimum-idle=10 +spring.datasource.hikari.maximum-pool-size=30 +spring.datasource.hikari.auto-commit=true +spring.datasource.hikari.idle-timeout=30000 +spring.datasource.hikari.pool-name=HikariCP +spring.datasource.hikari.max-lifetime=900000 +spring.datasource.hikari.connection-timeout=10000 +spring.datasource.hikari.connection-test-query=SELECT 1 +spring.datasource.hikari.validation-timeout=1000 + +### xxl-job, email +spring.mail.host=smtp.qq.com +spring.mail.port=25 +spring.mail.username=943887556@qq.com +spring.mail.from=943887556@qq.com +spring.mail.password=tianque887556 +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory + +### xxl-job, access token +xxl.job.accessToken= + +### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en") +xxl.job.i18n=zh_CN + +## xxl-job, triggerpool max size +xxl.job.triggerpool.fast.max=200 +xxl.job.triggerpool.slow.max=100 + +### xxl-job, log retention days +xxl.job.logretentiondays=30 diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties new file mode 100644 index 000000000..8e7d8352b --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -0,0 +1,276 @@ +admin_name=Scheduling Center +admin_name_full=Distributed Task Scheduling Platform XXL-JOB +admin_version=2.3.0 +admin_i18n=en + +## system +system_tips=System message +system_ok=Confirm +system_close=Close +system_save=Save +system_cancel=Cancel +system_search=Search +system_status=Status +system_opt=Operate +system_please_input=please input +system_please_choose=please choose +system_success=success +system_fail=fail +system_add_suc=add success +system_add_fail=add fail +system_update_suc=update success +system_update_fail=update fail +system_all=All +system_api_error=net error +system_show=Show +system_empty=Empty +system_opt_suc=operate success +system_opt_fail=operate fail +system_opt_edit=Edit +system_opt_del=Delete +system_opt_copy=Copy +system_unvalid=illegal +system_not_found=not exist +system_nav=Navigation +system_digits=digits +system_lengh_limit=Length limit +system_permission_limit=Permission limit +system_welcome=Welcome + +## daterangepicker +daterangepicker_ranges_recent_hour=recent one hour +daterangepicker_ranges_today=today +daterangepicker_ranges_yesterday=yesterday +daterangepicker_ranges_this_month=this month +daterangepicker_ranges_last_month=last month +daterangepicker_ranges_recent_week=recent one week +daterangepicker_ranges_recent_month=recent one month +daterangepicker_custom_name=custom +daterangepicker_custom_starttime=start time +daterangepicker_custom_endtime=end time +daterangepicker_custom_daysofweek=Sun,Mon,Tue,Wed,Thu,Fri,Sat +daterangepicker_custom_monthnames=Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec + +## dataTable +dataTable_sProcessing=processing... +dataTable_sLengthMenu= _MENU_ records per page +dataTable_sZeroRecords=No matching results +dataTable_sInfo=page _PAGE_ ( Total _PAGES_ pages,_TOTAL_ records ) +dataTable_sInfoEmpty=No Record +dataTable_sInfoFiltered=(Filtered by _MAX_ results) +dataTable_sSearch=Search +dataTable_sEmptyTable=Table data is empty +dataTable_sLoadingRecords=Loading... +dataTable_sFirst=FIRST PAGE +dataTable_sPrevious=Previous Page +dataTable_sNext=Next Page +dataTable_sLast=LAST PAGE +dataTable_sSortAscending=: Rank this column in ascending order +dataTable_sSortDescending=: Rank this column in descending order + +## login +login_btn=Login +login_remember_me=Remember Me +login_username_placeholder=Please enter username +login_password_placeholder=Please enter password +login_username_empty=Please enter username +login_username_lt_4=Username length should not be less than 4 +login_password_empty=Please enter password +login_password_lt_4=Password length should not be less than 4 +login_success=Login success +login_fail=Login fail +login_param_empty=Username or password is empty +login_param_unvalid=Username or password error + +## logout +logout_btn=Logout +logout_confirm=Confirm logout? +logout_success=Logout success +logout_fail=Logout fail + +## change pwd +change_pwd=Change password +change_pwd_suc_to_logout=Change password successful, about to log out login +change_pwd_field_newpwd=new password + +## dashboard +job_dashboard_name=Run report +job_dashboard_job_num=Job number +job_dashboard_job_num_tip=The number of tasks running in the scheduling center +job_dashboard_trigger_num=trigger number +job_dashboard_trigger_num_tip=The number of trigger record scheduled by the scheduling center +job_dashboard_jobgroup_num=Executor number +job_dashboard_jobgroup_num_tip=The number of online executor machines perceived by the scheduling center +job_dashboard_report=Scheduling report +job_dashboard_report_loaddata_fail=Scheduling report load data error +job_dashboard_date_report=Date distribution +job_dashboard_rate_report=Percentage distribution + +## job info +jobinfo_name=Job Manage +jobinfo_job=Job +jobinfo_field_add=Add Job +jobinfo_field_update=Edit Job +jobinfo_field_id=Job ID +jobinfo_field_jobgroup=Executor +jobinfo_field_jobdesc=Job description +jobinfo_field_timeout=Job timeout period +jobinfo_field_gluetype=GLUE Type +jobinfo_field_executorparam=Param +jobinfo_field_author=Author +jobinfo_field_alarmemail=Alarm email +jobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated +jobinfo_field_executorRouteStrategy=Route Strategy +jobinfo_field_childJobId=Child Job ID +jobinfo_field_childJobId_placeholder=Please enter the Child job ID, if there are more than one comma separated +jobinfo_field_executorBlockStrategy=Block Strategy +jobinfo_field_executorFailRetryCount=Fail Retry Count +jobinfo_field_executorFailRetryCount_placeholder=Fail Retry Count. effect if greater than zero +jobinfo_script_location=Script location +jobinfo_shard_index=Shard index +jobinfo_shard_total=Shard total +jobinfo_opt_stop=Stop +jobinfo_opt_start=Start +jobinfo_opt_log=Query Log +jobinfo_opt_run=Run Once +jobinfo_opt_run_tips=Please input the address for this trigger. Null will be obtained from the executor +jobinfo_opt_registryinfo=Registry Info +jobinfo_opt_next_time=Next trigger time +jobinfo_glue_remark=Resource Remark +jobinfo_glue_remark_limit=Resource Remark length is limited to 4~100 +jobinfo_glue_rollback=Version Backtrack +jobinfo_glue_jobid_unvalid=Job ID is illegal +jobinfo_glue_gluetype_unvalid=The job is not GLUE Type +jobinfo_field_executorTimeout_placeholder=Job Timeout period,in seconds. effect if greater than zero +schedule_type=Schedule Type +schedule_type_none=None +schedule_type_cron=Cron +schedule_type_fix_rate=Fix rate +schedule_type_fix_delay=Fix delay +schedule_type_none_limit_start=The current schedule type disables startup +misfire_strategy=Misfire strategy +misfire_strategy_do_nothing=Do nothing +misfire_strategy_fire_once_now=Fire once now +jobinfo_conf_base=Base configuration +jobinfo_conf_schedule=Schedule configuration +jobinfo_conf_job=Job configuration +jobinfo_conf_advanced=Advanced configuration + +## job log +joblog_name=Trigger Log +joblog_status=Status +joblog_status_all=All +joblog_status_suc=Success +joblog_status_fail=Fail +joblog_status_running=Running +joblog_field_triggerTime=Trigger Time +joblog_field_triggerCode=Trigger Result +joblog_field_triggerMsg=Trigger Msg +joblog_field_handleTime=Handle Time +joblog_field_handleCode=Handle Result +joblog_field_handleMsg=Trigger Msg +joblog_field_executorAddress=Executor Address +joblog_clean=Clean +joblog_clean_log=Clean Log +joblog_clean_type=Clean Type +joblog_clean_type_1=Clean up log data a month ago +joblog_clean_type_2=Clean up log data three month ago +joblog_clean_type_3=Clean up log data six month ago +joblog_clean_type_4=Clean up log data a year ago +joblog_clean_type_5=Clean up log data a thousand record ago +joblog_clean_type_6=Clean up log data ten thousand record ago +joblog_clean_type_7=Clean up log data thirty thousand record ago +joblog_clean_type_8=Clean up log data hundred thousand record ago +joblog_clean_type_9=Clean up all log data +joblog_clean_type_unvalid=Clean type is illegal +joblog_handleCode_200=Success +joblog_handleCode_500=Fail +joblog_handleCode_502=Timeout +joblog_kill_log=Kill Job +joblog_kill_log_limit=Trigger Fail, can not kill job +joblog_kill_log_byman=Manual operation, kill job +joblog_lost_fail=Job result lost, marked as failure +joblog_rolling_log=Rolling log +joblog_rolling_log_refresh=Refresh +joblog_rolling_log_triggerfail=The job trigger fail, can not view the rolling log +joblog_rolling_log_failoften=The request for the Rolling log is terminated, the number of failed requests exceeds the limit, Reload the log on the refresh page +joblog_logid_unvalid=Log ID is illegal + +## job group +jobgroup_name=Executor Manage +jobgroup_list=Executor List +jobgroup_add=Add Executor +jobgroup_edit=Edit Executor +jobgroup_del=Delete Executor +jobgroup_field_title=Title +jobgroup_field_addressType=Registry Type +jobgroup_field_addressType_0=Automatic registration +jobgroup_field_addressType_1=Manual registration +jobgroup_field_addressType_limit=Manually registration type, the machine address must not be empty +jobgroup_field_registryList=machine address +jobgroup_field_registryList_unvalid=registry machine address is illegal +jobgroup_field_registryList_placeholder=Please enter the machine address, if there are more than one comma separated +jobgroup_field_appname_limit=Limit the beginning of a lowercase letter, consists of lowercase letters、number and hyphen. +jobgroup_field_appname_length=AppName length is limited to 4~64 +jobgroup_field_title_length=Title length is limited to 4~12 +jobgroup_field_order_digits=Please enter a positive integer +jobgroup_field_orderrange=Order is limited to 1~1000 +jobgroup_del_limit_0=Refuse to delete, the executor is being used +jobgroup_del_limit_1=Refuses to delete, the system retains at least one executor +jobgroup_empty=There is no valid executor. Please contact the administrator + +## job conf +jobconf_block_SERIAL_EXECUTION=Serial execution +jobconf_block_DISCARD_LATER=Discard Later +jobconf_block_COVER_EARLY=Cover Early +jobconf_route_first=First +jobconf_route_last=Last +jobconf_route_round=Round +jobconf_route_random=Random +jobconf_route_consistenthash=Consistent Hash +jobconf_route_lfu=Least Frequently Used +jobconf_route_lru=Least Recently Used +jobconf_route_failover=Failover +jobconf_route_busyover=Busyover +jobconf_route_shard=Sharding Broadcast +jobconf_idleBeat=Idle check +jobconf_beat=Heartbeats +jobconf_monitor=Task Scheduling Center monitor alarm +jobconf_monitor_detail=monitor alarm details +jobconf_monitor_alarm_title=Alarm Type +jobconf_monitor_alarm_type=Trigger Fail +jobconf_monitor_alarm_content=Alarm Content +jobconf_trigger_admin_adress=Trigger machine address +jobconf_trigger_exe_regtype=Execotor-Registry Type +jobconf_trigger_exe_regaddress=Execotor-Registry Address +jobconf_trigger_address_empty=Trigger Fail:registry address is empty +jobconf_trigger_run=Trigger Job +jobconf_trigger_child_run=Trigger child job +jobconf_callback_child_msg1={0}/{1} [Job ID={2}], Trigger {3}, Trigger msg: {4}
+jobconf_callback_child_msg2={0}/{1} [Job ID={2}], Trigger Fail, Trigger msg: Job ID is illegal
+jobconf_trigger_type=Job trigger type +jobconf_trigger_type_cron=Cron trigger +jobconf_trigger_type_manual=Manual trigger +jobconf_trigger_type_parent=Parent job trigger +jobconf_trigger_type_api=Api trigger +jobconf_trigger_type_retry=Fail retry trigger +jobconf_trigger_type_misfire=Misfire compensation trigger + +## user +user_manage=User Manage +user_username=Username +user_password=Password +user_role=Role +user_role_admin=Admin User +user_role_normal=Normal User +user_permission=Permission +user_add=Add User +user_update=Edit User +user_username_repeat=Username Repeat +user_username_valid=Restrictions start with a lowercase letter and consist of lowercase letters and Numbers +user_password_update_placeholder=Please input password, empty means not update +user_update_loginuser_limit=Operation of current login account is not allowed + +## help +job_help=Tutorial +job_help_document=Official Document diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties new file mode 100644 index 000000000..00ca50e10 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -0,0 +1,276 @@ +admin_name=任务调度中心 +admin_name_full=分布式任务调度平台XXL-JOB +admin_version=2.3.0 +admin_i18n= + +## system +system_tips=系统提示 +system_ok=确定 +system_close=关闭 +system_save=保存 +system_cancel=取消 +system_search=搜索 +system_status=状态 +system_opt=操作 +system_please_input=请输入 +system_please_choose=请选择 +system_success=成功 +system_fail=失败 +system_add_suc=新增成功 +system_add_fail=新增失败 +system_update_suc=更新成功 +system_update_fail=更新失败 +system_all=全部 +system_api_error=接口异常 +system_show=查看 +system_empty=无 +system_opt_suc=操作成功 +system_opt_fail=操作失败 +system_opt_edit=编辑 +system_opt_del=删除 +system_opt_copy=复制 +system_unvalid=非法 +system_not_found=不存在 +system_nav=导航 +system_digits=整数 +system_lengh_limit=长度限制 +system_permission_limit=权限拦截 +system_welcome=欢迎 + +## daterangepicker +daterangepicker_ranges_recent_hour=最近一小时 +daterangepicker_ranges_today=今日 +daterangepicker_ranges_yesterday=昨日 +daterangepicker_ranges_this_month=本月 +daterangepicker_ranges_last_month=上个月 +daterangepicker_ranges_recent_week=最近一周 +daterangepicker_ranges_recent_month=最近一月 +daterangepicker_custom_name=自定义 +daterangepicker_custom_starttime=起始时间 +daterangepicker_custom_endtime=结束时间 +daterangepicker_custom_daysofweek=日,一,二,三,四,五,六 +daterangepicker_custom_monthnames=一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月 + +## dataTable +dataTable_sProcessing=处理中... +dataTable_sLengthMenu=每页 _MENU_ 条记录 +dataTable_sZeroRecords=没有匹配结果 +dataTable_sInfo=第 _PAGE_ 页 ( 总共 _PAGES_ 页,_TOTAL_ 条记录 ) +dataTable_sInfoEmpty=无记录 +dataTable_sInfoFiltered=(由 _MAX_ 项结果过滤) +dataTable_sSearch=搜索 +dataTable_sEmptyTable=表中数据为空 +dataTable_sLoadingRecords=载入中... +dataTable_sFirst=首页 +dataTable_sPrevious=上页 +dataTable_sNext=下页 +dataTable_sLast=末页 +dataTable_sSortAscending=: 以升序排列此列 +dataTable_sSortDescending=: 以降序排列此列 + +## login +login_btn=登录 +login_remember_me=记住密码 +login_username_placeholder=请输入登录账号 +login_password_placeholder=请输入登录密码 +login_username_empty=请输入登录账号 +login_username_lt_4=登录账号不应低于4位 +login_password_empty=请输入登录密码 +login_password_lt_4=登录密码不应低于4位 +login_success=登录成功 +login_fail=登录失败 +login_param_empty=账号或密码为空 +login_param_unvalid=账号或密码错误 + +## logout +logout_btn=注销 +logout_confirm=确认注销登录? +logout_success=注销成功 +logout_fail=注销失败 + +## change pwd +change_pwd=修改密码 +change_pwd_suc_to_logout=修改密码成功,即将注销登陆 +change_pwd_field_newpwd=新密码 + +## dashboard +job_dashboard_name=运行报表 +job_dashboard_job_num=任务数量 +job_dashboard_job_num_tip=调度中心运行的任务数量 +job_dashboard_trigger_num=调度次数 +job_dashboard_trigger_num_tip=调度中心触发的调度次数 +job_dashboard_jobgroup_num=执行器数量 +job_dashboard_jobgroup_num_tip=调度中心在线的执行器机器数量 +job_dashboard_report=调度报表 +job_dashboard_report_loaddata_fail=调度报表数据加载异常 +job_dashboard_date_report=日期分布图 +job_dashboard_rate_report=成功比例图 + +## job info +jobinfo_name=任务管理 +jobinfo_job=任务 +jobinfo_field_add=新增 +jobinfo_field_update=更新任务 +jobinfo_field_id=任务ID +jobinfo_field_jobgroup=执行器 +jobinfo_field_jobdesc=任务描述 +jobinfo_field_gluetype=运行模式 +jobinfo_field_executorparam=任务参数 +jobinfo_field_author=负责人 +jobinfo_field_timeout=任务超时时间 +jobinfo_field_alarmemail=报警邮件 +jobinfo_field_alarmemail_placeholder=请输入报警邮件,多个邮件地址则逗号分隔 +jobinfo_field_executorRouteStrategy=路由策略 +jobinfo_field_childJobId=子任务ID +jobinfo_field_childJobId_placeholder=请输入子任务的任务ID,如存在多个则逗号分隔 +jobinfo_field_executorBlockStrategy=阻塞处理策略 +jobinfo_field_executorFailRetryCount=失败重试次数 +jobinfo_field_executorFailRetryCount_placeholder=失败重试次数,大于零时生效 +jobinfo_script_location=脚本位置 +jobinfo_shard_index=分片序号 +jobinfo_shard_total=分片总数 +jobinfo_opt_stop=停止 +jobinfo_opt_start=启动 +jobinfo_opt_log=查询日志 +jobinfo_opt_run=执行一次 +jobinfo_opt_run_tips=请输入本次执行的机器地址,为空则从执行器获取 +jobinfo_opt_registryinfo=注册节点 +jobinfo_opt_next_time=下次执行时间 +jobinfo_glue_remark=源码备注 +jobinfo_glue_remark_limit=源码备注长度限制为4~100 +jobinfo_glue_rollback=版本回溯 +jobinfo_glue_jobid_unvalid=任务ID非法 +jobinfo_glue_gluetype_unvalid=该任务非GLUE模式 +jobinfo_field_executorTimeout_placeholder=任务超时时间,单位秒,大于零时生效 +schedule_type=调度类型 +schedule_type_none=无 +schedule_type_cron=CRON +schedule_type_fix_rate=固定速度 +schedule_type_fix_delay=固定延迟 +schedule_type_none_limit_start=当前调度类型禁止启动 +misfire_strategy=调度过期策略 +misfire_strategy_do_nothing=忽略 +misfire_strategy_fire_once_now=立即执行一次 +jobinfo_conf_base=基础配置 +jobinfo_conf_schedule=调度配置 +jobinfo_conf_job=任务配置 +jobinfo_conf_advanced=高级配置 + +## job log +joblog_name=调度日志 +joblog_status=状态 +joblog_status_all=全部 +joblog_status_suc=成功 +joblog_status_fail=失败 +joblog_status_running=进行中 +joblog_field_triggerTime=调度时间 +joblog_field_triggerCode=调度结果 +joblog_field_triggerMsg=调度备注 +joblog_field_handleTime=执行时间 +joblog_field_handleCode=执行结果 +joblog_field_handleMsg=执行备注 +joblog_field_executorAddress=执行器地址 +joblog_clean=清理 +joblog_clean_log=日志清理 +joblog_clean_type=清理方式 +joblog_clean_type_1=清理一个月之前日志数据 +joblog_clean_type_2=清理三个月之前日志数据 +joblog_clean_type_3=清理六个月之前日志数据 +joblog_clean_type_4=清理一年之前日志数据 +joblog_clean_type_5=清理一千条以前日志数据 +joblog_clean_type_6=清理一万条以前日志数据 +joblog_clean_type_7=清理三万条以前日志数据 +joblog_clean_type_8=清理十万条以前日志数据 +joblog_clean_type_9=清理所有日志数据 +joblog_clean_type_unvalid=清理类型参数异常 +joblog_handleCode_200=成功 +joblog_handleCode_500=失败 +joblog_handleCode_502=失败(超时) +joblog_kill_log=终止任务 +joblog_kill_log_limit=调度失败,无法终止日志 +joblog_kill_log_byman=人为操作,主动终止 +joblog_lost_fail=任务结果丢失,标记失败 +joblog_rolling_log=执行日志 +joblog_rolling_log_refresh=刷新 +joblog_rolling_log_triggerfail=任务发起调度失败,无法查看执行日志 +joblog_rolling_log_failoften=终止请求Rolling日志,请求失败次数超上限,可刷新页面重新加载日志 +joblog_logid_unvalid=日志ID非法 + +## job group +jobgroup_name=执行器管理 +jobgroup_list=执行器列表 +jobgroup_add=新增执行器 +jobgroup_edit=编辑执行器 +jobgroup_del=删除执行器 +jobgroup_field_title=名称 +jobgroup_field_addressType=注册方式 +jobgroup_field_addressType_0=自动注册 +jobgroup_field_addressType_1=手动录入 +jobgroup_field_addressType_limit=手动录入注册方式,机器地址不可为空 +jobgroup_field_registryList=机器地址 +jobgroup_field_registryList_unvalid=机器地址格式非法 +jobgroup_field_registryList_placeholder=请输入执行器地址列表,多地址逗号分隔 +jobgroup_field_appname_limit=限制以小写字母开头,由小写字母、数字和中划线组成 +jobgroup_field_appname_length=AppName长度限制为4~64 +jobgroup_field_title_length=名称长度限制为4~12 +jobgroup_field_order_digits=请输入整数 +jobgroup_field_orderrange=取值范围为1~1000 +jobgroup_del_limit_0=拒绝删除,该执行器使用中 +jobgroup_del_limit_1=拒绝删除, 系统至少保留一个执行器 +jobgroup_empty=不存在有效执行器,请联系管理员 + +## job conf +jobconf_block_SERIAL_EXECUTION=单机串行 +jobconf_block_DISCARD_LATER=丢弃后续调度 +jobconf_block_COVER_EARLY=覆盖之前调度 +jobconf_route_first=第一个 +jobconf_route_last=最后一个 +jobconf_route_round=轮询 +jobconf_route_random=随机 +jobconf_route_consistenthash=一致性HASH +jobconf_route_lfu=最不经常使用 +jobconf_route_lru=最近最久未使用 +jobconf_route_failover=故障转移 +jobconf_route_busyover=忙碌转移 +jobconf_route_shard=分片广播 +jobconf_idleBeat=空闲检测 +jobconf_beat=心跳检测 +jobconf_monitor=任务调度中心监控报警 +jobconf_monitor_detail=监控告警明细 +jobconf_monitor_alarm_title=告警类型 +jobconf_monitor_alarm_type=调度失败 +jobconf_monitor_alarm_content=告警内容 +jobconf_trigger_admin_adress=调度机器 +jobconf_trigger_exe_regtype=执行器-注册方式 +jobconf_trigger_exe_regaddress=执行器-地址列表 +jobconf_trigger_address_empty=调度失败:执行器地址为空 +jobconf_trigger_run=触发调度 +jobconf_trigger_child_run=触发子任务 +jobconf_callback_child_msg1={0}/{1} [任务ID={2}], 触发{3}, 触发备注: {4}
+jobconf_callback_child_msg2={0}/{1} [任务ID={2}], 触发失败, 触发备注: 任务ID格式错误
+jobconf_trigger_type=任务触发类型 +jobconf_trigger_type_cron=Cron触发 +jobconf_trigger_type_manual=手动触发 +jobconf_trigger_type_parent=父任务触发 +jobconf_trigger_type_api=API触发 +jobconf_trigger_type_retry=失败重试触发 +jobconf_trigger_type_misfire=调度过期补偿 + +## user +user_manage=用户管理 +user_username=账号 +user_password=密码 +user_role=角色 +user_role_admin=管理员 +user_role_normal=普通用户 +user_permission=权限 +user_add=新增用户 +user_update=更新用户 +user_username_repeat=账号重复 +user_username_valid=限制以小写字母开头,由小写字母、数字组成 +user_password_update_placeholder=请输入新密码,为空则不更新密码 +user_update_loginuser_limit=禁止操作当前登录账号 + +## help +job_help=使用教程 +job_help_document=官方文档 \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties new file mode 100644 index 000000000..90bfc1aa7 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -0,0 +1,276 @@ +admin_name=任務調度中心 +admin_name_full=分布式任務調度平臺XXL-JOB +admin_version=2.3.0 +admin_i18n= + +## system +system_tips=系統提示 +system_ok=確定 +system_close=關閉 +system_save=儲存 +system_cancel=取消 +system_search=搜尋 +system_status=狀態 +system_opt=操作 +system_please_input=請輸入 +system_please_choose=请選擇 +system_success=成功 +system_fail=失敗 +system_add_suc=新增成功 +system_add_fail=新增失敗 +system_update_suc=更新成功 +system_update_fail=更新失敗 +system_all=全部 +system_api_error=API錯誤 +system_show=查看 +system_empty=無 +system_opt_suc=操作成功 +system_opt_fail=操作失敗 +system_opt_edit=編輯 +system_opt_del=刪除 +system_opt_copy=復制 +system_unvalid=非法 +system_not_found=不存在 +system_nav=導航 +system_digits=整數 +system_lengh_limit=長度限制 +system_permission_limit=權限控管 +system_welcome=歡迎 + +## daterangepicker +daterangepicker_ranges_recent_hour=最近一小時 +daterangepicker_ranges_today=今日 +daterangepicker_ranges_yesterday=昨日 +daterangepicker_ranges_this_month=本月 +daterangepicker_ranges_last_month=上個月 +daterangepicker_ranges_recent_week=最近一周 +daterangepicker_ranges_recent_month=最近一月 +daterangepicker_custom_name=自定義 +daterangepicker_custom_starttime=起始時間 +daterangepicker_custom_endtime=結束時間 +daterangepicker_custom_daysofweek=日,一,二,三,四,五,六 +daterangepicker_custom_monthnames=一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月 + +## dataTable +dataTable_sProcessing=處理中... +dataTable_sLengthMenu=每頁 _MENU_ 條記錄 +dataTable_sZeroRecords=沒有相符合記錄 +dataTable_sInfo=第 _PAGE_ 頁 ( 總共 _PAGES_ 頁,_TOTAL_ 條記錄 ) +dataTable_sInfoEmpty=無記錄 +dataTable_sInfoFiltered=(由 _MAX_ 項結果過濾) +dataTable_sSearch=搜尋 +dataTable_sEmptyTable=表中資料為空 +dataTable_sLoadingRecords=載入中... +dataTable_sFirst=首頁 +dataTable_sPrevious=上頁 +dataTable_sNext=下頁 +dataTable_sLast=末頁 +dataTable_sSortAscending=: 以升幂排序此列 +dataTable_sSortDescending=: 以降幂排序此列 + +## login +login_btn=登入 +login_remember_me=記住密碼 +login_username_placeholder=請輸入登入帳號 +login_password_placeholder=請輸入登入密碼 +login_username_empty=請輸入登入帳號 +login_username_lt_4=登入帳號不應低於4位數 +login_password_empty=請輸入登入密碼 +login_password_lt_4=登入密碼不應低於4位數 +login_success=登入成功 +login_fail=登入失敗 +login_param_empty=帳號或密碼為空值 +login_param_unvalid=帳號或密碼錯誤 + +## logout +logout_btn=登出 +logout_confirm=確認登出? +logout_success=登出成功 +logout_fail=登出失敗 + +## change pwd +change_pwd=修改密碼 +change_pwd_suc_to_logout=修改密碼成功,即將登出 +change_pwd_field_newpwd=新密碼 + +## dashboard +job_dashboard_name=運行報表 +job_dashboard_job_num=任務數量 +job_dashboard_job_num_tip=調度中心運行的任務數量 +job_dashboard_trigger_num=調度次數 +job_dashboard_trigger_num_tip=調度中心觸發的調度次數 +job_dashboard_jobgroup_num=執行器數量 +job_dashboard_jobgroup_num_tip=調度中心在線的執行器機器數量 +job_dashboard_report=調度報表 +job_dashboard_report_loaddata_fail=調度報表資料加載異常 +job_dashboard_date_report=日期分布圖 +job_dashboard_rate_report=成功比例圖 + +## job info +jobinfo_name=任務管理 +jobinfo_job=任務 +jobinfo_field_add=新增 +jobinfo_field_update=更新任務 +jobinfo_field_id=任務ID +jobinfo_field_jobgroup=執行器 +jobinfo_field_jobdesc=任務描述 +jobinfo_field_gluetype=運行模式 +jobinfo_field_executorparam=任務參數 +jobinfo_field_author=負責人 +jobinfo_field_timeout=任務超時秒數 +jobinfo_field_alarmemail=告警郵件 +jobinfo_field_alarmemail_placeholder=輸入多個告警郵件地址,請以逗號分隔 +jobinfo_field_executorRouteStrategy=路由策略 +jobinfo_field_childJobId=子任務ID +jobinfo_field_childJobId_placeholder=輸入子任務ID,如有多個請以逗號分隔 +jobinfo_field_executorBlockStrategy=阻塞處理策略 +jobinfo_field_executorFailRetryCount=失敗重試次數 +jobinfo_field_executorFailRetryCount_placeholder=失敗重試次數,大於零時生效 +jobinfo_script_location=腳本位置 +jobinfo_shard_index=分片序號 +jobinfo_shard_total=分片總數 +jobinfo_opt_stop=停止 +jobinfo_opt_start=啟動 +jobinfo_opt_log=查詢日誌 +jobinfo_opt_run=執行一次 +jobinfo_opt_run_tips=請輸入本次執行的機器地址,為空則從執行器獲取 +jobinfo_opt_registryinfo=注冊節點 +jobinfo_opt_next_time=下次執行時間 +jobinfo_glue_remark=源碼備註 +jobinfo_glue_remark_limit=源碼備註長度限制為4~100 +jobinfo_glue_rollback=版本回復 +jobinfo_glue_jobid_unvalid=任務ID非法 +jobinfo_glue_gluetype_unvalid=該任務非GLUE模式 +jobinfo_field_executorTimeout_placeholder=任務超時時間,單位秒,大於零時生效 +schedule_type=調度類型 +schedule_type_none=無 +schedule_type_cron=CRON +schedule_type_fix_rate=固定速度 +schedule_type_fix_delay=固定延遲 +schedule_type_none_limit_start=當前調度類型禁止啟動 +misfire_strategy=調度過期策略 +misfire_strategy_do_nothing=忽略 +misfire_strategy_fire_once_now=立即執行壹次 +jobinfo_conf_base=基礎配置 +jobinfo_conf_schedule=調度配置 +jobinfo_conf_job=任務配置 +jobinfo_conf_advanced=高級配置 + +## job log +joblog_name=調度日誌 +joblog_status=狀態 +joblog_status_all=全部 +joblog_status_suc=成功 +joblog_status_fail=失敗 +joblog_status_running=進行中 +joblog_field_triggerTime=調度時間 +joblog_field_triggerCode=調度結果 +joblog_field_triggerMsg=調度備註 +joblog_field_handleTime=執行時間 +joblog_field_handleCode=執行结果 +joblog_field_handleMsg=執行備註 +joblog_field_executorAddress=執行器地址 +joblog_clean=清理 +joblog_clean_log=日誌清理 +joblog_clean_type=清理方式 +joblog_clean_type_1=清理一個月之前日誌資料 +joblog_clean_type_2=清理三個月之前日誌資料 +joblog_clean_type_3=清理六個月之前日誌資料 +joblog_clean_type_4=清理一年之前日誌資料 +joblog_clean_type_5=清理一千條以前日誌資料 +joblog_clean_type_6=清理一萬條以前日誌資料 +joblog_clean_type_7=清理三萬條以前日誌資料 +joblog_clean_type_8=清理十萬條以前日誌資料 +joblog_clean_type_9=清理所有日誌資料 +joblog_clean_type_unvalid=清理類型參数異常 +joblog_handleCode_200=成功 +joblog_handleCode_500=失敗 +joblog_handleCode_502=失敗(超時) +joblog_kill_log=终止任務 +joblog_kill_log_limit=調度失敗,無法终止日誌 +joblog_kill_log_byman=人為操作,主動終止 +joblog_lost_fail=任務結果丟失,標記失敗 +joblog_rolling_log=執行日誌 +joblog_rolling_log_refresh=更新 +joblog_rolling_log_triggerfail=任務發起調度失敗,無法查看執行日誌 +joblog_rolling_log_failoften=終止請求Rolling日誌,請求失敗次數超上限,可刷新頁面重新加載日誌 +joblog_logid_unvalid=日誌ID非法 + +## job group +jobgroup_name=執行器管理 +jobgroup_list=執行器列表 +jobgroup_add=新增執行器 +jobgroup_edit=編輯執行器 +jobgroup_del=刪除執行器 +jobgroup_field_title=名稱 +jobgroup_field_addressType=注冊方式 +jobgroup_field_addressType_0=自動注冊 +jobgroup_field_addressType_1=手動登錄 +jobgroup_field_addressType_limit=手動登錄注冊方式,機器地址不可為空 +jobgroup_field_registryList=機器地址 +jobgroup_field_registryList_unvalid=機器地址格式非法 +jobgroup_field_registryList_placeholder=請輸入執行器地址列表,多個地址請以逗號分隔 +jobgroup_field_appname_limit=限制以小寫字母開頭,由小寫字母、數字和中划線組成 +jobgroup_field_appname_length=AppName長度限制為4~64 +jobgroup_field_title_length=名稱長度限制為4~12 +jobgroup_field_order_digits=請輸入整數 +jobgroup_field_orderrange=取值範圍為1~1000 +jobgroup_del_limit_0=拒絕刪除,該執行器使用中 +jobgroup_del_limit_1=拒絕删除,系统至少保留一個執行器 +jobgroup_empty=不存在有效執行器,請聯絡系統管理員 + +## job conf +jobconf_block_SERIAL_EXECUTION=單機串行 +jobconf_block_DISCARD_LATER=丢棄后續調度 +jobconf_block_COVER_EARLY=覆蓋之前調度 +jobconf_route_first=第一個 +jobconf_route_last=最後一個 +jobconf_route_round=輪詢 +jobconf_route_random=隨機 +jobconf_route_consistenthash=一致性HASH +jobconf_route_lfu=最不經常使用 +jobconf_route_lru=最近最久未使用 +jobconf_route_failover=故障轉移 +jobconf_route_busyover=忙碌轉移 +jobconf_route_shard=分片廣播 +jobconf_idleBeat=空閒檢測 +jobconf_beat=心跳檢測 +jobconf_monitor=任務調度中心監控告警 +jobconf_monitor_detail=監控告警明细 +jobconf_monitor_alarm_title=告警類型 +jobconf_monitor_alarm_type=調度失敗 +jobconf_monitor_alarm_content=告警内容 +jobconf_trigger_admin_adress=調度機器 +jobconf_trigger_exe_regtype=執行器-注冊方式 +jobconf_trigger_exe_regaddress=執行器-地址列表 +jobconf_trigger_address_empty=調度失敗:執行器地址為空 +jobconf_trigger_run=觸發調度 +jobconf_trigger_child_run=觸發子任務 +jobconf_callback_child_msg1={0}/{1} [任務ID={2}], 觸發{3}, 觸發備註: {4}
+jobconf_callback_child_msg2={0}/{1} [任務ID={2}], 觸發失败, 觸發備註: 任務ID格式錯誤
+jobconf_trigger_type=任務觸發類型 +jobconf_trigger_type_cron=Cron觸發 +jobconf_trigger_type_manual=手動觸發 +jobconf_trigger_type_parent=父任務觸發 +jobconf_trigger_type_api=API觸發 +jobconf_trigger_type_retry=失敗重試觸發 +jobconf_trigger_type_misfire=調度過期補償 + +## user +user_manage=用户管理 +user_username=帳號 +user_password=密碼 +user_role=角色 +user_role_admin=管理員 +user_role_normal=普通用戶 +user_permission=權限 +user_add=新增用戶 +user_update=更新用戶 +user_username_repeat=帳號重複 +user_username_valid=限制以小寫字母開頭,由小寫字母、數字組成 +user_password_update_placeholder=請輸入新密碼,為空則不更新密碼 +user_update_loginuser_limit=禁止操作當前登入帳號 + +## help +job_help=使用教程 +job_help_document=官方文件 \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback.xml new file mode 100644 index 000000000..d4b08c240 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback.xml @@ -0,0 +1,29 @@ + + + + logback + + + + + %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n + + + + + ${log.path} + + ${log.path}.%d{yyyy-MM-dd}.zip + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml new file mode 100644 index 000000000..87299f88b --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + t.id, + t.app_name, + t.title, + t.address_type, + t.address_list, + t.update_time + + + + + + + + INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`) + values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} ); + + + + UPDATE xxl_job_group + SET `app_name` = #{appname}, + `title` = #{title}, + `address_type` = #{addressType}, + `address_list` = #{addressList}, + `update_time` = #{updateTime} + WHERE id = #{id} + + + + DELETE FROM xxl_job_group + WHERE id = #{id} + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml new file mode 100644 index 000000000..7b3c3a3ed --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t.id, + t.job_group, + t.job_desc, + t.add_time, + t.update_time, + t.author, + t.alarm_email, + t.schedule_type, + t.schedule_conf, + t.misfire_strategy, + t.executor_route_strategy, + t.executor_handler, + t.executor_param, + t.executor_block_strategy, + t.executor_timeout, + t.executor_fail_retry_count, + t.glue_type, + t.glue_source, + t.glue_remark, + t.glue_updatetime, + t.child_jobid, + t.trigger_status, + t.trigger_last_time, + t.trigger_next_time + + + + + + + + INSERT INTO xxl_job_info ( + job_group, + job_desc, + add_time, + update_time, + author, + alarm_email, + schedule_type, + schedule_conf, + misfire_strategy, + executor_route_strategy, + executor_handler, + executor_param, + executor_block_strategy, + executor_timeout, + executor_fail_retry_count, + glue_type, + glue_source, + glue_remark, + glue_updatetime, + child_jobid, + trigger_status, + trigger_last_time, + trigger_next_time + ) VALUES ( + #{jobGroup}, + #{jobDesc}, + #{addTime}, + #{updateTime}, + #{author}, + #{alarmEmail}, + #{scheduleType}, + #{scheduleConf}, + #{misfireStrategy}, + #{executorRouteStrategy}, + #{executorHandler}, + #{executorParam}, + #{executorBlockStrategy}, + #{executorTimeout}, + #{executorFailRetryCount}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{glueUpdatetime}, + #{childJobId}, + #{triggerStatus}, + #{triggerLastTime}, + #{triggerNextTime} + ); + + + + + + + UPDATE xxl_job_info + SET + job_group = #{jobGroup}, + job_desc = #{jobDesc}, + update_time = #{updateTime}, + author = #{author}, + alarm_email = #{alarmEmail}, + schedule_type = #{scheduleType}, + schedule_conf = #{scheduleConf}, + misfire_strategy = #{misfireStrategy}, + executor_route_strategy = #{executorRouteStrategy}, + executor_handler = #{executorHandler}, + executor_param = #{executorParam}, + executor_block_strategy = #{executorBlockStrategy}, + executor_timeout = ${executorTimeout}, + executor_fail_retry_count = ${executorFailRetryCount}, + glue_type = #{glueType}, + glue_source = #{glueSource}, + glue_remark = #{glueRemark}, + glue_updatetime = #{glueUpdatetime}, + child_jobid = #{childJobId}, + trigger_status = #{triggerStatus}, + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime} + WHERE id = #{id} + + + + DELETE + FROM xxl_job_info + WHERE id = #{id} + + + + + + + + + + + UPDATE xxl_job_info + SET + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime}, + trigger_status = #{triggerStatus} + WHERE id = #{id} + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml new file mode 100644 index 000000000..699277c51 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + t.id, + t.job_id, + t.glue_type, + t.glue_source, + t.glue_remark, + t.add_time, + t.update_time + + + + INSERT INTO xxl_job_logglue ( + `job_id`, + `glue_type`, + `glue_source`, + `glue_remark`, + `add_time`, + `update_time` + ) VALUES ( + #{jobId}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{addTime}, + #{updateTime} + ); + + + + + + + DELETE FROM xxl_job_logglue + WHERE id NOT in( + SELECT id FROM( + SELECT id FROM xxl_job_logglue + WHERE `job_id` = #{jobId} + ORDER BY update_time desc + LIMIT 0, #{limit} + ) t1 + ) AND `job_id` = #{jobId} + + + + DELETE FROM xxl_job_logglue + WHERE `job_id` = #{jobId} + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml new file mode 100644 index 000000000..4155f1798 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t.id, + t.job_group, + t.job_id, + t.executor_address, + t.executor_handler, + t.executor_param, + t.executor_sharding_param, + t.executor_fail_retry_count, + t.trigger_time, + t.trigger_code, + t.trigger_msg, + t.handle_time, + t.handle_code, + t.handle_msg, + t.alarm_status + + + + + + + + + + + INSERT INTO xxl_job_log ( + `job_group`, + `job_id`, + `trigger_time`, + `trigger_code`, + `handle_code` + ) VALUES ( + #{jobGroup}, + #{jobId}, + #{triggerTime}, + #{triggerCode}, + #{handleCode} + ); + + + + + UPDATE xxl_job_log + SET + `trigger_time`= #{triggerTime}, + `trigger_code`= #{triggerCode}, + `trigger_msg`= #{triggerMsg}, + `executor_address`= #{executorAddress}, + `executor_handler`=#{executorHandler}, + `executor_param`= #{executorParam}, + `executor_sharding_param`= #{executorShardingParam}, + `executor_fail_retry_count`= #{executorFailRetryCount} + WHERE `id`= #{id} + + + + UPDATE xxl_job_log + SET + `handle_time`= #{handleTime}, + `handle_code`= #{handleCode}, + `handle_msg`= #{handleMsg} + WHERE `id`= #{id} + + + + delete from xxl_job_log + WHERE job_id = #{jobId} + + + + + + + + + + delete from xxl_job_log + WHERE id in + + #{item} + + + + + + + UPDATE xxl_job_log + SET + `alarm_status` = #{newAlarmStatus} + WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus} + + + + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml new file mode 100644 index 000000000..579d5f394 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + t.id, + t.trigger_day, + t.running_count, + t.suc_count, + t.fail_count + + + + INSERT INTO xxl_job_log_report ( + `trigger_day`, + `running_count`, + `suc_count`, + `fail_count` + ) VALUES ( + #{triggerDay}, + #{runningCount}, + #{sucCount}, + #{failCount} + ); + + + + + UPDATE xxl_job_log_report + SET `running_count` = #{runningCount}, + `suc_count` = #{sucCount}, + `fail_count` = #{failCount} + WHERE `trigger_day` = #{triggerDay} + + + + + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml new file mode 100644 index 000000000..4cae667a2 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + t.id, + t.registry_group, + t.registry_key, + t.registry_value, + t.update_time + + + + + + DELETE FROM xxl_job_registry + WHERE id in + + #{item} + + + + + + + UPDATE xxl_job_registry + SET `update_time` = #{updateTime} + WHERE `registry_group` = #{registryGroup} + AND `registry_key` = #{registryKey} + AND `registry_value` = #{registryValue} + + + + INSERT INTO xxl_job_registry( `registry_group` , `registry_key` , `registry_value`, `update_time`) + VALUES( #{registryGroup} , #{registryKey} , #{registryValue}, #{updateTime}) + + + + DELETE FROM xxl_job_registry + WHERE registry_group = #{registryGroup} + AND registry_key = #{registryKey} + AND registry_value = #{registryValue} + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml new file mode 100644 index 000000000..9e09b4aae --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + t.id, + t.username, + t.password, + t.role, + t.permission + + + + + + + + + + INSERT INTO xxl_job_user ( + username, + password, + role, + permission + ) VALUES ( + #{username}, + #{password}, + #{role}, + #{permission} + ); + + + + UPDATE xxl_job_user + SET + + password = #{password}, + + role = #{role}, + permission = #{permission} + WHERE id = #{id} + + + + DELETE + FROM xxl_job_user + WHERE id = #{id} + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/css/ionicons.min.css b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/css/ionicons.min.css new file mode 100644 index 000000000..baba9e930 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/css/ionicons.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8";/*! + Ionicons, v2.0.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.0");src:url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),url("../fonts/ionicons.woff?v=2.0.0") format("woff"),url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.eot b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..92a3f20a39267ae7f45144f412a995a663730360 GIT binary patch literal 120724 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 + + + + +Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014 + By Adam Bradley +Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.ttf b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4e4632486d863337c1c73478ddb3c20726c55a0 GIT binary patch literal 188508 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

wXX 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

SE&R;%4UjjF1%wKbcsVBt)`ABtgge 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Ξ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 literal 0 HcmV?d00001 diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js new file mode 100644 index 000000000..234f9b3e9 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js @@ -0,0 +1,2 @@ +/*! pace 1.0.2 */ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cQ;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='

\n
\n
\n
',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e;e=[];for(d in b.prototype)try{e.push(null==a[d]&&"function"!=typeof b[d]?"function"==typeof Object.defineProperty?Object.defineProperty(a,d,{get:function(){return b.prototype[d]},configurable:!0,enumerable:!0}):a[d]=b.prototype[d]:void 0)}catch(f){c=f}return e},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(["pace"],function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this); \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css new file mode 100644 index 000000000..d9bca466a --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #2299dd; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #2299dd, 0 0 5px #2299dd; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #2299dd; + border-left-color: #2299dd; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css new file mode 100644 index 000000000..86f4b775e --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css @@ -0,0 +1,269 @@ +.daterangepicker { + position: absolute; + color: inherit; + background-color: #fff; + border-radius: 4px; + width: 278px; + padding: 4px; + margin-top: 1px; + top: 100px; + left: 20px; + /* Calendars */ } + .daterangepicker:before, .daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; } + .daterangepicker:before { + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #ccc; } + .daterangepicker:after { + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; } + .daterangepicker.opensleft:before { + right: 9px; } + .daterangepicker.opensleft:after { + right: 10px; } + .daterangepicker.openscenter:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; } + .daterangepicker.openscenter:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; } + .daterangepicker.opensright:before { + left: 9px; } + .daterangepicker.opensright:after { + left: 10px; } + .daterangepicker.dropup { + margin-top: -5px; } + .daterangepicker.dropup:before { + top: initial; + bottom: -7px; + border-bottom: initial; + border-top: 7px solid #ccc; } + .daterangepicker.dropup:after { + top: initial; + bottom: -6px; + border-bottom: initial; + border-top: 6px solid #fff; } + .daterangepicker.dropdown-menu { + max-width: none; + z-index: 3001; } + .daterangepicker.single .ranges, .daterangepicker.single .calendar { + float: none; } + .daterangepicker.show-calendar .calendar { + display: block; } + .daterangepicker .calendar { + display: none; + max-width: 270px; + margin: 4px; } + .daterangepicker .calendar.single .calendar-table { + border: none; } + .daterangepicker .calendar th, .daterangepicker .calendar td { + white-space: nowrap; + text-align: center; + min-width: 32px; } + .daterangepicker .calendar-table { + border: 1px solid #fff; + padding: 4px; + border-radius: 4px; + background-color: #fff; } + .daterangepicker table { + width: 100%; + margin: 0; } + .daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + border-radius: 4px; + border: 1px solid transparent; + white-space: nowrap; + cursor: pointer; } + .daterangepicker td.available:hover, .daterangepicker th.available:hover { + background-color: #eee; + border-color: transparent; + color: inherit; } + .daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; } + .daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: #fff; + border-color: transparent; + color: #999; } + .daterangepicker td.in-range { + background-color: #ebf4f8; + border-color: transparent; + color: #000; + border-radius: 0; } + .daterangepicker td.start-date { + border-radius: 4px 0 0 4px; } + .daterangepicker td.end-date { + border-radius: 0 4px 4px 0; } + .daterangepicker td.start-date.end-date { + border-radius: 4px; } + .daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: transparent; + color: #fff; } + .daterangepicker th.month { + width: auto; } + .daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; } + .daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; } + .daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; } + .daterangepicker select.yearselect { + width: 40%; } + .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; } + .daterangepicker .input-mini { + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + height: 30px; + line-height: 30px; + display: block; + vertical-align: middle; + margin: 0 0 5px 0; + padding: 0 6px 0 28px; + width: 100%; } + .daterangepicker .input-mini.active { + border: 1px solid #08c; + border-radius: 4px; } + .daterangepicker .daterangepicker_input { + position: relative; } + .daterangepicker .daterangepicker_input i { + position: absolute; + left: 8px; + top: 8px; } + .daterangepicker.rtl .input-mini { + padding-right: 28px; + padding-left: 6px; } + .daterangepicker.rtl .daterangepicker_input i { + left: auto; + right: 8px; } + .daterangepicker .calendar-time { + text-align: center; + margin: 5px auto; + line-height: 30px; + position: relative; + padding-left: 28px; } + .daterangepicker .calendar-time select.disabled { + color: #ccc; + cursor: not-allowed; } + +.ranges { + font-size: 11px; + float: none; + margin: 4px; + text-align: left; } + .ranges ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; } + .ranges li { + font-size: 13px; + background-color: #f5f5f5; + border: 1px solid #f5f5f5; + border-radius: 4px; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + cursor: pointer; } + .ranges li:hover { + background-color: #08c; + border: 1px solid #08c; + color: #fff; } + .ranges li.active { + background-color: #08c; + border: 1px solid #08c; + color: #fff; } + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; } + .daterangepicker .ranges ul { + width: 160px; } + .daterangepicker.single .ranges ul { + width: 100%; } + .daterangepicker.single .calendar.left { + clear: none; } + .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .calendar { + float: left; } + .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .calendar { + float: right; } + .daterangepicker.ltr { + direction: ltr; + text-align: left; } + .daterangepicker.ltr .calendar.left { + clear: left; + margin-right: 0; } + .daterangepicker.ltr .calendar.left .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.ltr .calendar.right { + margin-left: 0; } + .daterangepicker.ltr .calendar.right .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.ltr .left .daterangepicker_input { + padding-right: 12px; } + .daterangepicker.ltr .calendar.left .calendar-table { + padding-right: 12px; } + .daterangepicker.ltr .ranges, .daterangepicker.ltr .calendar { + float: left; } + .daterangepicker.rtl { + direction: rtl; + text-align: right; } + .daterangepicker.rtl .calendar.left { + clear: right; + margin-left: 0; } + .daterangepicker.rtl .calendar.left .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.rtl .calendar.right { + margin-right: 0; } + .daterangepicker.rtl .calendar.right .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.rtl .left .daterangepicker_input { + padding-left: 12px; } + .daterangepicker.rtl .calendar.left .calendar-table { + padding-left: 12px; } + .daterangepicker.rtl .ranges, .daterangepicker.rtl .calendar { + text-align: right; + float: right; } } +@media (min-width: 730px) { + .daterangepicker .ranges { + width: auto; } + .daterangepicker.ltr .ranges { + float: left; } + .daterangepicker.rtl .ranges { + float: right; } + .daterangepicker .calendar.left { + clear: none !important; } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js new file mode 100644 index 000000000..079cde61c --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js @@ -0,0 +1,1653 @@ +/** +* @version: 2.1.27 +* @author: Dan Grossman http://www.dangrossman.info/ +* @copyright: Copyright (c) 2012-2017 Dan Grossman. All rights reserved. +* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php +* @website: http://www.daterangepicker.com/ +*/ +// Follow the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Make globaly available as well + define(['moment', 'jquery'], function (moment, jquery) { + if (!jquery.fn) jquery.fn = {}; // webpack server rendering + return factory(moment, jquery); + }); + } else if (typeof module === 'object' && module.exports) { + // Node / Browserify + //isomorphic issue + var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined; + if (!jQuery) { + jQuery = require('jquery'); + if (!jQuery.fn) jQuery.fn = {}; + } + var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); + module.exports = factory(moment, jQuery); + } else { + // Browser globals + root.daterangepicker = factory(root.moment, root.jQuery); + } +}(this, function(moment, $) { + var DateRangePicker = function(element, options, cb) { + + //default settings for options + this.parentEl = 'body'; + this.element = $(element); + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.dateLimit = false; + this.autoApply = false; + this.singleDatePicker = false; + this.showDropdowns = false; + this.showWeekNumbers = false; + this.showISOWeekNumbers = false; + this.showCustomRangeLabel = true; + this.timePicker = false; + this.timePicker24Hour = false; + this.timePickerIncrement = 1; + this.timePickerSeconds = false; + this.linkedCalendars = true; + this.autoUpdateInput = true; + this.alwaysShowCalendars = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.drops = 'down'; + if (this.element.hasClass('dropup')) + this.drops = 'up'; + + this.buttonClasses = 'btn btn-sm'; + this.applyClass = 'btn-success'; + this.cancelClass = 'btn-default'; + + this.locale = { + direction: 'ltr', + format: moment.localeData().longDateFormat('L'), + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment.weekdaysMin(), + monthNames: moment.monthsShort(), + firstDay: moment.localeData().firstDayOfWeek() + }; + + this.callback = function() { }; + + //some state information + this.isShowing = false; + this.leftCalendar = {}; + this.rightCalendar = {}; + + //custom options from user + if (typeof options !== 'object' || options === null) + options = {}; + + //allow setting options with data attributes + //data-api options will be overwritten with custom javascript options + options = $.extend(this.element.data(), options); + + //html template for the picker UI + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = ''; + + this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(options.template).appendTo(this.parentEl); + + // + // handle all the possible options overriding defaults + // + + if (typeof options.locale === 'object') { + + if (typeof options.locale.direction === 'string') + this.locale.direction = options.locale.direction; + + if (typeof options.locale.format === 'string') + this.locale.format = options.locale.format; + + if (typeof options.locale.separator === 'string') + this.locale.separator = options.locale.separator; + + if (typeof options.locale.daysOfWeek === 'object') + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + + if (typeof options.locale.monthNames === 'object') + this.locale.monthNames = options.locale.monthNames.slice(); + + if (typeof options.locale.firstDay === 'number') + this.locale.firstDay = options.locale.firstDay; + + if (typeof options.locale.applyLabel === 'string') + this.locale.applyLabel = options.locale.applyLabel; + + if (typeof options.locale.cancelLabel === 'string') + this.locale.cancelLabel = options.locale.cancelLabel; + + if (typeof options.locale.weekLabel === 'string') + this.locale.weekLabel = options.locale.weekLabel; + + if (typeof options.locale.customRangeLabel === 'string'){ + //Support unicode chars in the custom range name. + var elem = document.createElement('textarea'); + elem.innerHTML = options.locale.customRangeLabel; + var rangeHtml = elem.value; + this.locale.customRangeLabel = rangeHtml; + } + } + this.container.addClass(this.locale.direction); + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.locale.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.locale.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.locale.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.locale.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + // sanity check for bad options + if (this.minDate && this.startDate.isBefore(this.minDate)) + this.startDate = this.minDate.clone(); + + // sanity check for bad options + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (typeof options.applyClass === 'string') + this.applyClass = options.applyClass; + + if (typeof options.cancelClass === 'string') + this.cancelClass = options.cancelClass; + + if (typeof options.dateLimit === 'object') + this.dateLimit = options.dateLimit; + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') + this.showWeekNumbers = options.showWeekNumbers; + + if (typeof options.showISOWeekNumbers === 'boolean') + this.showISOWeekNumbers = options.showISOWeekNumbers; + + if (typeof options.buttonClasses === 'string') + this.buttonClasses = options.buttonClasses; + + if (typeof options.buttonClasses === 'object') + this.buttonClasses = options.buttonClasses.join(' '); + + if (typeof options.showDropdowns === 'boolean') + this.showDropdowns = options.showDropdowns; + + if (typeof options.showCustomRangeLabel === 'boolean') + this.showCustomRangeLabel = options.showCustomRangeLabel; + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) + this.endDate = this.startDate.clone(); + } + + if (typeof options.timePicker === 'boolean') + this.timePicker = options.timePicker; + + if (typeof options.timePickerSeconds === 'boolean') + this.timePickerSeconds = options.timePickerSeconds; + + if (typeof options.timePickerIncrement === 'number') + this.timePickerIncrement = options.timePickerIncrement; + + if (typeof options.timePicker24Hour === 'boolean') + this.timePicker24Hour = options.timePicker24Hour; + + if (typeof options.autoApply === 'boolean') + this.autoApply = options.autoApply; + + if (typeof options.autoUpdateInput === 'boolean') + this.autoUpdateInput = options.autoUpdateInput; + + if (typeof options.linkedCalendars === 'boolean') + this.linkedCalendars = options.linkedCalendars; + + if (typeof options.isInvalidDate === 'function') + this.isInvalidDate = options.isInvalidDate; + + if (typeof options.isCustomDate === 'function') + this.isCustomDate = options.isCustomDate; + + if (typeof options.alwaysShowCalendars === 'boolean') + this.alwaysShowCalendars = options.alwaysShowCalendars; + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is('input[type=text]')) { + var val = $(this.element).val(), + split = val.split(this.locale.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.locale.format); + end = moment(split[1], this.locale.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.locale.format); + end = moment(val, this.locale.format); + } + if (start !== null && end !== null) { + this.setStartDate(start); + this.setEndDate(end); + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.locale.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.locale.format); + else + end = moment(options.ranges[range][1]); + + // If the start or end date exceed those allowed by the minDate or dateLimit + // options, shorten the range to the allowable period. + if (this.minDate && start.isBefore(this.minDate)) + start = this.minDate.clone(); + + var maxDate = this.maxDate; + if (this.dateLimit && maxDate && start.clone().add(this.dateLimit).isAfter(maxDate)) + maxDate = start.clone().add(this.dateLimit); + if (maxDate && end.isAfter(maxDate)) + end = maxDate.clone(); + + // If the end of the range is before the minimum or the start of the range is + // after the maximum, don't display this range option at all. + if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + continue; + + //Support unicode chars in the range names. + var elem = document.createElement('textarea'); + elem.innerHTML = range; + var rangeHtml = elem.value; + + this.ranges[rangeHtml] = [start, end]; + } + + var list = '
    '; + for (range in this.ranges) { + list += '
  • ' + range + '
  • '; + } + if (this.showCustomRangeLabel) { + list += '
  • ' + this.locale.customRangeLabel + '
  • '; + } + list += '
'; + this.container.find('.ranges').prepend(list); + } + + if (typeof cb === 'function') { + this.callback = cb; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + this.container.find('.calendar-time').hide(); + } + + //can't be used together for now + if (this.timePicker && this.autoApply) + this.autoApply = false; + + if (this.autoApply && typeof options.ranges !== 'object') { + this.container.find('.ranges').hide(); + } else if (this.autoApply) { + this.container.find('.applyBtn, .cancelBtn').addClass('hide'); + } + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.calendar.left').addClass('single'); + this.container.find('.calendar.left').show(); + this.container.find('.calendar.right').hide(); + this.container.find('.daterangepicker_input input, .daterangepicker_input > i').hide(); + if (this.timePicker) { + this.container.find('.ranges ul').hide(); + } else { + this.container.find('.ranges').hide(); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //swap the position of the predefined ranges if opens right + if (typeof options.ranges !== 'undefined' && this.opens == 'right') { + this.container.find('.ranges').prependTo( this.container.find('.calendar.left').parent() ); + } + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyClass.length) + this.container.find('.applyBtn').addClass(this.applyClass); + if (this.cancelClass.length) + this.container.find('.cancelBtn').addClass(this.cancelClass); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) + .on('click.daterangepicker', '.daterangepicker_input input', $.proxy(this.showCalendars, this)) + .on('focus.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsFocused, this)) + .on('blur.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsBlurred, this)) + .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this)) + .on('keydown.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsKeydown, this)); + + this.container.find('.ranges') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + .on('mouseenter.daterangepicker', 'li', $.proxy(this.hoverRange, this)) + .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); + + if (this.element.is('input') || this.element.is('button')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.elementChanged, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); + } + + // + // if attached to a text input, set the initial value + // + + if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.element.trigger('change'); + } else if (this.element.is('input') && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format)); + this.element.trigger('change'); + } + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.locale.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.minDate && this.startDate.isBefore(this.minDate)) { + this.startDate = this.minDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (this.maxDate && this.startDate.isAfter(this.maxDate)) { + this.startDate = this.maxDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.locale.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); + + if (this.timePicker && this.timePickerIncrement) + this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.endDate.isBefore(this.startDate)) + this.endDate = this.startDate.clone(); + + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (this.dateLimit && this.startDate.clone().add(this.dateLimit).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.dateLimit); + + this.previousRightTime = this.endDate.clone(); + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + isInvalidDate: function() { + return false; + }, + + isCustomDate: function() { + return false; + }, + + updateView: function() { + if (this.timePicker) { + this.renderTimePicker('left'); + this.renderTimePicker('right'); + if (!this.endDate) { + this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); + } else { + this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); + } + } + if (this.endDate) { + this.container.find('input[name="daterangepicker_end"]').removeClass('active'); + this.container.find('input[name="daterangepicker_start"]').addClass('active'); + } else { + this.container.find('input[name="daterangepicker_end"]').addClass('active'); + this.container.find('input[name="daterangepicker_start"]').removeClass('active'); + } + this.updateMonthsInView(); + this.updateCalendars(); + this.updateFormInputs(); + }, + + updateMonthsInView: function() { + if (this.endDate) { + + //if both dates are visible already, do nothing + if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && + (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + && + (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + ) { + return; + } + + this.leftCalendar.month = this.startDate.clone().date(2); + if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { + this.rightCalendar.month = this.endDate.clone().date(2); + } else { + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + + } else { + if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { + this.leftCalendar.month = this.startDate.clone().date(2); + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + } + if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + } + }, + + updateCalendars: function() { + + if (this.timePicker) { + var hour, minute, second; + if (this.endDate) { + hour = parseInt(this.container.find('.left .hourselect').val(), 10); + minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } else { + hour = parseInt(this.container.find('.right .hourselect').val(), 10); + minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } + this.leftCalendar.month.hour(hour).minute(minute).second(second); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.renderCalendar('left'); + this.renderCalendar('right'); + + //highlight any predefined range matching the current start and end dates + this.container.find('.ranges li').removeClass('active'); + if (this.endDate == null) return; + + this.calculateChosenLabel(); + }, + + renderCalendar: function(side) { + + // + // Build the matrix of dates that will populate the calendar + // + + var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; + var month = calendar.month.month(); + var year = calendar.month.year(); + var hour = calendar.month.hour(); + var minute = calendar.month.minute(); + var second = calendar.month.second(); + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); + + var col, row; + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + //make the calendar object available to hoverDate/clickDate + if (side == 'left') { + this.leftCalendar.calendar = calendar; + } else { + this.rightCalendar.calendar = calendar; + } + + // + // Display the calendar + // + + var minDate = side == 'left' ? this.minDate : this.startDate; + var maxDate = this.maxDate; + var selected = side == 'left' ? this.startDate : this.endDate; + var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; + + var html = ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + var currentMonth = calendar[1][1].month(); + var currentYear = calendar[1][1].year(); + var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + var monthHtml = '"; + + var yearHtml = ''; + + dateHtml = monthHtml + yearHtml; + } + + html += ''; + if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + //adjust maxDate to reflect the dateLimit setting in order to + //grey out end dates beyond the dateLimit + if (this.endDate == null && this.dateLimit) { + var maxLimit = this.startDate.clone().add(this.dateLimit).endOf('day'); + if (!maxDate || maxLimit.isBefore(maxDate)) { + maxDate = maxLimit; + } + } + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + else if (this.showISOWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + + var classes = []; + + //highlight today's date + if (calendar[row][col].isSame(new Date(), "day")) + classes.push('today'); + + //highlight weekends + if (calendar[row][col].isoWeekday() > 5) + classes.push('weekend'); + + //grey out the dates in other months displayed at beginning and end of this calendar + if (calendar[row][col].month() != calendar[1][1].month()) + classes.push('off'); + + //don't allow selection of dates before the minimum date + if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of dates after the maximum date + if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of date if a custom function decides it's invalid + if (this.isInvalidDate(calendar[row][col])) + classes.push('off', 'disabled'); + + //highlight the currently selected start date + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) + classes.push('active', 'start-date'); + + //highlight the currently selected end date + if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) + classes.push('active', 'end-date'); + + //highlight dates in-between the selected dates + if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) + classes.push('in-range'); + + //apply custom classes for this date + var isCustom = this.isCustomDate(calendar[row][col]); + if (isCustom !== false) { + if (typeof isCustom === 'string') + classes.push(isCustom); + else + Array.prototype.push.apply(classes, isCustom); + } + + var cname = '', disabled = false; + for (var i = 0; i < classes.length; i++) { + cname += classes[i] + ' '; + if (classes[i] == 'disabled') + disabled = true; + } + if (!disabled) + cname += 'available'; + + html += ''; + + } + html += ''; + } + + html += ''; + html += '
' + dateHtml + '
' + this.locale.weekLabel + '' + dayOfWeek + '
' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
'; + + this.container.find('.calendar.' + side + ' .calendar-table').html(html); + + }, + + renderTimePicker: function(side) { + + // Don't bother updating the time picker if it's currently disabled + // because an end date hasn't been clicked yet + if (side == 'right' && !this.endDate) return; + + var html, selected, minDate, maxDate = this.maxDate; + + if (this.dateLimit && (!this.maxDate || this.startDate.clone().add(this.dateLimit).isAfter(this.maxDate))) + maxDate = this.startDate.clone().add(this.dateLimit); + + if (side == 'left') { + selected = this.startDate.clone(); + minDate = this.minDate; + } else if (side == 'right') { + selected = this.endDate.clone(); + minDate = this.startDate; + + //Preserve the time already selected + var timeSelector = this.container.find('.calendar.right .calendar-time div'); + if (timeSelector.html() != '') { + + selected.hour(timeSelector.find('.hourselect option:selected').val() || selected.hour()); + selected.minute(timeSelector.find('.minuteselect option:selected').val() || selected.minute()); + selected.second(timeSelector.find('.secondselect option:selected').val() || selected.second()); + + if (!this.timePicker24Hour) { + var ampm = timeSelector.find('.ampmselect option:selected').val(); + if (ampm === 'PM' && selected.hour() < 12) + selected.hour(selected.hour() + 12); + if (ampm === 'AM' && selected.hour() === 12) + selected.hour(0); + } + + } + + if (selected.isBefore(this.startDate)) + selected = this.startDate.clone(); + + if (maxDate && selected.isAfter(maxDate)) + selected = maxDate.clone(); + + } + + // + // hours + // + + html = ' '; + + // + // minutes + // + + html += ': '; + + // + // seconds + // + + if (this.timePickerSeconds) { + html += ': '; + } + + // + // AM/PM + // + + if (!this.timePicker24Hour) { + html += ''; + } + + this.container.find('.calendar.' + side + ' .calendar-time div').html(html); + + }, + + updateFormInputs: function() { + + //ignore mouse movements while an above-calendar text input has focus + if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + return; + + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.locale.format)); + if (this.endDate) + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.locale.format)); + + if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + + }, + + move: function() { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('dropup'); + + if (this.opens == 'left') { + this.container.css({ + top: containerTop, + right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else if (this.opens == 'center') { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - this.container.outerWidth() / 2, + right: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + show: function(e) { + if (this.isShowing) return; + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); + + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + // Reposition the picker if the window is resized while it's open + $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.previousRightTime = this.endDate.clone(); + + this.updateView(); + this.container.show(); + this.move(); + this.element.trigger('show.daterangepicker', this); + this.isShowing = true; + }, + + hide: function(e) { + if (!this.isShowing) return; + + //incomplete date selection, revert to last values + if (!this.endDate) { + this.startDate = this.oldStartDate.clone(); + this.endDate = this.oldEndDate.clone(); + } + + //if a new date range was selected, invoke the user callback function + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.callback(this.startDate, this.endDate, this.chosenLabel); + + //if picker is attached to a text input, update it + this.updateElement(); + + $(document).off('.daterangepicker'); + $(window).off('.daterangepicker'); + this.container.hide(); + this.element.trigger('hide.daterangepicker', this); + this.isShowing = false; + }, + + toggle: function(e) { + if (this.isShowing) { + this.hide(); + } else { + this.show(); + } + }, + + outsideClick: function(e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length + ) return; + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + hoverRange: function(e) { + + //ignore mouse movements while an above-calendar text input has focus + if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + return; + + var label = e.target.getAttribute('data-range-key'); + + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.locale.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.locale.format)); + } + + }, + + clickRange: function(e) { + var label = e.target.getAttribute('data-range-key'); + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + if (!this.alwaysShowCalendars) + this.hideCalendars(); + this.clickApply(); + } + }, + + clickPrev: function(e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + if (this.linkedCalendars) + this.rightCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + }, + + clickNext: function(e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + if (this.linkedCalendars) + this.leftCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + }, + + hoverDate: function(e) { + + //ignore mouse movements while an above-calendar text input has focus + //if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + // return; + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + //have the text inputs above calendars reflect the date being hovered over + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + if (this.endDate && !this.container.find('input[name=daterangepicker_start]').is(":focus")) { + this.container.find('input[name=daterangepicker_start]').val(date.format(this.locale.format)); + } else if (!this.endDate && !this.container.find('input[name=daterangepicker_end]').is(":focus")) { + this.container.find('input[name=daterangepicker_end]').val(date.format(this.locale.format)); + } + + //highlight the dates between the start date and the date being hovered as a potential end date + var leftCalendar = this.leftCalendar; + var rightCalendar = this.rightCalendar; + var startDate = this.startDate; + if (!this.endDate) { + this.container.find('.calendar tbody td').each(function(index, el) { + + //skip week numbers, only look at dates + if ($(el).hasClass('week')) return; + + var title = $(el).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(el).parents('.calendar'); + var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; + + if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { + $(el).addClass('in-range'); + } else { + $(el).removeClass('in-range'); + } + + }); + } + + }, + + clickDate: function(e) { + + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + // + // this function needs to do a few things: + // * alternate between selecting a start and end date for the range, + // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date + // * if autoapply is enabled, and an end date was chosen, apply the selection + // * if single date picker mode, and time picker isn't enabled, apply the selection immediately + // * if one of the inputs above the calendars was focused, cancel that manual input + // + + if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start + if (this.timePicker) { + var hour = parseInt(this.container.find('.left .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.endDate = null; + this.setStartDate(date.clone()); + } else if (!this.endDate && date.isBefore(this.startDate)) { + //special case: clicking the same date for start/end, + //but the time of the end date is before the start date + this.setEndDate(this.startDate.clone()); + } else { // picking end + if (this.timePicker) { + var hour = parseInt(this.container.find('.right .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.setEndDate(date.clone()); + if (this.autoApply) { + this.calculateChosenLabel(); + this.clickApply(); + } + } + + if (this.singleDatePicker) { + this.setEndDate(this.startDate); + if (!this.timePicker) + this.clickApply(); + } + + this.updateView(); + + //This is to cancel the blur event handler if the mouse was in one of the inputs + e.stopPropagation(); + + }, + + calculateChosenLabel: function () { + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD hh:mm:ss" : "YYYY-MM-DD hh:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html(); + break; + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html(); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html(); + } else { + this.chosenLabel = null; + } + this.showCalendars(); + } + }, + + clickApply: function(e) { + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function(e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + monthOrYearChanged: function(e) { + var isLeft = $(e.target).closest('.calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); + } else { + this.rightCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); + } + this.updateCalendars(); + }, + + timeChanged: function(e) { + + var cal = $(e.target).closest('.calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; + + if (!this.timePicker24Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.setStartDate(start); + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { + this.setEndDate(start.clone()); + } + } else if (this.endDate) { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.setEndDate(end); + } + + //update the calendars so all clickable dates reflect the new time component + this.updateCalendars(); + + //update the form inputs above the calendars with the new time + this.updateFormInputs(); + + //re-render the time pickers because changing one selection can affect what's enabled in another + this.renderTimePicker('left'); + this.renderTimePicker('right'); + + }, + + formInputsChanged: function(e) { + var isRight = $(e.target).closest('.calendar').hasClass('right'); + var start = moment(this.container.find('input[name="daterangepicker_start"]').val(), this.locale.format); + var end = moment(this.container.find('input[name="daterangepicker_end"]').val(), this.locale.format); + + if (start.isValid() && end.isValid()) { + + if (isRight && end.isBefore(start)) + start = end.clone(); + + this.setStartDate(start); + this.setEndDate(end); + + if (isRight) { + this.container.find('input[name="daterangepicker_start"]').val(this.startDate.format(this.locale.format)); + } else { + this.container.find('input[name="daterangepicker_end"]').val(this.endDate.format(this.locale.format)); + } + + } + + this.updateView(); + }, + + formInputsFocused: function(e) { + + // Highlight the focused input + this.container.find('input[name="daterangepicker_start"], input[name="daterangepicker_end"]').removeClass('active'); + $(e.target).addClass('active'); + + // Set the state such that if the user goes back to using a mouse, + // the calendars are aware we're selecting the end of the range, not + // the start. This allows someone to edit the end of a date range without + // re-selecting the beginning, by clicking on the end date input then + // using the calendar. + var isRight = $(e.target).closest('.calendar').hasClass('right'); + if (isRight) { + this.endDate = null; + this.setStartDate(this.startDate.clone()); + this.updateView(); + } + + }, + + formInputsBlurred: function(e) { + + // this function has one purpose right now: if you tab from the first + // text input to the second in the UI, the endDate is nulled so that + // you can click another, but if you tab out without clicking anything + // or changing the input value, the old endDate should be retained + + if (!this.endDate) { + var val = this.container.find('input[name="daterangepicker_end"]').val(); + var end = moment(val, this.locale.format); + if (end.isValid()) { + this.setEndDate(end); + this.updateView(); + } + } + + }, + + formInputsKeydown: function(e) { + // This function ensures that if the 'enter' key was pressed in the input, then the calendars + // are updated with the startDate and endDate. + // This behaviour is automatic in Chrome/Firefox/Edge but not in IE 11 hence why this exists. + // Other browsers and versions of IE are untested and the behaviour is unknown. + if (e.keyCode === 13) { + // Prevent the calendar from being updated twice on Chrome/Firefox/Edge + e.preventDefault(); + this.formInputsChanged(e); + } + }, + + + elementChanged: function() { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.locale.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.locale.format); + end = moment(dateString[1], this.locale.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.locale.format); + end = start; + } + + if (!start.isValid() || !end.isValid()) return; + + this.setStartDate(start); + this.setEndDate(end); + this.updateView(); + }, + + keydown: function(e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } + }, + + updateElement: function() { + if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.element.trigger('change'); + } else if (this.element.is('input') && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format)); + this.element.trigger('change'); + } + }, + + remove: function() { + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData(); + } + + }; + + $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); + this.each(function() { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); + }); + return this; + }; + + return DateRangePicker; + +})); diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css new file mode 100644 index 000000000..5b96335ff --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-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-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{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;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}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}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;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,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;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);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;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);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>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>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.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-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;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.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;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>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.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}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css.map b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css.map new file mode 100644 index 000000000..0ae3de508 --- /dev/null +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","dist/css/bootstrap.css","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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A,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,EFCJ,yBCzEC,Ub2zDC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcnxDI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFUJ,yBClFC,Ubo+DC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,Uc57DI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFmBJ,0BC3FC,Ub6oEC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcrmEI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GCjEJ,MACE,iBAAA,YADF,uBAQI,SAAA,OACA,QAAA,aACA,MAAA,KAKA,sBf+xEJ,sBe9xEM,SAAA,OACA,QAAA,WACA,MAAA,KAKN,QACE,YAAA,IACA,eAAA,IACA,MAAA,KACA,WAAA,KAGF,GACE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","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n -moz-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n -o-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","// stylelint-disable value-list-comma-newline-after, value-list-comma-space-after, indentation, declaration-colon-newline-after, font-family-no-missing-generic-family-keyword\n\n//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"@{icon-font-path}@{icon-font-name}.eot\");\n src: url(\"@{icon-font-path}@{icon-font-name}.eot?#iefix\") format(\"embedded-opentype\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff2\") format(\"woff2\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff\") format(\"woff\"),\n url(\"@{icon-font-path}@{icon-font-name}.ttf\") format(\"truetype\"),\n url(\"@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}\") format(\"svg\");\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because