├── .gitignore
├── README.md
├── pom.xml
└── src
├── main
├── java
│ └── com
│ │ └── zrk
│ │ └── demo
│ │ ├── SpringBootShiroOauthclientDemoApplication.java
│ │ ├── config
│ │ └── SpringShiroAutoconfig.java
│ │ ├── entity
│ │ └── Customer.java
│ │ ├── repository
│ │ └── CustomerRepository.java
│ │ ├── shiro
│ │ ├── ShiroConfig.java
│ │ ├── ShiroDbAndClientRealm.java
│ │ └── ShiroUser.java
│ │ ├── utils
│ │ └── JsonUtils.java
│ │ └── web
│ │ ├── LoginController.java
│ │ ├── LogoutController.java
│ │ └── SysErrorController.java
└── resources
│ ├── application.properties
│ ├── init.sql
│ ├── static
│ ├── css
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.css.map
│ │ ├── bootstrap-theme.min.css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ └── bootstrap.min.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ └── glyphicons-halflings-regular.woff
│ └── js
│ │ ├── bootstrap.js
│ │ ├── bootstrap.min.js
│ │ └── npm.js
│ └── templates
│ ├── 404.html
│ ├── index.html
│ └── login.html
└── test
└── java
└── com
└── zrk
└── demo
└── SpringBootShiroOauthclientDemoApplicationTests.java
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | workspace.xml
3 | target
4 | *.iml
5 | logs
6 | dependency-reduced-pom.xml
7 | .classpath
8 | .project
9 | .settings
10 | .mvn
11 | mvnw
12 | mvnw.cmd
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # spring-boot-shiro-oauthclient-demo
2 | spring boot 环境下集成shiro及qq、微信、微博登陆
3 |
4 | 博客:http://blog.csdn.net/zrk1000/article/details/51612187
5 | 引用oauthclient:https://github.com/zrk1000/oauthclient
6 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.zrk
7 | demo
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | spring-boot-shiro-oauthclient-demo
12 | spring boot starter shiro-oauthclient-demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.4.2.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-data-jpa
31 |
32 |
33 | org.springframework.boot
34 | spring-boot-starter-thymeleaf
35 |
36 |
37 | org.springframework.boot
38 | spring-boot-starter-web
39 |
40 |
41 |
42 | org.springframework.boot
43 | spring-boot-devtools
44 | runtime
45 |
46 |
47 | com.h2database
48 | h2
49 | runtime
50 |
51 |
52 | org.springframework.boot
53 | spring-boot-starter-test
54 | test
55 |
56 |
57 | com.zrk
58 | oauthclient
59 | 0.0.1-SNAPSHOT
60 |
61 |
62 | org.apache.shiro
63 | shiro-spring
64 | 1.2.3
65 |
66 |
67 | org.springframework.boot
68 | spring-boot-configuration-processor
69 |
70 |
71 |
72 |
73 |
74 |
75 | org.springframework.boot
76 | spring-boot-maven-plugin
77 |
78 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/SpringBootShiroOauthclientDemoApplication.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.context.ConfigurableApplicationContext;
6 |
7 | import com.zrk.demo.entity.Customer;
8 | import com.zrk.demo.repository.CustomerRepository;
9 |
10 | @SpringBootApplication
11 | public class SpringBootShiroOauthclientDemoApplication {
12 |
13 | public static void main(String[] args) {
14 | ConfigurableApplicationContext context = SpringApplication.run(SpringBootShiroOauthclientDemoApplication.class, args);
15 | CustomerRepository customerRepository = context.getBean(CustomerRepository.class);
16 | // 内存数据库操作
17 | Customer customer = new Customer();
18 | customer.setUsername("admin");
19 | customer.setPwd("admin");
20 | customer.setNickName("zrk1000");
21 | customer.setTel("18888888888");
22 | customer.setEmail("zrk1000@163.com");
23 | customer.setHeadImg("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=266158537,114847377&fm=116&gp=0.jpg");
24 | customer.setUseable(true);
25 | customerRepository.save(customer);
26 | customerRepository.findAll().stream().forEach(System.out::println);
27 |
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/config/SpringShiroAutoconfig.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.config;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | import org.springframework.boot.context.properties.ConfigurationProperties;
7 |
8 | /**
9 | * shiro 配置信息
10 | * @author zrk
11 | * @date 2016年5月10日 下午5:50:38
12 | */
13 | @ConfigurationProperties(prefix = "spring.shiro")
14 | public class SpringShiroAutoconfig {
15 |
16 | List filter = new ArrayList();
17 |
18 |
19 | private String loginUrl;
20 | private String successUrl;
21 | private String unauthorizedUrl;
22 |
23 | private String qqKey;
24 | private String qqSecret;
25 |
26 | private String WeixinKey;
27 | private String WeixinSecret;
28 |
29 | private String weiboKey;
30 | private String weiboSecret;
31 |
32 | private String oauthCallback;
33 |
34 | public String getLoginUrl() {
35 | return loginUrl;
36 | }
37 |
38 | public void setLoginUrl(String loginUrl) {
39 | this.loginUrl = loginUrl;
40 | }
41 |
42 | public String getSuccessUrl() {
43 | return successUrl;
44 | }
45 |
46 | public void setSuccessUrl(String successUrl) {
47 | this.successUrl = successUrl;
48 | }
49 |
50 | public String getUnauthorizedUrl() {
51 | return unauthorizedUrl;
52 | }
53 |
54 | public void setUnauthorizedUrl(String unauthorizedUrl) {
55 | this.unauthorizedUrl = unauthorizedUrl;
56 | }
57 |
58 | public String getQqKey() {
59 | return qqKey;
60 | }
61 |
62 | public void setQqKey(String qqKey) {
63 | this.qqKey = qqKey;
64 | }
65 |
66 | public String getQqSecret() {
67 | return qqSecret;
68 | }
69 |
70 | public void setQqSecret(String qqSecret) {
71 | this.qqSecret = qqSecret;
72 | }
73 |
74 | public String getWeixinKey() {
75 | return WeixinKey;
76 | }
77 |
78 | public void setWeixinKey(String weixinKey) {
79 | WeixinKey = weixinKey;
80 | }
81 |
82 | public String getWeixinSecret() {
83 | return WeixinSecret;
84 | }
85 |
86 | public void setWeixinSecret(String weixinSecret) {
87 | WeixinSecret = weixinSecret;
88 | }
89 |
90 | public String getWeiboKey() {
91 | return weiboKey;
92 | }
93 |
94 | public void setWeiboKey(String weiboKey) {
95 | this.weiboKey = weiboKey;
96 | }
97 |
98 | public String getWeiboSecret() {
99 | return weiboSecret;
100 | }
101 |
102 | public void setWeiboSecret(String weiboSecret) {
103 | this.weiboSecret = weiboSecret;
104 | }
105 |
106 | public String getOauthCallback() {
107 | return oauthCallback;
108 | }
109 |
110 | public void setOauthCallback(String oauthCallback) {
111 | this.oauthCallback = oauthCallback;
112 | }
113 |
114 | public List getFilter() {
115 | return filter;
116 | }
117 |
118 | public void setFilter(List filter) {
119 | this.filter = filter;
120 | }
121 |
122 |
123 | }
124 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/entity/Customer.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.entity;
2 |
3 | import java.io.Serializable;
4 |
5 | import javax.persistence.Column;
6 | import javax.persistence.Entity;
7 | import javax.persistence.GeneratedValue;
8 | import javax.persistence.GenerationType;
9 | import javax.persistence.Id;
10 | import javax.persistence.Table;
11 |
12 | @Entity
13 | @Table(name="u_customer")
14 | public class Customer implements Serializable{
15 |
16 | private static final long serialVersionUID = 1L;
17 |
18 | @Id
19 | @GeneratedValue(strategy = GenerationType.AUTO)
20 | @Column(name = "id")
21 | protected Long id;
22 |
23 | @Column(length=15)
24 | private String tel; //手机号
25 |
26 | @Column(length=50)
27 | private String email; //电子邮箱
28 |
29 | @Column(length=30)
30 | private String username; //用户名
31 |
32 | @Column(length=50)
33 | private String pwd; //密码
34 |
35 | @Column(length=30)
36 | private String nickName; //昵称
37 |
38 | @Column(length=200)
39 | private String headImg; //用户头像
40 |
41 | private String sinaOpenid; //新浪微博openid
42 |
43 | private String qqOpenid; //qq openid
44 |
45 | private String weixinOpenid; //微信 openid
46 |
47 | private Boolean useable; //是否
48 |
49 |
50 | public String getUsername() {
51 | return username;
52 | }
53 |
54 | public void setUsername(String username) {
55 | this.username = username;
56 | }
57 |
58 | public String getPwd() {
59 | return pwd;
60 | }
61 |
62 | public void setPwd(String pwd) {
63 | this.pwd = pwd;
64 | }
65 |
66 | public String getNickName() {
67 | return nickName;
68 | }
69 |
70 | public void setNickName(String nickName) {
71 | this.nickName = nickName;
72 | }
73 |
74 | public String getHeadImg() {
75 | return headImg;
76 | }
77 |
78 | public void setHeadImg(String headImg) {
79 | this.headImg = headImg;
80 | }
81 |
82 | public String getSinaOpenid() {
83 | return sinaOpenid;
84 | }
85 |
86 | public void setSinaOpenid(String sinaOpenid) {
87 | this.sinaOpenid = sinaOpenid;
88 | }
89 |
90 | public String getQqOpenid() {
91 | return qqOpenid;
92 | }
93 |
94 | public void setQqOpenid(String qqOpenid) {
95 | this.qqOpenid = qqOpenid;
96 | }
97 |
98 | public String getWeixinOpenid() {
99 | return weixinOpenid;
100 | }
101 |
102 | public void setWeixinOpenid(String weixinOpenid) {
103 | this.weixinOpenid = weixinOpenid;
104 | }
105 |
106 | public Long getId() {
107 | return id;
108 | }
109 |
110 | public void setId(Long id) {
111 | this.id = id;
112 | }
113 |
114 | public String getTel() {
115 | return tel;
116 | }
117 |
118 | public void setTel(String tel) {
119 | this.tel = tel;
120 | }
121 |
122 | public Boolean getUseable() {
123 | return useable;
124 | }
125 |
126 | public void setUseable(Boolean useable) {
127 | this.useable = useable;
128 | }
129 |
130 | public String getEmail() {
131 | return email;
132 | }
133 |
134 | public void setEmail(String email) {
135 | this.email = email;
136 | }
137 |
138 | @Override
139 | public String toString() {
140 | return "Customer [id=" + id + ", tel=" + tel + ", email=" + email + ", username=" + username + ", pwd=" + pwd
141 | + ", nickName=" + nickName + ", headImg=" + headImg + ", sinaOpenid=" + sinaOpenid + ", qqOpenid="
142 | + qqOpenid + ", weixinOpenid=" + weixinOpenid + ", useable=" + useable + "]";
143 | }
144 |
145 |
146 |
147 | }
148 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/repository/CustomerRepository.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.repository;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 | import org.springframework.stereotype.Repository;
5 |
6 | import com.zrk.demo.entity.Customer;
7 |
8 | @Repository
9 | public interface CustomerRepository extends JpaRepository {
10 |
11 | Customer findTopByUsernameAndUseable(String username,boolean useable);
12 |
13 | Customer findTopByQqOpenidAndUseable(String openid, boolean useable);
14 |
15 | Customer findTopBySinaOpenidAndUseable(String openid, boolean useable);
16 |
17 | Customer findTopByWeixinOpenidAndUseable(String openid, boolean useable);
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/shiro/ShiroConfig.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.shiro;
2 |
3 | import java.util.LinkedHashMap;
4 | import java.util.Map;
5 |
6 | import javax.servlet.Filter;
7 |
8 | import org.apache.shiro.cache.MemoryConstrainedCacheManager;
9 | import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
10 | import org.apache.shiro.session.mgt.eis.SessionDAO;
11 | import org.apache.shiro.spring.LifecycleBeanPostProcessor;
12 | import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
13 | import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
14 | import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
15 | import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
16 | import org.pac4j.core.client.Clients;
17 | import org.pac4j.core.config.Config;
18 | import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
19 | import org.springframework.context.annotation.Bean;
20 | import org.springframework.context.annotation.Configuration;
21 | import org.springframework.context.annotation.DependsOn;
22 |
23 | import com.zrk.demo.config.SpringShiroAutoconfig;
24 | import com.zrk.oauthclient.client.QqClient;
25 | import com.zrk.oauthclient.client.SinaWeiboClient;
26 | import com.zrk.oauthclient.client.WeiXinClient;
27 | import com.zrk.oauthclient.shiro.support.ClientFilter;
28 |
29 | /**
30 | * shiro配置
31 | * @author zrk
32 | * @date 2016年5月10日 下午5:49:43
33 | */
34 | @Configuration
35 | public class ShiroConfig {
36 |
37 | //注入自定义shiro、oauthclient配置
38 | @Bean
39 | public SpringShiroAutoconfig getShiroConfig(){
40 | return new SpringShiroAutoconfig();
41 | }
42 |
43 | //第三方登录client配置
44 | @Bean
45 | public Clients getClients(){
46 | SpringShiroAutoconfig config = getShiroConfig();
47 | QqClient qqClient = new QqClient(config.getQqKey(),config.getQqSecret());
48 | WeiXinClient weiXinClient = new WeiXinClient(config.getWeixinKey(),config.getWeixinSecret());
49 | SinaWeiboClient sinaWeiboClient = new SinaWeiboClient(config.getWeiboKey(),config.getWeiboSecret());
50 | Clients clients = new Clients(config.getOauthCallback(),qqClient,weiXinClient,sinaWeiboClient);
51 | return clients;
52 | }
53 |
54 | @Bean
55 | public Config getConfig(){
56 | Config config = new Config(getClients());
57 | return config;
58 | }
59 |
60 | //扩展的Realm
61 | @Bean(name = "shiroDbAndClientRealm")
62 | public ShiroDbAndClientRealm getShiroDbAndClientRealm(){
63 | ShiroDbAndClientRealm realm = new ShiroDbAndClientRealm();
64 | realm.setClients(getClients());
65 | return realm;
66 | }
67 |
68 | @Bean(name="lifecycleBeanPostProcessor")
69 | public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
70 | return new LifecycleBeanPostProcessor();
71 | }
72 |
73 | @Bean
74 | @DependsOn("lifecycleBeanPostProcessor")
75 | public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
76 | DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
77 | daap.setProxyTargetClass(true);
78 | return daap;
79 | }
80 | /**************session缓存redis共享实现****************/
81 | /*
82 | * 1、需要添加shiro-redis包
83 | *
84 | org.crazycake
85 | shiro-redis
86 | 2.4.2.1-RELEASE
87 |
88 | * 2、application.properties中配置redis
89 | * #session cache ; unit: expire -> second , timeout -> millisecond ;7200s = 2 hour
90 | redis.manager.host=192.168.10.7
91 | redis.manager.port=6379
92 | redis.manager.expire=7200
93 | redis.manager.timeout=10000
94 | * 3、替换本类中内存版实现为redis实现
95 | *
96 | */
97 | // @Bean(name="redisManager")
98 | // @ConfigurationProperties(prefix = "redis.manager")
99 | // public RedisManager getRedisManager() {
100 | // RedisManager redisManager = new RedisManager();
101 | // return redisManager;
102 | // }
103 | // @Bean(name="redisCacheManager")
104 | // public RedisCacheManager getRedisCacheManager() {
105 | // RedisCacheManager redisCacheManager = new RedisCacheManager();
106 | // redisCacheManager.setRedisManager(getRedisManager());
107 | // return redisCacheManager;
108 | // }
109 | // @Bean(name="redisSessionDAO")
110 | // public RedisSessionDAO getRedisSessionDAO() {
111 | // RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
112 | // redisSessionDAO.setRedisManager(getRedisManager());
113 | // return redisSessionDAO;
114 | // }
115 | /******************************/
116 |
117 | /**************session缓存内存版实现****************/
118 | @Bean(name="memoryCacheManager")
119 | public MemoryConstrainedCacheManager getMemoryCacheManager() {
120 | return new MemoryConstrainedCacheManager();
121 | }
122 | @Bean(name="sessionDAO")
123 | public SessionDAO getSessionDAO() {
124 | return new MemorySessionDAO();
125 | }
126 | /******************************/
127 |
128 | @Bean(name="sessionManager")
129 | public DefaultWebSessionManager getDefaultWebSessionManager() {
130 | DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
131 | sessionManager.setSessionValidationSchedulerEnabled(true);
132 | // sessionManager.setSessionDAO(getRedisSessionDAO());
133 | // sessionManager.setGlobalSessionTimeout(getRedisManager().getTimeout()*1000);
134 | sessionManager.setSessionDAO(getSessionDAO());
135 | sessionManager.setGlobalSessionTimeout(30 * 60 * 1000);
136 | sessionManager.setSessionValidationSchedulerEnabled(true);
137 | sessionManager.setCacheManager(getMemoryCacheManager());
138 |
139 | return sessionManager;
140 | }
141 |
142 |
143 |
144 | @Bean(name = "securityManager")
145 | public DefaultWebSecurityManager defaultWebSecurityManager() {
146 | DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
147 | securityManager.setRealm(getShiroDbAndClientRealm());
148 | // securityManager.setCacheManager(getRedisCacheManager());
149 | securityManager.setCacheManager(getMemoryCacheManager());
150 | securityManager.setSessionManager(getDefaultWebSessionManager());
151 |
152 | return securityManager;
153 | }
154 |
155 | @Bean
156 | public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
157 | AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
158 | advisor.setSecurityManager(defaultWebSecurityManager());
159 | return advisor;
160 | }
161 |
162 | //shiro过滤器
163 | @Bean(name="shiroFilter")
164 | public ShiroFilterFactoryBean shiroFilterFactoryBean() {
165 | SpringShiroAutoconfig config = getShiroConfig();
166 | ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
167 | shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager());
168 | //第三方登陆回调过滤器
169 | ClientFilter clientFilter = new ClientFilter();
170 | clientFilter.setClients(getClients());//
171 | clientFilter.setRedirectAfterSuccessfulAuthentication(true);
172 | Map filterMap = new LinkedHashMap();
173 | //定义第三方回调过滤器
174 | filterMap.put("client", clientFilter);
175 | Map filterChainMap = new LinkedHashMap();
176 | for (String path : config.getFilter()){
177 | if(path!=null&&!"".equals(path)){
178 | String[] kv = path.split("=");
179 | filterChainMap.put(kv[0].trim(), kv[1].trim());
180 | }
181 | }
182 | shiroFilterFactoryBean.setFilters(filterMap);
183 | shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
184 | shiroFilterFactoryBean.setLoginUrl(config.getLoginUrl());
185 | shiroFilterFactoryBean.setSuccessUrl(config.getSuccessUrl());
186 | shiroFilterFactoryBean.setUnauthorizedUrl(config.getUnauthorizedUrl());
187 | return shiroFilterFactoryBean;
188 | }
189 |
190 | }
191 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/shiro/ShiroDbAndClientRealm.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.shiro;
2 |
3 | import org.apache.shiro.authc.AuthenticationInfo;
4 | import org.apache.shiro.authc.AuthenticationToken;
5 | import org.apache.shiro.authc.SimpleAuthenticationInfo;
6 | import org.apache.shiro.authc.UnknownAccountException;
7 | import org.pac4j.core.credentials.Credentials;
8 | import org.pac4j.core.profile.CommonProfile;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 |
11 | import com.zrk.demo.entity.Customer;
12 | import com.zrk.demo.repository.CustomerRepository;
13 | import com.zrk.demo.utils.JsonUtils;
14 | import com.zrk.oauthclient.profile.ClientProfile;
15 | import com.zrk.oauthclient.profile.QqProfile;
16 | import com.zrk.oauthclient.profile.SinaWeiboProfile;
17 | import com.zrk.oauthclient.profile.WeiXinProfile;
18 | import com.zrk.oauthclient.shiro.support.UsernamePasswordAndClientRealm;
19 | import com.zrk.oauthclient.shiro.support.UsernamePasswordAndClientToken;
20 |
21 |
22 | /**
23 | * ShiroDbAndClientRealm 支持 第三方登录回调拦登录 及 用户名密码登录
24 | * @author zrk
25 | * @date 2016年11月21日 下午3:59:21
26 | */
27 | public class ShiroDbAndClientRealm extends UsernamePasswordAndClientRealm{
28 |
29 | @Autowired
30 | private CustomerRepository customerRepository;
31 |
32 | //用户名密码登录认证
33 | @Override
34 | protected AuthenticationInfo internalUsernamePasswordGetAuthenticationInfo( AuthenticationToken authenticationToken) {
35 | UsernamePasswordAndClientToken token = (UsernamePasswordAndClientToken) authenticationToken;
36 | String username = token.getUsername();
37 | Customer customer = customerRepository.findTopByUsernameAndUseable(username, true);
38 | if (customer!=null) {
39 | ShiroUser shiroUser = new ShiroUser();
40 | shiroUser.setId(customer.getId());
41 | shiroUser.setEmail(customer.getEmail());
42 | shiroUser.setHeadImg(customer.getHeadImg());
43 | shiroUser.setNickName(customer.getNickName());
44 | shiroUser.setTel(customer.getTel());
45 | return new SimpleAuthenticationInfo(JsonUtils.objectToJson(shiroUser),customer.getPwd(),customer.getTel());
46 | } else {
47 | throw new UnknownAccountException(); //用户不存在
48 | }
49 | }
50 |
51 | //第三方登录认证数据再处理
52 | @Override
53 | protected AuthenticationInfo internalClientGetAuthenticationInfo( CommonProfile profile, Credentials credentials) {
54 | ClientProfile clientProfile = (ClientProfile)profile;
55 | Customer customer = null;
56 | if(clientProfile instanceof QqProfile){
57 | customer = customerRepository.findTopByQqOpenidAndUseable(clientProfile.getOpenid(), true);
58 | }else if(clientProfile instanceof WeiXinProfile){
59 | customer = customerRepository.findTopByWeixinOpenidAndUseable(clientProfile.getOpenid(), true);
60 | }else if(clientProfile instanceof SinaWeiboProfile){
61 | customer = customerRepository.findTopBySinaOpenidAndUseable(clientProfile.getOpenid(), true);
62 | }
63 | //第一次登陆
64 | if(customer == null){
65 | customer = new Customer();
66 | if(clientProfile instanceof QqProfile)
67 | customer.setQqOpenid(clientProfile.getOpenid());
68 | if(clientProfile instanceof WeiXinProfile)
69 | customer.setWeixinOpenid(clientProfile.getOpenid());
70 | if(clientProfile instanceof SinaWeiboProfile)
71 | customer.setSinaOpenid(clientProfile.getOpenid());
72 | customer.setHeadImg(clientProfile.getIcon());
73 | customer.setNickName(clientProfile.getNickname());
74 | customer = customerRepository.save(customer);
75 | }
76 |
77 | ShiroUser shiroUser = new ShiroUser();
78 | shiroUser.setId(customer.getId());
79 | shiroUser.setEmail(customer.getEmail());
80 | shiroUser.setHeadImg(customer.getHeadImg());
81 | shiroUser.setNickName(customer.getNickName());
82 | shiroUser.setTel(customer.getTel());
83 | return new SimpleAuthenticationInfo(JsonUtils.objectToJson(shiroUser), credentials,getName());
84 | }
85 |
86 |
87 | }
88 |
89 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/shiro/ShiroUser.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.shiro;
2 |
3 | import java.io.Serializable;
4 | /**
5 | * 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息.
6 | * @author zrk
7 | * @date 2016年5月8日 下午11:59:03
8 | */
9 | public class ShiroUser implements Serializable {
10 | private static final long serialVersionUID = 1L;
11 | public Long id;
12 | public String tel;
13 | public String username;
14 | public String nickName;
15 | public String headImg;
16 | private String email;
17 |
18 | public Long getId() {
19 | return id;
20 | }
21 |
22 | public void setId(Long id) {
23 | this.id = id;
24 | }
25 |
26 | public String getTel() {
27 | return tel;
28 | }
29 |
30 | public void setTel(String tel) {
31 | this.tel = tel;
32 | }
33 |
34 | public String getUsername() {
35 | return username;
36 | }
37 |
38 | public void setUsername(String username) {
39 | this.username = username;
40 | }
41 |
42 | public String getNickName() {
43 | return nickName;
44 | }
45 |
46 | public void setNickName(String nickName) {
47 | this.nickName = nickName;
48 | }
49 |
50 | public String getHeadImg() {
51 | return headImg;
52 | }
53 |
54 | public void setHeadImg(String headImg) {
55 | this.headImg = headImg;
56 | }
57 |
58 | public String getEmail() {
59 | return email;
60 | }
61 |
62 | public void setEmail(String email) {
63 | this.email = email;
64 | }
65 |
66 | @Override
67 | public String toString() {
68 | return "ShiroUser [id=" + id + ", tel=" + tel + ", nickName=" + nickName + ", headImg=" + headImg + ", email="
69 | + email + "]";
70 | }
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/utils/JsonUtils.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.utils;
2 |
3 | import java.util.List;
4 |
5 | import com.fasterxml.jackson.core.JsonProcessingException;
6 | import com.fasterxml.jackson.databind.JavaType;
7 | import com.fasterxml.jackson.databind.ObjectMapper;
8 |
9 | /**
10 | * 淘淘商城自定义响应结构
11 | */
12 | public class JsonUtils {
13 |
14 | // 定义jackson对象
15 | private static final ObjectMapper MAPPER = new ObjectMapper();
16 |
17 | /**
18 | * 将对象转换成json字符串。
19 | * Title: pojoToJson
20 | * Description:
21 | * @param data
22 | * @return
23 | */
24 | public static String objectToJson(Object data) {
25 | try {
26 | String string = MAPPER.writeValueAsString(data);
27 | return string;
28 | } catch (JsonProcessingException e) {
29 | e.printStackTrace();
30 | }
31 | return null;
32 | }
33 |
34 | /**
35 | * 将json结果集转化为对象
36 | *
37 | * @param jsonData json数据
38 | * @param clazz 对象中的object类型
39 | * @return
40 | */
41 | public static T jsonToPojo(String jsonData, Class beanType) {
42 | try {
43 | T t = MAPPER.readValue(jsonData, beanType);
44 | return t;
45 | } catch (Exception e) {
46 | e.printStackTrace();
47 | }
48 | return null;
49 | }
50 |
51 | /**
52 | * 将json数据转换成pojo对象list
53 | * Title: jsonToList
54 | * Description:
55 | * @param jsonData
56 | * @param beanType
57 | * @return
58 | */
59 | public static List jsonToList(String jsonData, Class beanType) {
60 | JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
61 | try {
62 | List list = MAPPER.readValue(jsonData, javaType);
63 | return list;
64 | } catch (Exception e) {
65 | e.printStackTrace();
66 | }
67 |
68 | return null;
69 | }
70 |
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/web/LoginController.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.web;
2 |
3 | import javax.servlet.http.HttpServletRequest;
4 |
5 | import org.apache.shiro.SecurityUtils;
6 | import org.apache.shiro.authc.AuthenticationException;
7 | import org.apache.shiro.authc.UnknownAccountException;
8 | import org.apache.shiro.subject.Subject;
9 | import org.apache.shiro.web.util.SavedRequest;
10 | import org.apache.shiro.web.util.WebUtils;
11 | import org.springframework.stereotype.Controller;
12 | import org.springframework.ui.Model;
13 | import org.springframework.web.bind.annotation.RequestMapping;
14 | import org.springframework.web.bind.annotation.RequestMethod;
15 | import org.springframework.web.bind.annotation.RequestParam;
16 |
17 | import com.zrk.oauthclient.shiro.support.UsernamePasswordAndClientToken;
18 |
19 | @Controller
20 | @RequestMapping("/")
21 | public class LoginController {
22 | @RequestMapping(value = "/login",method = RequestMethod.GET)
23 | public String loginGet(Model model) {
24 | return "login";
25 | }
26 |
27 | @RequestMapping(value="/login",method = RequestMethod.POST)
28 | public String login(HttpServletRequest request,Model model,@RequestParam(required=true,value="username")String username,@RequestParam(required=true,value="pwd")String pwd) {
29 | Subject subject = SecurityUtils.getSubject();
30 | //使用自定义Token
31 | UsernamePasswordAndClientToken token = new UsernamePasswordAndClientToken(username, pwd);
32 | // UsernamePasswordToken token = new UsernamePasswordToken(username,pwd);
33 | token.setRememberMe(false);
34 | try {
35 | subject.login(token);
36 | if (subject.isAuthenticated()){
37 | SavedRequest savedRequest = WebUtils.getSavedRequest(request);
38 | String url = savedRequest!=null?savedRequest.getRequestUrl():null;
39 | if(url!=null)
40 | return "redirect:"+url;
41 | return "redirect:/";
42 | }
43 | } catch (UnknownAccountException e) {// 此用户不存在,请注册后再登录
44 | token.clear();
45 | model.addAttribute("result", "此用户不存在,请注册后再登录");
46 | } catch (AuthenticationException e) {// http://jinnianshilongnian.iteye.com/blog/2019547 密码错误
47 | token.clear();
48 | model.addAttribute("result", "密码错误");
49 | }
50 | return "login";
51 | }
52 |
53 | @RequestMapping(value = "/unauthorized", method = RequestMethod.GET)
54 | public String unauthorized() {
55 | return "unauthorized";
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/web/LogoutController.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.web;
2 |
3 | import org.apache.shiro.SecurityUtils;
4 | import org.springframework.stereotype.Controller;
5 | import org.springframework.web.bind.annotation.RequestMapping;
6 | import org.springframework.web.bind.annotation.RequestMethod;
7 |
8 | @Controller
9 | @RequestMapping("/logout")
10 | public class LogoutController {
11 |
12 | @RequestMapping(method = RequestMethod.GET)
13 | public String logout() {
14 | SecurityUtils.getSubject().logout();
15 | return "redirect:/index";
16 | }
17 |
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/zrk/demo/web/SysErrorController.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo.web;
2 |
3 | import org.springframework.boot.autoconfigure.web.ErrorController;
4 | import org.springframework.stereotype.Controller;
5 |
6 | @Controller
7 | public class SysErrorController implements ErrorController {
8 |
9 |
10 | private static final String ERROR_PATH = "error";
11 |
12 | @Override
13 | public String getErrorPath() {
14 | return ERROR_PATH;
15 | }
16 |
17 | public String handleError() {
18 | return "404";
19 | }
20 |
21 |
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.datasource.driver-class-name=org.h2.Driver
2 | spring.datasource.url=jdbc:h2:file:D:/h2/testdb
3 | spring.datasource.username=sa
4 | spring.datasource.password=
5 | spring.datasource.schema=init.sql
6 | spring.datasource.sql-script-encoding: utf-8
7 |
8 | spring.jpa.database=h2
9 | spring.jpa.show-sql=true
10 | #eg. validate | update | create | create-drop
11 | spring.jpa.hibernate.ddl-auto=update
12 | spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
13 |
14 | spring.thymeleaf.enabled=true
15 |
16 | #shiro
17 | spring.shiro.login-url=/login
18 | spring.shiro.success-url=/index
19 | spring.shiro.unauthorized-url=/index
20 | #shiro filter ,Use '\' newline ; /oauthclient/**=client Intercept the callback
21 | spring.shiro.filter=\
22 | /login=anon,\
23 | /logout=logout,\
24 | /oauthclient/**=client,\
25 | /**=user
26 |
27 | #session cache ; unit: expire -> second , timeout -> millisecond ;7200s = 2 hour
28 | #redis.manager.host=192.168.10.7
29 | #redis.manager.port=6379
30 | #redis.manager.expire=7200
31 | #redis.manager.timeout=10000
32 |
33 | # Change the configuration for yourself
34 | spring.shiro.oauth-callback=http://www.zrk1000.cn/oauthclient/callback
35 | spring.shiro.qq-key=
36 | spring.shiro.qq-secret=
37 |
38 | spring.shiro.weibo-key=
39 | spring.shiro.weibo-secret=
40 |
41 | spring.shiro.weixin-key=
42 | spring.shiro.weixin-secret=
--------------------------------------------------------------------------------
/src/main/resources/init.sql:
--------------------------------------------------------------------------------
1 | INSERT INTO (
2 | id,
3 | username,
4 | email,
5 | head_img,
6 | nick_name,
7 | tel,
8 | pwd,
9 | qq_openid,
10 | sina_openid,
11 | weixin_openid,
12 | useable
13 | )
14 | VALUES
15 | (
16 | 1,
17 | 'admin',
18 | 'zrk1000@163.com',
19 | 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=266158537,114847377&fm=116&gp=0.jpg',
20 | 'zrk1000',
21 | '18888888888',
22 | 'admin',
23 | NULL,
24 | NULL,
25 | NULL,
26 | 1
27 | )
--------------------------------------------------------------------------------
/src/main/resources/static/css/bootstrap-theme.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.0 (http://getbootstrap.com)
3 | * Copyright 2011-2014 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */
6 |
7 | .btn-default,
8 | .btn-primary,
9 | .btn-success,
10 | .btn-info,
11 | .btn-warning,
12 | .btn-danger {
13 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
14 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
15 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
16 | }
17 | .btn-default:active,
18 | .btn-primary:active,
19 | .btn-success:active,
20 | .btn-info:active,
21 | .btn-warning:active,
22 | .btn-danger:active,
23 | .btn-default.active,
24 | .btn-primary.active,
25 | .btn-success.active,
26 | .btn-info.active,
27 | .btn-warning.active,
28 | .btn-danger.active {
29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
31 | }
32 | .btn-default .badge,
33 | .btn-primary .badge,
34 | .btn-success .badge,
35 | .btn-info .badge,
36 | .btn-warning .badge,
37 | .btn-danger .badge {
38 | text-shadow: none;
39 | }
40 | .btn:active,
41 | .btn.active {
42 | background-image: none;
43 | }
44 | .btn-default {
45 | text-shadow: 0 1px 0 #fff;
46 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
47 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
48 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
49 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
50 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
51 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
52 | background-repeat: repeat-x;
53 | border-color: #dbdbdb;
54 | border-color: #ccc;
55 | }
56 | .btn-default:hover,
57 | .btn-default:focus {
58 | background-color: #e0e0e0;
59 | background-position: 0 -15px;
60 | }
61 | .btn-default:active,
62 | .btn-default.active {
63 | background-color: #e0e0e0;
64 | border-color: #dbdbdb;
65 | }
66 | .btn-default:disabled,
67 | .btn-default[disabled] {
68 | background-color: #e0e0e0;
69 | background-image: none;
70 | }
71 | .btn-primary {
72 | background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
73 | background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
74 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
75 | background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
76 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
77 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
78 | background-repeat: repeat-x;
79 | border-color: #2b669a;
80 | }
81 | .btn-primary:hover,
82 | .btn-primary:focus {
83 | background-color: #2d6ca2;
84 | background-position: 0 -15px;
85 | }
86 | .btn-primary:active,
87 | .btn-primary.active {
88 | background-color: #2d6ca2;
89 | border-color: #2b669a;
90 | }
91 | .btn-primary:disabled,
92 | .btn-primary[disabled] {
93 | background-color: #2d6ca2;
94 | background-image: none;
95 | }
96 | .btn-success {
97 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
98 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
99 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
100 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
101 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
102 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
103 | background-repeat: repeat-x;
104 | border-color: #3e8f3e;
105 | }
106 | .btn-success:hover,
107 | .btn-success:focus {
108 | background-color: #419641;
109 | background-position: 0 -15px;
110 | }
111 | .btn-success:active,
112 | .btn-success.active {
113 | background-color: #419641;
114 | border-color: #3e8f3e;
115 | }
116 | .btn-success:disabled,
117 | .btn-success[disabled] {
118 | background-color: #419641;
119 | background-image: none;
120 | }
121 | .btn-info {
122 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
123 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
124 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
125 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
126 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
127 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
128 | background-repeat: repeat-x;
129 | border-color: #28a4c9;
130 | }
131 | .btn-info:hover,
132 | .btn-info:focus {
133 | background-color: #2aabd2;
134 | background-position: 0 -15px;
135 | }
136 | .btn-info:active,
137 | .btn-info.active {
138 | background-color: #2aabd2;
139 | border-color: #28a4c9;
140 | }
141 | .btn-info:disabled,
142 | .btn-info[disabled] {
143 | background-color: #2aabd2;
144 | background-image: none;
145 | }
146 | .btn-warning {
147 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
148 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
149 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
150 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
151 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
152 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
153 | background-repeat: repeat-x;
154 | border-color: #e38d13;
155 | }
156 | .btn-warning:hover,
157 | .btn-warning:focus {
158 | background-color: #eb9316;
159 | background-position: 0 -15px;
160 | }
161 | .btn-warning:active,
162 | .btn-warning.active {
163 | background-color: #eb9316;
164 | border-color: #e38d13;
165 | }
166 | .btn-warning:disabled,
167 | .btn-warning[disabled] {
168 | background-color: #eb9316;
169 | background-image: none;
170 | }
171 | .btn-danger {
172 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
173 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
174 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
175 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
176 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
177 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
178 | background-repeat: repeat-x;
179 | border-color: #b92c28;
180 | }
181 | .btn-danger:hover,
182 | .btn-danger:focus {
183 | background-color: #c12e2a;
184 | background-position: 0 -15px;
185 | }
186 | .btn-danger:active,
187 | .btn-danger.active {
188 | background-color: #c12e2a;
189 | border-color: #b92c28;
190 | }
191 | .btn-danger:disabled,
192 | .btn-danger[disabled] {
193 | background-color: #c12e2a;
194 | background-image: none;
195 | }
196 | .thumbnail,
197 | .img-thumbnail {
198 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
199 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
200 | }
201 | .dropdown-menu > li > a:hover,
202 | .dropdown-menu > li > a:focus {
203 | background-color: #e8e8e8;
204 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
205 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
206 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
207 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
208 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
209 | background-repeat: repeat-x;
210 | }
211 | .dropdown-menu > .active > a,
212 | .dropdown-menu > .active > a:hover,
213 | .dropdown-menu > .active > a:focus {
214 | background-color: #357ebd;
215 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
216 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
217 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
218 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
219 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
220 | background-repeat: repeat-x;
221 | }
222 | .navbar-default {
223 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
224 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
225 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
226 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
227 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
228 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
229 | background-repeat: repeat-x;
230 | border-radius: 4px;
231 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
232 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
233 | }
234 | .navbar-default .navbar-nav > .open > a,
235 | .navbar-default .navbar-nav > .active > a {
236 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
237 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
238 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
239 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
240 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
241 | background-repeat: repeat-x;
242 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
243 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
244 | }
245 | .navbar-brand,
246 | .navbar-nav > li > a {
247 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
248 | }
249 | .navbar-inverse {
250 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
251 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
252 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
253 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
254 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
255 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
256 | background-repeat: repeat-x;
257 | }
258 | .navbar-inverse .navbar-nav > .open > a,
259 | .navbar-inverse .navbar-nav > .active > a {
260 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
261 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
262 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
263 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
264 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
265 | background-repeat: repeat-x;
266 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
267 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
268 | }
269 | .navbar-inverse .navbar-brand,
270 | .navbar-inverse .navbar-nav > li > a {
271 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
272 | }
273 | .navbar-static-top,
274 | .navbar-fixed-top,
275 | .navbar-fixed-bottom {
276 | border-radius: 0;
277 | }
278 | .alert {
279 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
280 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
281 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
282 | }
283 | .alert-success {
284 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
285 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
286 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
287 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
288 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
289 | background-repeat: repeat-x;
290 | border-color: #b2dba1;
291 | }
292 | .alert-info {
293 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
294 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
295 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
296 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
297 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
298 | background-repeat: repeat-x;
299 | border-color: #9acfea;
300 | }
301 | .alert-warning {
302 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
303 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
304 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
305 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
306 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
307 | background-repeat: repeat-x;
308 | border-color: #f5e79e;
309 | }
310 | .alert-danger {
311 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
312 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
313 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
314 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
315 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
316 | background-repeat: repeat-x;
317 | border-color: #dca7a7;
318 | }
319 | .progress {
320 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
321 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
322 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
323 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
324 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
325 | background-repeat: repeat-x;
326 | }
327 | .progress-bar {
328 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
329 | background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
330 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
331 | background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
332 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
333 | background-repeat: repeat-x;
334 | }
335 | .progress-bar-success {
336 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
337 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
338 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
339 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
340 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
341 | background-repeat: repeat-x;
342 | }
343 | .progress-bar-info {
344 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
345 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
346 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
347 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
348 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
349 | background-repeat: repeat-x;
350 | }
351 | .progress-bar-warning {
352 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
353 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
354 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
355 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
356 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
357 | background-repeat: repeat-x;
358 | }
359 | .progress-bar-danger {
360 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
361 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
362 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
363 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
364 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
365 | background-repeat: repeat-x;
366 | }
367 | .progress-bar-striped {
368 | 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);
369 | 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);
370 | 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);
371 | }
372 | .list-group {
373 | border-radius: 4px;
374 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
375 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
376 | }
377 | .list-group-item.active,
378 | .list-group-item.active:hover,
379 | .list-group-item.active:focus {
380 | text-shadow: 0 -1px 0 #3071a9;
381 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
382 | background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
383 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
384 | background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
385 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
386 | background-repeat: repeat-x;
387 | border-color: #3278b3;
388 | }
389 | .list-group-item.active .badge,
390 | .list-group-item.active:hover .badge,
391 | .list-group-item.active:focus .badge {
392 | text-shadow: none;
393 | }
394 | .panel {
395 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
396 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
397 | }
398 | .panel-default > .panel-heading {
399 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
400 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
401 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
402 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
403 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
404 | background-repeat: repeat-x;
405 | }
406 | .panel-primary > .panel-heading {
407 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
408 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
409 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
410 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
411 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
412 | background-repeat: repeat-x;
413 | }
414 | .panel-success > .panel-heading {
415 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
416 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
417 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
418 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
419 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
420 | background-repeat: repeat-x;
421 | }
422 | .panel-info > .panel-heading {
423 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
424 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
425 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
426 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
427 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
428 | background-repeat: repeat-x;
429 | }
430 | .panel-warning > .panel-heading {
431 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
432 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
433 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
434 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
435 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
436 | background-repeat: repeat-x;
437 | }
438 | .panel-danger > .panel-heading {
439 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
440 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
441 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
442 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
443 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
444 | background-repeat: repeat-x;
445 | }
446 | .well {
447 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
448 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
449 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
450 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
451 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
452 | background-repeat: repeat-x;
453 | border-color: #dcdcdc;
454 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
455 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
456 | }
457 | /*# sourceMappingURL=bootstrap-theme.css.map */
458 |
--------------------------------------------------------------------------------
/src/main/resources/static/css/bootstrap-theme.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAcA;;;;;;EAME,0CAAA;ECgDA,6FAAA;EACQ,qFAAA;EC5DT;AFgBC;;;;;;;;;;;;EC2CA,0DAAA;EACQ,kDAAA;EC7CT;AFVD;;;;;;EAiBI,mBAAA;EECH;AFgCC;;EAEE,wBAAA;EE9BH;AFmCD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EExBvE;AFLC;;EAEE,2BAAA;EACA,8BAAA;EEOH;AFJC;;EAEE,2BAAA;EACA,uBAAA;EEMH;AFHC;;EAEE,2BAAA;EACA,wBAAA;EEKH;AFUD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+BD;AF7BC;;EAEE,2BAAA;EACA,8BAAA;EE+BH;AF5BC;;EAEE,2BAAA;EACA,uBAAA;EE8BH;AF3BC;;EAEE,2BAAA;EACA,wBAAA;EE6BH;AFbD;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEuDD;AFrDC;;EAEE,2BAAA;EACA,8BAAA;EEuDH;AFpDC;;EAEE,2BAAA;EACA,uBAAA;EEsDH;AFnDC;;EAEE,2BAAA;EACA,wBAAA;EEqDH;AFpCD;EGrDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+ED;AF7EC;;EAEE,2BAAA;EACA,8BAAA;EE+EH;AF5EC;;EAEE,2BAAA;EACA,uBAAA;EE8EH;AF3EC;;EAEE,2BAAA;EACA,wBAAA;EE6EH;AF3DD;EGtDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEuGD;AFrGC;;EAEE,2BAAA;EACA,8BAAA;EEuGH;AFpGC;;EAEE,2BAAA;EACA,uBAAA;EEsGH;AFnGC;;EAEE,2BAAA;EACA,wBAAA;EEqGH;AFlFD;EGvDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+HD;AF7HC;;EAEE,2BAAA;EACA,8BAAA;EE+HH;AF5HC;;EAEE,2BAAA;EACA,uBAAA;EE8HH;AF3HC;;EAEE,2BAAA;EACA,wBAAA;EE6HH;AFnGD;;ECfE,oDAAA;EACQ,4CAAA;ECsHT;AF9FD;;EGxEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHuEF,2BAAA;EEoGD;AFlGD;;;EG7EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH6EF,2BAAA;EEwGD;AF/FD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;ECoJT;AF1GD;;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;EC8JT;AFvGD;;EAEE,gDAAA;EEyGD;AFrGD;EG7GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFyOD;AF7GD;;EG7GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;ECoLT;AFvHD;;EAYI,2CAAA;EE+GH;AF1GD;;;EAGE,kBAAA;EE4GD;AFnGD;EACE,+CAAA;EC5FA,4FAAA;EACQ,oFAAA;ECkMT;AF3FD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EEuGD;AFlGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EE+GD;AFzGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EEuHD;AFhHD;EG1JI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EE+HD;AFhHD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqRH;AF7GD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4RH;AFnHD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmSH;AFzHD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0SH;AF/HD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiTH;AFrID;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDwTH;AFxID;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;ED8RH;AFpID;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;ECsRT;AFrID;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EE2ID;AFhJD;;;EAQI,mBAAA;EE6IH;AFnID;ECpKE,mDAAA;EACQ,2CAAA;EC0ST;AF7HD;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED6VH;AFnID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDoWH;AFzID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2WH;AF/ID;EGhOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkXH;AFrJD;EGjOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyXH;AF3JD;EGlOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgYH;AF3JD;EGzOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHuOF,uBAAA;EC5LA,2FAAA;EACQ,mFAAA;EC8VT","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\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 will be 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 word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // 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",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\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-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #2d6ca2;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #2d6ca2;\n border-color: #2b669a;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #2d6ca2;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n background-color: #357ebd;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\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}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #3071a9;\n background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n border-color: #3278b3;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
--------------------------------------------------------------------------------
/src/main/resources/static/css/bootstrap-theme.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.0 (http://getbootstrap.com)
3 | * Copyright 2011-2014 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
--------------------------------------------------------------------------------
/src/main/resources/static/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zrk1000/spring-boot-shiro-oauthclient-demo/a95e761d52a7361e540dbc6a20da5a0584aaea6f/src/main/resources/static/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/src/main/resources/static/fonts/glyphicons-halflings-regular.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zrk1000/spring-boot-shiro-oauthclient-demo/a95e761d52a7361e540dbc6a20da5a0584aaea6f/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/src/main/resources/static/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zrk1000/spring-boot-shiro-oauthclient-demo/a95e761d52a7361e540dbc6a20da5a0584aaea6f/src/main/resources/static/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/src/main/resources/static/js/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.0 (http://getbootstrap.com)
3 | * Copyright 2011-2014 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */
6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.0",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus","focus"==b.type)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.0",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.0",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.checkScrollbar=function(){this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){if(document.body.clientWidth>=window.innerWidth)return 0;var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.tooltip",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.0",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.popover",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.0",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)
7 | }(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=i?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
--------------------------------------------------------------------------------
/src/main/resources/static/js/npm.js:
--------------------------------------------------------------------------------
1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
2 | require('../../js/transition.js')
3 | require('../../js/alert.js')
4 | require('../../js/button.js')
5 | require('../../js/carousel.js')
6 | require('../../js/collapse.js')
7 | require('../../js/dropdown.js')
8 | require('../../js/modal.js')
9 | require('../../js/tooltip.js')
10 | require('../../js/popover.js')
11 | require('../../js/scrollspy.js')
12 | require('../../js/tab.js')
13 | require('../../js/affix.js')
--------------------------------------------------------------------------------
/src/main/resources/templates/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | shiro-oauthclient-demo
6 |
7 |
8 | 404
9 |
10 |
--------------------------------------------------------------------------------
/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | shiro-oauthclient-demo
6 |
7 |
8 | 主页
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/main/resources/templates/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | shiro-oauthclient-demo
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/test/java/com/zrk/demo/SpringBootShiroOauthclientDemoApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.zrk.demo;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class SpringBootShiroOauthclientDemoApplicationTests {
11 |
12 | // @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------