Commit bce817ef authored by 李良停's avatar 李良停

llt

parents
.class
.classpath
.project
.settings
/.idea/
*.jar
*.war
*.ear
*.iml
.idea_modules/
out/
build/
logs/
classes/
target/
.DS_Store
MANIFEST.MF
overlays/
sh-authcenter-agent/src/test/
sh-authcenter-log/src/test/
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>sh-ds</artifactId>
<groupId>com.chineseall.eden</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eden-authcenter-agent</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>com.chineseall.eden</groupId>
<artifactId>eden-authcenter-log</artifactId>
<version>${project.version}</version>
</dependency>
<!--因配置外部TOMCAT 而配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.chineseall.eden.authcenter.agent;
import cn.sh.chineseall.framework.starter.annotation.AlphaFrameworkApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@AlphaFrameworkApplication
@ComponentScan(basePackages = {"com.chineseall.eden.authcenter.agent","com.chineseall.eden.authcenter.log"})
public class EdenAuthcenterAgentApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(EdenAuthcenterAgentApplication.class);
}
public static void main(String[] args) {
cn.sh.chineseall.framework.springboot.bootstrap.application.AlphaFrameworkSpringApplication.run(EdenAuthcenterAgentApplication.class, args);
}
}
package com.chineseall.eden.authcenter.agent.client;
import com.chineseall.eden.authcenter.agent.oauth.OauthType;
import com.chineseall.eden.service.user.entities.AuthUserInfo;
import lombok.Data;
@Data
public class ClientDataInfo {
private AuthUserInfo authUserInfo;
private String returnUrl;
private OauthType oauthType;
}
package com.chineseall.eden.authcenter.agent.client;
import lombok.Data;
import java.io.Serializable;
/**
* Created by yuchunlin on 2019/5/28.
*/
@Data
public class ClientItem implements Serializable{
private String clientName;
private String clientId;
private String clientSecret;
private String loginSuccessUrl;
private String logoutSuccessUrl;
}
package com.chineseall.eden.authcenter.agent.client;
import lombok.Getter;
/**
* @author liuyp
*/
public enum ClientUserType {
Student("1001","学生"),
Teacher("2001","老师"),
Mentor("2002","老师");
@Getter
private final String code;
@Getter
private final String description;
ClientUserType(String code, String description) {
this.code = code;
this.description = description;
}
public static ClientUserType getValue(String name) {
try {
return ClientUserType.valueOf(name);
} catch (Exception ex) {
return null;
}
}
}
package com.chineseall.eden.authcenter.agent.client;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* Created by yuchunlin on 2019/5/28.
*/
@Data
@Component
@ConfigurationProperties(prefix = "oauthclient")
public class OauthClient {
private List<ClientItem> clients;
}
package com.chineseall.eden.authcenter.agent.controller;
import cn.sh.chineseall.framework.core.util.ArrayUtils;
import cn.sh.chineseall.framework.core.util.StringUtils;
import com.chineseall.eden.authcenter.agent.client.ClientDataInfo;
import com.chineseall.eden.authcenter.agent.client.ClientItem;
import com.chineseall.eden.authcenter.agent.client.OauthClient;
import com.chineseall.eden.authcenter.agent.oauth.OauthConfig;
import com.chineseall.eden.authcenter.agent.oauth.OauthConfigItem;
import com.chineseall.eden.authcenter.agent.oauth.OauthType;
import com.chineseall.eden.authcenter.agent.utils.ConvertMessageMapToBean;
import com.chineseall.eden.authcenter.log.enums.LogType;
import com.chineseall.eden.authcenter.log.model.AuthLog;
import com.chineseall.eden.authcenter.log.model.LogUserInfo;
import com.chineseall.eden.authcenter.log.service.AuthLogService;
import com.chineseall.eden.common.util.EncodeUtil;
import com.chineseall.eden.service.user.entities.AuthUserInfo;
import com.sh.chineseall.framework.core.http.resttemplate.MyRestTemplate;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
@Controller
@RequestMapping("auth")
public class AuthController {
Logger logger = Logger.getLogger(AuthController.class);
@Autowired
private OauthClient oauthClient;
@Autowired
private OauthConfig oauthConfig;
@Resource
private AuthLogService authLogService;
// @RequestMapping("index")
// public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.setViewName("index2");
// Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
// try {
// String clientId = request.getParameter("client_id");
// String returnUrl = request.getParameter("redirect_uri");
// ClientItem clientItem = clientItemMap.get(clientId);
// AuthLog authLog = new AuthLog();
// authLog.setLogType(LogType.login);
// if (null == clientItem) {
// modelAndView.setViewName("error");
// modelAndView.addObject("message", "client_id为空或者不正确");
// return modelAndView;
// }
// authLog.setClientId(clientId);
// authLog.setAuthSource(clientItem.getClientName());
// String sign = request.getParameter("sign");
// String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
//
// String md5Hex = EncodeUtil.md5(signOrigin);
// if (!Objects.equals(sign, md5Hex)) {
// modelAndView.setViewName("error");
// modelAndView.addObject("message", "请求不合法");
// return modelAndView;
// }
// if (StringUtils.isEmpty(returnUrl)) {
// modelAndView.setViewName("error");
// modelAndView.addObject("message", "登录成功回调地址为空");
// return modelAndView;
// }
// String loginType = request.getParameter("login_type");
// if(StringUtils.isNotEmpty(loginType) && OauthType.getValue(loginType)!=null) {
// OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(OauthType.getValue(loginType).getCode());
// authLog.setFowardUrl(oauthConfigItem.getOauthUrl());
// authLog.setOauthType(OauthType.getValue(loginType).getCode());
// // 阅览室日志分离
// ClientItem item = clientItemMap.get("readingroomClientId");
// authLog.setAuthSource(item.getClientName());
// authLogService.save(authLog);
// response.sendRedirect(generateLoginUrl(returnUrl, OauthType.getValue(loginType).getCode(), authLog.getId()));
// return null;
// } else {
// authLogService.save(authLog);
// String url1 = generateLoginUrl(returnUrl, OauthType.dianjiaoguan.getCode(), authLog.getId());
// modelAndView.addObject("loginUrl1", url1);
// String url2 = generateLoginUrl(returnUrl, OauthType.edenoperation.getCode(), authLog.getId());
// modelAndView.addObject("loginUrl2", url2);
// modelAndView.addObject("logId", authLog.getId());
// }
// } catch (Exception e) {
// e.printStackTrace();
// modelAndView.setViewName("error");
// modelAndView.addObject("message", "未知错误");
// }
// return modelAndView;
// }
@RequestMapping("index")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("ds");
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
try {
String clientId = request.getParameter("client_id");
String returnUrl = request.getParameter("redirect_uri");
ClientItem clientItem = clientItemMap.get(clientId);
AuthLog authLog = new AuthLog();
authLog.setLogType(LogType.login);
if (null == clientItem) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "client_id为空或者不正确");
return modelAndView;
}
authLog.setClientId(clientId);
authLog.setAuthSource(clientItem.getClientName());
String sign = request.getParameter("sign");
String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
String md5Hex = EncodeUtil.md5(signOrigin);
if (!Objects.equals(sign, md5Hex)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "请求不合法");
return modelAndView;
}
if (StringUtils.isEmpty(returnUrl)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "登录成功回调地址为空");
return modelAndView;
}
String loginType = request.getParameter("login_type");
if(StringUtils.isNotEmpty(loginType) && OauthType.getValue(loginType)!=null) {
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(OauthType.getValue(loginType).getCode());
authLog.setFowardUrl(oauthConfigItem.getOauthUrl());
authLog.setOauthType(OauthType.getValue(loginType).getCode());
// 阅览室日志分离
ClientItem item = clientItemMap.get("readingroomClientId");
authLog.setAuthSource(item.getClientName());
authLogService.save(authLog);
response.sendRedirect(generateLoginUrl(returnUrl, OauthType.getValue(loginType).getCode(), authLog.getId()));
return null;
} else {
authLogService.save(authLog);
String url1 = generateLoginUrl(returnUrl, OauthType.dianjiaoguan.getCode(), authLog.getId());
modelAndView.addObject("loginUrl1", url1);
String url2 = generateLoginUrl(returnUrl, OauthType.edenoperation.getCode(), authLog.getId());
modelAndView.addObject("loginUrl2", url2);
String url3 = generateSpLoginUrl(returnUrl, OauthType.qpjy.getCode(), authLog.getId());
modelAndView.addObject("loginUrl3", url3);
modelAndView.addObject("logId", authLog.getId());
}
} catch (Exception e) {
e.printStackTrace();
modelAndView.setViewName("error");
modelAndView.addObject("message", "未知错误");
}
return modelAndView;
}
@RequestMapping("tologin")
public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
String loginUrl = request.getParameter("loginUrl");
String logId = request.getParameter("logId");
String oauthType = request.getParameter("oauthType");
String browser = request.getParameter("browser");
String version = request.getParameter("version");
String device = request.getParameter("device");
String os = request.getParameter("os");
try {
AuthLog authLog = authLogService.getById(logId);
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(oauthType);
authLog.setFowardUrl(oauthConfigItem.getOauthUrl());
authLog.setOauthType(oauthType);
authLog.setBrowser(browser);
authLog.setVersion(version);
authLog.setDevice(device);
authLog.setOs(os);
authLogService.save(authLog);
response.sendRedirect(loginUrl);
return null;
} catch (Exception e) {
e.printStackTrace();
modelAndView.setViewName("error");
modelAndView.addObject("message", "跳转失败,请联系管理人员");
}
return modelAndView;
}
@RequestMapping("logout")
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("logout");
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
try {
String clientId = request.getParameter("client_id");
ClientItem clientItem = clientItemMap.get(clientId);
if (clientItem == null) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "client_id为空或者不正确");
return modelAndView;
}
String sign = request.getParameter("sign");
String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
String md5Hex = EncodeUtil.md5(signOrigin);
if (!Objects.equals(sign, md5Hex)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "请求不合法");
return modelAndView;
}
String service = request.getParameter("service");
if (StringUtils.isEmpty(service)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "登出成功回调地址为空");
return modelAndView;
}
String oauthType = request.getParameter("oauth_type");
if(StringUtils.isEmpty(oauthType)){
modelAndView.setViewName("error");
modelAndView.addObject("message", "登出方式为空");
return modelAndView;
}
OauthType type = OauthType.valueOf(oauthType);
if(type == null){
modelAndView.setViewName("error");
modelAndView.addObject("message", "登出方式错误");
return modelAndView;
}
AuthLog authLog = new AuthLog();
authLog.setOauthType(oauthType);
authLog.setReturnUrl(service);
authLog.setClientId(clientId);
authLog.setAuthSource(clientItem.getClientName());
authLog.setLogType(LogType.logout);
authLogService.save(authLog);
if(StringUtils.isNotEmpty(service))
response.sendRedirect(generateLogoutUrl(service, type.name()));
return null;
} catch (Exception e) {
e.printStackTrace();
modelAndView.setViewName("error");
modelAndView.addObject("message", "未知错误");
}
return modelAndView;
}
@RequestMapping(value = "loginsuccess", method = RequestMethod.GET)
public ModelAndView loginsuccess(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) {
modelAndView.setViewName("loginsuccess");
String code = request.getParameter("code");
String oauthType = request.getParameter("oauth_type");
String logId = request.getParameter("log_id");
String returnUrl = request.getParameter("return_url");
AuthLog authLog = authLogService.getById(logId);
if(authLog == null){
authLog = new AuthLog();
authLog.setOauthType(oauthType);
}
authLog.setLoginSuccessFlag(true);
authLog.setReturnUrl(returnUrl);
String url = generateAccessTokenUrl(code, oauthType);
try {
String exchange = MyRestTemplate.exchange(HttpMethod.GET, url, null, null, String.class);
logger.info("AccessTokenMethod......exchange........."+exchange);
Map<String, String> keyValueMap = new HashMap<>();
if (StringUtils.isNotEmpty(exchange)) {
String[] strings = exchange.split("&");
for (int i = 0; i < strings.length; i++) {
String temp = strings[i];
String[] keyValue = temp.split("=");
if (ArrayUtils.isNotEmpty(keyValue) && keyValue.length == 2) {
keyValueMap.put(keyValue[0], keyValue[1]);
}
}
}
String access_token = keyValueMap.get("access_token");
// 获取用户信息
if (StringUtils.isNotEmpty(access_token)) {
String userInfoUrl = generateUserInfoUrl(access_token, oauthType);
Map<String, Object> userInfoMap = MyRestTemplate.exchange(HttpMethod.GET, userInfoUrl, null, null, HashMap.class);
// 转换用户信息
AuthUserInfo userInfo = null;
if(oauthType.equals(OauthType.dianjiaoguan.toString()))
userInfo = ConvertMessageMapToBean.converDianjiaoguanData(userInfoMap);
else if(oauthType.equals(OauthType.edenoperation.toString()))
userInfo = ConvertMessageMapToBean.converEdenoperationData(userInfoMap);
// 封装下游数据
ClientDataInfo clientDataInfo = new ClientDataInfo();
if(userInfo != null) {
userInfo.setSource(oauthType);
// 封装日志用户信息
LogUserInfo logUserInfo = new LogUserInfo();
logUserInfo.setRealName(userInfo.getRealName());
logUserInfo.setUserId(userInfo.getId());
logUserInfo.setStudentCode(userInfo.getStudentCode());
logUserInfo.setTeacherTrainingNo(userInfo.getTeacherTrainingNo());
if(null != userInfo.getUserType()){
logUserInfo.setUserType(userInfo.getUserType().name());
}
if(StringUtils.isNotEmpty(userInfo.getStudentSchoolId())){
logUserInfo.setSchoolId(userInfo.getStudentSchoolId());
}
if(StringUtils.isNotEmpty(userInfo.getTeacherSchoolId())){
logUserInfo.setSchoolId(userInfo.getTeacherSchoolId());
}
if(StringUtils.isNotEmpty(userInfo.getStudentSchoolName())){
logUserInfo.setSchoolName(userInfo.getStudentSchoolName());
}
if(StringUtils.isNotEmpty(userInfo.getTeacherSchoolName())){
logUserInfo.setSchoolName(userInfo.getTeacherSchoolName());
}
authLog.setGetUserInfoSuccessFlag(true);
authLog.setUserInfoMap(userInfoMap);
authLog.setLogUserInfo(logUserInfo);
}
clientDataInfo.setAuthUserInfo(userInfo);
clientDataInfo.setOauthType(OauthType.valueOf(oauthType));
modelAndView.addObject("clientDataInfo", clientDataInfo);
modelAndView.addObject("successPostUrl", returnUrl);
}
} catch (Exception e) {
e.printStackTrace();
authLog.setGetUserInfoSuccessFlag(false);
modelAndView.setViewName("error");
modelAndView.addObject("message", "登录失败");
}
authLogService.save(authLog);
return modelAndView;
}
@RequestMapping(value = "idp/loginsuccess")
public ModelAndView idploginsuccess(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) {
modelAndView.setViewName("loginsuccess");
String code = request.getParameter("code");
String oauthType = request.getParameter("oauth_type");
String logId = request.getParameter("log_id");
String returnUrl = request.getParameter("return_url");
AuthLog authLog = authLogService.getById(logId);
if(authLog == null){
authLog = new AuthLog();
authLog.setOauthType(oauthType);
}
authLog.setLoginSuccessFlag(true);
authLog.setReturnUrl(returnUrl);
try {
Map<String, Object> userInfoMap = null;
// 转换用户信息
AuthUserInfo userInfo = new AuthUserInfo();
String userType = request.getParameter("user_type");
userInfo.setRealName(request.getParameter("real_name"));
userInfo.setId(request.getParameter("login_name"));
// 封装下游数据
ClientDataInfo clientDataInfo = new ClientDataInfo();
if(userInfo != null) {
userInfo.setSource(oauthType);
// 封装日志用户信息
LogUserInfo logUserInfo = new LogUserInfo();
logUserInfo.setRealName(userInfo.getRealName());
logUserInfo.setUserId(userInfo.getId());
logUserInfo.setStudentCode(userInfo.getStudentCode());
logUserInfo.setTeacherTrainingNo(userInfo.getTeacherTrainingNo());
if(null != userInfo.getUserType()){
logUserInfo.setUserType(userInfo.getUserType().name());
}
if(StringUtils.isNotEmpty(userInfo.getStudentSchoolId())){
logUserInfo.setSchoolId(userInfo.getStudentSchoolId());
}
if(StringUtils.isNotEmpty(userInfo.getTeacherSchoolId())){
logUserInfo.setSchoolId(userInfo.getTeacherSchoolId());
}
if(StringUtils.isNotEmpty(userInfo.getStudentSchoolName())){
logUserInfo.setSchoolName(userInfo.getStudentSchoolName());
}
if(StringUtils.isNotEmpty(userInfo.getTeacherSchoolName())){
logUserInfo.setSchoolName(userInfo.getTeacherSchoolName());
}
authLog.setGetUserInfoSuccessFlag(true);
authLog.setUserInfoMap(userInfoMap);
authLog.setLogUserInfo(logUserInfo);
}
clientDataInfo.setAuthUserInfo(userInfo);
clientDataInfo.setOauthType(OauthType.valueOf(oauthType));
modelAndView.addObject("clientDataInfo", clientDataInfo);
modelAndView.addObject("successPostUrl", returnUrl);
} catch (Exception e) {
e.printStackTrace();
authLog.setGetUserInfoSuccessFlag(false);
modelAndView.setViewName("error");
modelAndView.addObject("message", "登录失败");
}
authLogService.save(authLog);
return modelAndView;
}
@RequestMapping(value = "logoutsuccess", method = RequestMethod.GET)
public ModelAndView loginoutsuccess(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) throws IOException {
String returnUrl = request.getParameter("return_url");
if(StringUtils.isNotEmpty(returnUrl)){
response.sendRedirect(returnUrl);
} else {
modelAndView.setViewName("error");
modelAndView.addObject("message", "登出失败");
return modelAndView;
}
return null;
}
private String generateLoginUrl(String returnUrl, String oauthType, String logId) {
//oauthConfig + "/authorize?client_id=testClentId&redirect_uri=http%3a%2f%2f192.168.17.129%3a7774%2fauth%2floginsuccess.do&state=state"
StringBuilder loginUrlBuilder = new StringBuilder();
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(oauthType);
loginUrlBuilder.append(oauthConfigItem.getOauthUrl());
if (!oauthConfigItem.getOauthUrl().endsWith("/")) {
loginUrlBuilder.append("/");
}
loginUrlBuilder.append("oauth2.0/authorize?client_id=").append(oauthConfigItem.getClientId());
String loginSuccessUrl = oauthConfigItem.getLoginSuccessUrl();
loginSuccessUrl = loginSuccessUrl + "?oauth_type=" + oauthType + "&log_id=" + logId;
if (StringUtils.isNotEmpty(returnUrl)) {
Map<String, String> param = new HashMap<>();
param.put("return_url", URLEncoder.encode(returnUrl));
loginSuccessUrl = appendUrl(loginSuccessUrl, param);
}
loginUrlBuilder.append("&redirect_uri=").append(URLEncoder.encode(loginSuccessUrl));
loginUrlBuilder.append("&state=state&response_type=code");
return loginUrlBuilder.toString();
}
private String generateSpLoginUrl(String returnUrl, String oauthType, String logId) {
//oauthConfig + "/authorize?client_id=testClentId&redirect_uri=http%3a%2f%2f192.168.17.129%3a7774%2fauth%2floginsuccess.do&state=state"
StringBuilder loginUrlBuilder = new StringBuilder();
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(oauthType);
loginUrlBuilder.append(oauthConfigItem.getOauthUrl());
if (!oauthConfigItem.getOauthUrl().endsWith("/")) {
loginUrlBuilder.append("/");
}
loginUrlBuilder.append("?client_id=").append(oauthConfigItem.getClientId());
String loginSuccessUrl = oauthConfigItem.getLoginSuccessUrl();
loginSuccessUrl = loginSuccessUrl + "?log_id=" + logId+"&oauth_type=" + oauthType ;
if (StringUtils.isNotEmpty(returnUrl)) {
Map<String, String> param = new HashMap<>();
param.put("return_url", URLEncoder.encode(returnUrl));
loginSuccessUrl = appendUrl(loginSuccessUrl, param);
}
loginUrlBuilder.append("&redirect_uri=").append(URLEncoder.encode(loginSuccessUrl));
String sign = EncodeUtil.md5( oauthConfigItem.getClientId()+ "$$" + oauthConfigItem.getClientSecret());
loginUrlBuilder.append("&sign="+sign);
return loginUrlBuilder.toString();
}
private String generateLogoutUrl(String returnUrl, String oauthType) {
//oauthConfig + "/authorize?client_id=testClentId&redirect_uri=http%3a%2f%2f192.168.17.129%3a7774%2fauth%2floginsuccess.do&state=state"
StringBuilder loginUrlBuilder = new StringBuilder();
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(oauthType);
loginUrlBuilder.append(oauthConfigItem.getOauthUrl());
if (!oauthConfigItem.getOauthUrl().endsWith("/")) {
loginUrlBuilder.append("/");
}
String service = oauthConfigItem.getLogoutSuccessUrl();
if (StringUtils.isNotEmpty(returnUrl)) {
Map<String, String> param = new HashMap<>();
param.put("return_url", URLEncoder.encode(returnUrl));
service = appendUrl(service, param);
}
loginUrlBuilder.append("logout?service=").append(URLEncoder.encode(service));
return loginUrlBuilder.toString();
}
private String generateUserInfoUrl(String accessToken, String oauthType) {
//String url = "http://castest.edu.sh.cn/CAS/oauth2.0/accessToken?client_id=testClentId&client_secret=testClientSecret&redirect_uri=http%3a%2f%2f192.168.17.129%3a7774%2fauth%2floginsuccess2.do&code=" + code;
StringBuilder builder = new StringBuilder();
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(oauthType);
builder.append(oauthConfigItem.getOauthUrl());
if (!oauthConfigItem.getOauthUrl().endsWith("/")) {
builder.append("/");
}
builder.append("oauth2.0/profile?access_token=").append(accessToken);
return builder.toString();
}
private String generateAccessTokenUrl(String code, String oauthType) {
//String url = "http://castest.edu.sh.cn/CAS/oauth2.0/accessToken?client_id=testClentId&client_secret=testClientSecret&redirect_uri=http%3a%2f%2f192.168.17.129%3a7774%2fauth%2floginsuccess2.do&code=" + code;
StringBuilder builder = new StringBuilder();
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(oauthType);
builder.append(oauthConfigItem.getOauthUrl());
if (!oauthConfigItem.getOauthUrl().endsWith("/")) {
builder.append("/");
}
builder.append("oauth2.0/accessToken?client_id=").append(oauthConfigItem.getClientId());
builder.append("&client_secret=").append(oauthConfigItem.getClientSecret());
builder.append("&code=").append(code);
builder.append("&redirect_uri=").append(oauthConfigItem.getLoginSuccessUrl());
builder.append("&grant_type=authorization_code");
return builder.toString();
}
/**
* 在指定url后追加参数
*
* @param url
* @param data 参数集合 key = value
* @return
*/
private static String appendUrl(String url, Map<String, String> data) {
String newUrl = url;
StringBuffer param = new StringBuffer();
for (String key : data.keySet()) {
param.append(key + "=" + data.get(key) + "&");
}
String paramStr = param.toString();
paramStr = paramStr.substring(0, paramStr.length() - 1);
if (newUrl.indexOf("?") >= 0) {
newUrl += "&" + paramStr;
} else {
newUrl += "?" + paramStr;
}
return newUrl;
}
@RequestMapping("shauth")
public ModelAndView chineseallLogin(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("toward");
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
try {
String clientId = request.getParameter("client_id");
String returnUrl = request.getParameter("redirect_uri");
ClientItem clientItem = clientItemMap.get(clientId);
AuthLog authLog = new AuthLog();
authLog.setLogType(LogType.login);
if (null == clientItem) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "client_id为空或者不正确");
return modelAndView;
}
authLog.setClientId(clientId);
authLog.setAuthSource(clientItem.getClientName());
String sign = request.getParameter("sign");
String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
String md5Hex = EncodeUtil.md5(signOrigin);
if (!Objects.equals(sign, md5Hex)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "请求不合法");
return modelAndView;
}
if (StringUtils.isEmpty(returnUrl)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "登录成功回调地址为空");
return modelAndView;
}
authLog.setOauthType(OauthType.dianjiaoguan.getCode());
OauthConfigItem oauthConfigItem = oauthConfig.getItems().get(OauthType.dianjiaoguan.getCode());
authLog.setFowardUrl(oauthConfigItem.getOauthUrl());
authLogService.save(authLog);
String url = generateLoginUrl(returnUrl, OauthType.dianjiaoguan.getCode(), authLog.getId());
modelAndView.addObject("loginUrl", url);
} catch (Exception e) {
e.printStackTrace();
modelAndView.setViewName("error");
modelAndView.addObject("message", "未知错误");
}
return modelAndView;
}
@RequestMapping("shlogout")
public ModelAndView shLogout(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("logout");
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
try {
String clientId = request.getParameter("client_id");
ClientItem clientItem = clientItemMap.get(clientId);
if (clientItem == null) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "client_id为空或者不正确");
return modelAndView;
}
String sign = request.getParameter("sign");
String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
String md5Hex = EncodeUtil.md5(signOrigin);
if (!Objects.equals(sign, md5Hex)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "请求不合法");
return modelAndView;
}
String service = request.getParameter("service");
if (StringUtils.isEmpty(service)) {
modelAndView.setViewName("error");
modelAndView.addObject("message", "登出成功回调地址为空");
return modelAndView;
}
AuthLog authLog = new AuthLog();
authLog.setOauthType(OauthType.dianjiaoguan.getCode());
authLog.setReturnUrl(service);
authLog.setClientId(clientId);
authLog.setAuthSource(clientItem.getClientName());
authLog.setLogType(LogType.logout);
authLogService.save(authLog);
if(StringUtils.isNotEmpty(service)) {
response.sendRedirect(generateLogoutUrl(service, OauthType.dianjiaoguan.getCode()));
}
return null;
} catch (Exception e) {
e.printStackTrace();
modelAndView.setViewName("error");
modelAndView.addObject("message", "未知错误");
}
return modelAndView;
}
}
package com.chineseall.eden.authcenter.agent.controller;
import cn.sh.chineseall.framework.core.repackaged.org.apache.commons.lang3.StringUtils;
import cn.sh.chineseall.framework.core.repackaged.org.apache.commons.lang3.time.DateUtils;
import com.chineseall.eden.authcenter.agent.oauth.OauthType;
import com.chineseall.eden.authcenter.log.service.AuthLogService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
@Controller
@RequestMapping("com/chineseall/eden/authcenter/log")
public class AuthLogController {
private static final String USER_NAME = "admin";
private static final String PWD = "chineseall";
@Resource
private AuthLogService authLogService;
@RequestMapping("adminLogin")
public ModelAndView adminLogin(HttpServletRequest request){
ModelAndView mv = new ModelAndView();
mv.setViewName("adminlogin");
return mv;
}
@RequestMapping(value = "doLogin", method = RequestMethod.POST)
public ModelAndView doLogin(HttpServletResponse response, HttpServletRequest request, @RequestParam("userName") String userName, @RequestParam("pwd") String pwd) throws IOException {
ModelAndView mv = new ModelAndView();
if(userName.equals(USER_NAME) && pwd.equals(PWD)){
request.getSession().setAttribute("loginFlag", "1");
response.sendRedirect("loginstat");
} else {
mv.setViewName("error");
mv.addObject("message", "账号或密码错误");
return mv;
}
return null;
}
@RequestMapping(value = "loginstat")
public ModelAndView loginStat(HttpServletRequest request, HttpServletResponse response) throws IOException {
ModelAndView mv = new ModelAndView();
String flag = (String) request.getSession().getAttribute("loginFlag");
if(StringUtils.isNotEmpty(flag)){
mv.setViewName("loginstat");
// 累计登录人次
Map<String, Object> params1 = new HashMap<>();
params1.put("authSource", "上海运营中心");
params1.put("getUserInfoSuccessFlag", true);
Long loginCounts = authLogService.countLoginByParams(params1);
mv.addObject("data_total", loginCounts);
// 电教馆累计登录人次
Map<String, Object> params2 = new HashMap<>();
params2.put("authSource", "上海运营中心");
params2.put("getUserInfoSuccessFlag", true);
params2.put("oauthType", OauthType.dianjiaoguan.name());
Long dianjiaoguanLoginCounts = authLogService.countLoginByParams(params2);
mv.addObject("data_total_djg", dianjiaoguanLoginCounts);
// 省运营累计登录人次
Map<String, Object> params3 = new HashMap<>();
params3.put("authSource", "上海运营中心");
params3.put("getUserInfoSuccessFlag", true);
params3.put("oauthType", OauthType.edenoperation.name());
Long edenoperationLoginCounts = authLogService.countLoginByParams(params3);
mv.addObject("data_total_syy", edenoperationLoginCounts);
// 近30日累计登录人次
Map<String, Object> params4 = new HashMap<>();
params4.put("authSource", "上海运营中心");
params4.put("getUserInfoSuccessFlag", true);
params4.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -29)));
Long loginCounts30Day = authLogService.countLoginByParams(params4);
mv.addObject("data_30", loginCounts30Day);
// 电教馆近30日累计登录人次
Map<String, Object> params5 = new HashMap<>();
params5.put("authSource", "上海运营中心");
params5.put("getUserInfoSuccessFlag", true);
params5.put("oauthType", OauthType.dianjiaoguan.name());
params5.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -29)));
Long dianjiaoguanLoginCounts30Day = authLogService.countLoginByParams(params5);
mv.addObject("data_30_djg", dianjiaoguanLoginCounts30Day);
// 省运营近30日累计登录人次
Map<String, Object> params6 = new HashMap<>();
params6.put("authSource", "上海运营中心");
params6.put("getUserInfoSuccessFlag", true);
params6.put("oauthType", OauthType.edenoperation.name());
params6.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -29)));
Long edenoperationLoginCounts30Day = authLogService.countLoginByParams(params6);
mv.addObject("data_30_syy", edenoperationLoginCounts30Day);
// 近7日累计登录人次
Map<String, Object> params7 = new HashMap<>();
params7.put("authSource", "上海运营中心");
params7.put("getUserInfoSuccessFlag", true);
params7.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -6)));
Long loginCounts7Day = authLogService.countLoginByParams(params7);
mv.addObject("data_7", loginCounts7Day);
// 电教馆近7日累计登录人次
Map<String, Object> params8 = new HashMap<>();
params8.put("authSource", "上海运营中心");
params8.put("getUserInfoSuccessFlag", true);
params8.put("oauthType", OauthType.dianjiaoguan.name());
params8.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -6)));
Long dianjiaoguanLoginCounts7Day = authLogService.countLoginByParams(params8);
mv.addObject("data_7_djj", dianjiaoguanLoginCounts7Day);
// 省运营近7日累计登录人次
Map<String, Object> params9 = new HashMap<>();
params9.put("authSource", "上海运营中心");
params9.put("getUserInfoSuccessFlag", true);
params9.put("oauthType", OauthType.edenoperation.name());
params9.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -6)));
Long edenoperationLoginCounts7Day = authLogService.countLoginByParams(params9);
mv.addObject("data_7_syy", edenoperationLoginCounts7Day);
// 近7日登录人次查询
List<String> dates = new ArrayList<>();
List<Long> dianjiaoguanDay7counts = new ArrayList<>();
List<Long> edenoperationDay7counts = new ArrayList<>();
for(int i = 0;i<7;i++){
dates.add(getDateDtr(DateUtils.addDays(new Date(), -(6-i))));
Map<String, Object> params = new HashMap<>();
params.put("authSource", "上海运营中心");
params.put("getUserInfoSuccessFlag", true);
params.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -(6-i))));
params.put("endTime", getEndTime(DateUtils.addDays(new Date(), -(6-i))));
params.put("oauthType", OauthType.dianjiaoguan.name());
Long dianjiaoguanCounts = authLogService.countLoginByParams(params);
dianjiaoguanDay7counts.add(dianjiaoguanCounts);
params.put("oauthType", OauthType.edenoperation.name());
Long edenoperationCounts = authLogService.countLoginByParams(params);
edenoperationDay7counts.add(edenoperationCounts);
}
mv.addObject("data_time", dates);
mv.addObject("data_djg", dianjiaoguanDay7counts);
mv.addObject("data_syy", edenoperationDay7counts);
} else {
response.sendRedirect("adminLogin");
return null;
}
return mv;
}
@RequestMapping(value = "loginstat_xhzy")
public ModelAndView loginStatXhzy(HttpServletRequest request, HttpServletResponse response) throws IOException {
ModelAndView mv = new ModelAndView();
String flag = (String) request.getSession().getAttribute("loginFlag");
if(StringUtils.isNotEmpty(flag)){
mv.setViewName("loginstat_xhzy");
// 累计登录人次
Map<String, Object> params1 = new HashMap<>();
params1.put("authSource", "第三方接入");
params1.put("getUserInfoSuccessFlag", true);
Long loginCounts = authLogService.countLoginByParams(params1);
mv.addObject("data1_total_djg", loginCounts);
// 近30日累计登录人次
Map<String, Object> params4 = new HashMap<>();
params4.put("authSource", "第三方接入");
params4.put("getUserInfoSuccessFlag", true);
params4.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -29)));
Long loginCounts30Day = authLogService.countLoginByParams(params4);
mv.addObject("data1_30_djg", loginCounts30Day);
// 近7日累计登录人次
Map<String, Object> params7 = new HashMap<>();
params7.put("authSource", "第三方接入");
params7.put("getUserInfoSuccessFlag", true);
params7.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -6)));
Long loginCounts7Day = authLogService.countLoginByParams(params7);
mv.addObject("data1_7_djg", loginCounts7Day);
// 近7日登录人次查询
List<String> dates = new ArrayList<>();
List<Long> dianjiaoguanDay7counts = new ArrayList<>();
for(int i = 0;i<7;i++){
dates.add(getDateDtr(DateUtils.addDays(new Date(), -(6-i))));
Map<String, Object> params = new HashMap<>();
params.put("authSource", "第三方接入");
params.put("getUserInfoSuccessFlag", true);
params.put("beginTime", getZeroTime(DateUtils.addDays(new Date(), -(6-i))));
params.put("endTime", getEndTime(DateUtils.addDays(new Date(), -(6-i))));
Long dianjiaoguanCounts = authLogService.countLoginByParams(params);
dianjiaoguanDay7counts.add(dianjiaoguanCounts);
}
mv.addObject("data1_time", dates);
mv.addObject("data1_djg", dianjiaoguanDay7counts);
} else {
response.sendRedirect("adminLogin");
return null;
}
return mv;
}
private Map<String, String> getLatest7DatesMap(Date date){
Map<String, String> map = new LinkedHashMap<>();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
map.put(format.format(date), cal.get(Calendar.MONTH)+1 + "." + (cal.get(Calendar.DAY_OF_MONTH)) );
for(int i = 0; i<6 ;i++) {
cal.add(Calendar.DAY_OF_MONTH, -1);
Date newDate = cal.getTime();
map.put(format.format(newDate), cal.get(Calendar.MONTH)+1 + "." + (cal.get(Calendar.DAY_OF_MONTH)) );
}
return map;
}
private String getDateDtr(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MONTH)+1 + "." + (cal.get(Calendar.DAY_OF_MONTH));
}
private Date getZeroTime(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
private Date getEndTime(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTime();
}
}
package com.chineseall.eden.authcenter.agent.controller;
import cn.sh.chineseall.framework.api.MapMessage;
import com.chineseall.eden.authcenter.agent.vo.StatItem;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("logstatistics")
public class LogStatisticsController {
/**
* APP使用情况统计
* @param year
* @param month
* @return
*/
@RequestMapping("app")
@ResponseBody
public MapMessage applications(@RequestParam(value = "clientId",required = false) String clientId, @RequestParam(value = "year",required = false) Integer year, @RequestParam(value = "month",required = false) Integer month){
List<StatItem> result = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("应用A");
item1.setCount(1000);
StatItem item2 = new StatItem();
item2.setName("应用B");
item2.setCount(1000);
result.add(item1);
result.add(item2);
return MapMessage.successMessage().add("data",result);
}
/**
* 来源环境情况统计
* @param year
* @param month
* @return
*/
@RequestMapping("environment")
@ResponseBody
public MapMessage environments(@RequestParam(value = "clientId",required = false) String clientId, @RequestParam(value = "year",required = false) Integer year, @RequestParam(value = "month",required = false) Integer month){
Map<String,List<StatItem>> result = new HashMap<>();
List<StatItem> browserResult = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("浏览器1");
item1.setCount(1000);
StatItem item2 = new StatItem();
item2.setName("浏览器2");
item2.setCount(1000);
browserResult.add(item1);
browserResult.add(item2);
result.put("browser",browserResult);
List<StatItem> osResult = new ArrayList<>();
StatItem os1 = new StatItem();
os1.setName("操作系统1");
os1.setCount(1000);
StatItem os2 = new StatItem();
os2.setName("操作系统2");
os2.setCount(1000);
osResult.add(os1);
osResult.add(os2);
result.put("os",osResult);
return MapMessage.successMessage().add("data",result);
}
/**
* 认证数据统计
* @param year
* @param month
* @return
*/
@RequestMapping("auth")
@ResponseBody
public MapMessage auths(@RequestParam(value = "clientId",required = false) String clientId, @RequestParam(value = "year",required = false) Integer year, @RequestParam(value = "month",required = false) Integer month){
Map<String,Object> result = new HashMap<>();
result.put("all_auth",1500000);
result.put("cas_edu_auth",100000);
List<StatItem> browserResult = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("黄浦区");
item1.setCount(1000);
StatItem item2 = new StatItem();
item2.setName("青浦区");
item2.setCount(1000);
browserResult.add(item1);
browserResult.add(item2);
result.put("area_auth",browserResult);
return MapMessage.successMessage().add("data",result);
}
/**
* 认证高峰时间数据统计
* @param year
* @param month
* @return
*/
@RequestMapping("auth_pick_times")
@ResponseBody
public MapMessage authPickTimes(@RequestParam(value = "clientId",required = false) String clientId, @RequestParam(value = "year",required = false) Integer year, @RequestParam(value = "month",required = false) Integer month){
List<StatItem> result = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("2020-01");
item1.setCount(1000);
StatItem item2 = new StatItem();
item2.setName("2020-02");
item2.setCount(1000);
result.add(item1);
result.add(item2);
return MapMessage.successMessage().add("data",result);
}
/**
* 认证身份统计
* @param year
* @param month
* @return
*/
@RequestMapping("auth_user_type")
@ResponseBody
public MapMessage authUserTypes(@RequestParam(value = "clientId",required = false) String clientId, @RequestParam(value = "year",required = false) Integer year, @RequestParam(value = "month",required = false) Integer month){
List<StatItem> result = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("老师");
item1.setCount(1000);
StatItem item2 = new StatItem();
item2.setName("学生");
item2.setCount(1000);
result.add(item1);
result.add(item2);
return MapMessage.successMessage().add("data",result);
}
/**
* 认证热点单位统计
* @param year
* @param month
* @return
*/
@RequestMapping("auth_hot_org")
@ResponseBody
public MapMessage authHotOrgs(@RequestParam(value = "clientId",required = false) String clientId, @RequestParam(value = "year",required = false) Integer year, @RequestParam(value = "month",required = false) Integer month){
List<StatItem> result = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("A学校");
item1.setCount(1000);
StatItem item2 = new StatItem();
item2.setName("B学校");
item2.setCount(1000);
result.add(item1);
result.add(item2);
return MapMessage.successMessage().add("data",result);
}
/**
* 认证接入的APP
* @return
*/
@RequestMapping("auth_apps")
@ResponseBody
public MapMessage authApps(){
List<StatItem> result = new ArrayList<>();
StatItem item1 = new StatItem();
item1.setName("数字教材");
item1.setCode("asfsafdsf");
StatItem item2 = new StatItem();
item2.setName("阅览室");
item2.setCode("safsadfasd");
result.add(item1);
result.add(item2);
return MapMessage.successMessage().add("data",result);
}
}
\ No newline at end of file
package com.chineseall.eden.authcenter.agent.controller;
import cn.sh.chineseall.framework.core.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.chineseall.eden.authcenter.agent.client.ClientDataInfo;
import com.chineseall.eden.common.util.EncodeUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
@Controller
@RequestMapping("sample")
public class SampleController {
// 认证系统提供client_id
private static final String CLIENT_ID = "xhzyClientId";
// 认证系统提供client_secret
private static final String CLIENT_SECRET = "xhzyClientSecret";
// 登录地址
private static final String LOGIN_URL = "https://ds.etextbook.cn/authcenter/auth/index";
// 登出地址
private static final String LOGOUT_URL = "https://ds.etextbook.cn/authcenter/auth/logout";
// 登录回调地址
private static final String LOGIN_SUCCESS_URL = "https://ds.etextbook.cn/authcenter/sample/loginsuccess";
// 登出回调地址
private static final String LOGOUT_SUCCESS_URL = "https://ds.etextbook.cn/authcenter/sample/logoutsuccess";
@RequestMapping("login")
public ModelAndView login(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
try {
String sign = EncodeUtil.md5(CLIENT_ID + "$$" + CLIENT_SECRET);
String loginUrl = LOGIN_URL + "?client_id=" + CLIENT_ID + "&sign=" + sign + "&redirect_uri=" + URLEncoder.encode(LOGIN_SUCCESS_URL);
response.sendRedirect(loginUrl);
return null;
} catch (IOException e) {
e.printStackTrace();
}
return modelAndView;
}
@RequestMapping("logout")
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
try {
String oauthType = request.getParameter("oauth_type");
if(StringUtils.isEmpty(oauthType)){
modelAndView.setViewName("error");
modelAndView.addObject("message", "oauth_type参数为空");
return modelAndView;
}
String sign = EncodeUtil.md5(CLIENT_ID + "$$" + CLIENT_SECRET);
String loginUrl = LOGOUT_URL + "?client_id=" + CLIENT_ID + "&sign=" + sign + "&service="
+ URLEncoder.encode(LOGOUT_SUCCESS_URL) + "&oauth_type=" + oauthType;
response.sendRedirect(loginUrl);
return null;
} catch (IOException e) {
e.printStackTrace();
}
return modelAndView;
}
@RequestMapping("loginsuccess")
@ResponseBody
public String loginsuccess(ClientDataInfo clientDataInfo) {
return JSON.toJSONString(clientDataInfo);
}
@RequestMapping("logoutsuccess")
@ResponseBody
public String logoutsuccess(ClientDataInfo clientDataInfo) {
return "登出成功!";
}
}
package com.chineseall.eden.authcenter.agent.enums;
import lombok.Getter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public enum DianjiaoguanGradeType {
FIRST_GRADE("11", "一年级",1),
SECOND_GRADE("12", "二年级",2),
THIRD_GRADE("13", "三年级",3),
FOURTH_GRADE("14", "四年级",4),
FIFTH_GRADE("15", "五年级",5),
SIXTH_GRADE("16", "六年级",6),
SEVENTH_GRADE("17", "七年级",7),
EIGHTH_GRADE("18", "八年级",8),
NINTH_GRADE("19", "九年级",9),
TENTH_GRADE("31", "高一",10),
ELEVENTH_GRADE("32", "高二",11),
TWELFTH_GRADE("33", "高三",12);
@Getter
private final String code;
@Getter
private final String description;
@Getter
private final int level;
private final static Map<String, DianjiaoguanGradeType> gradeLevelMap;
private final static Map<String, DianjiaoguanGradeType> descriptionMap;
static {
gradeLevelMap = new LinkedHashMap<>();
descriptionMap = new HashMap<>();
for (DianjiaoguanGradeType type : DianjiaoguanGradeType.values()) {
gradeLevelMap.put(type.getCode(), type);
descriptionMap.put(type.getDescription(), type);
}
}
DianjiaoguanGradeType(String code, String description, int level) {
this.code = code;
this.description = description;
this.level = level;
}
public static DianjiaoguanGradeType getByName(String name) {
try {
return DianjiaoguanGradeType.valueOf(name);
} catch (Exception ex) {
return null;
}
}
public static DianjiaoguanGradeType getByCode(String code) {
try {
return gradeLevelMap.get(code);
} catch (Exception ex) {
return null;
}
}
}
package com.chineseall.eden.authcenter.agent.enums;
import lombok.Getter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public enum DianjiaoguanStudentStageType {
P5("1", "小学"),
J4("2", "初中"),
S3("3", "高中");
@Getter
private final String code;
@Getter
private final String description;
private final static Map<String, DianjiaoguanStudentStageType> stageMap;
private final static Map<String, DianjiaoguanStudentStageType> descriptionMap;
static {
stageMap = new LinkedHashMap<>();
descriptionMap = new HashMap<>();
for (DianjiaoguanStudentStageType type : DianjiaoguanStudentStageType.values()) {
stageMap.put(type.getCode(), type);
descriptionMap.put(type.getDescription(), type);
}
}
DianjiaoguanStudentStageType(String code, String description) {
this.code = code;
this.description = description;
}
public static DianjiaoguanStudentStageType getByName(String name) {
try {
return DianjiaoguanStudentStageType.valueOf(name);
} catch (Exception ex) {
return null;
}
}
public static DianjiaoguanStudentStageType getByCode(String code) {
try {
return stageMap.get(code);
} catch (Exception ex) {
return null;
}
}
public static DianjiaoguanStudentStageType getByDescription(String description) {
try {
return descriptionMap.get(description);
} catch (Exception ex) {
return null;
}
}
}
package com.chineseall.eden.authcenter.agent.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum DianjiaoguanSubjectType {
subject_1(640001 , "学前教育" , "QT"),
subject_2(641001 , "语文" , "YW"),
subject_3(641002 , "数学" , "SX"),
subject_4(641003 , "外语" , "YY"),
subject_5(641004 , "自然" , "ZR"),
subject_6(641005 , "音乐" , "YU"),
subject_7(641006 , "体育" , "TY"),
subject_8(641007 , "美术" , "MS"),
subject_9(641008 , "道德与法治" , "DF"),
subject_10(641009 , "社会" , "SH"),
subject_11(641010 , "生活与劳动" , "LD"),
subject_12(641011 , "信息科技" , "XX"),
subject_13(641012 , "教育辅助" , "QT"),
subject_14(641013 , "团队辅导" , "QT"),
subject_15(641014 , "心理学" , "QT"),
subject_16(641016 , "其他" , "QT"),
subject_17(642001 , "道德与法治" , "DF"),
subject_18(642002 , "语文" , "YW"),
subject_19(642003 , "数学" , "SX"),
subject_20(642004 , "外语" , "YY"),
subject_21(642005 , "物理" , "WL"),
subject_22(642006 , "化学" , "HX"),
subject_23(642007 , "生物" , "SW"),
subject_24(642008 , "历史" , "LS"),
subject_25(642009 , "地理" , "DL"),
subject_26(642010 , "音乐" , "YU"),
subject_27(642011 , "体育" , "TY"),
subject_28(642012 , "美术" , "MS"),
subject_29(642013 , "计算机" , "XX"),
subject_30(642014 , "艺术" , "YS"),
subject_31(642015 , "科学" , "KX"),
subject_32(642016 , "信息科技" , "XX"),
subject_33(642017 , "心理学" , "QT"),
subject_34(642018 , "教育辅助" , "QT"),
subject_35(642019 , "团队辅导" , "QT"),
subject_36(642020 , "劳技劳动" , "LD"),
subject_37(642021 , "其他" , "QT"),
subject_38(643001 , "思想政治" , "ZZ"),
subject_39(643002 , "语文" , "YW"),
subject_40(643003 , "数学" , "SX"),
subject_41(643004 , "外语" , "YY"),
subject_42(643005 , "物理" , "WL"),
subject_43(643006 , "化学" , "HX"),
subject_44(643007 , "生物" , "SW"),
subject_45(643008 , "历史" , "LS"),
subject_46(643009 , "地理" , "DL"),
subject_47(643010 , "音乐" , "YU"),
subject_48(643011 , "体育" , "TY"),
subject_49(643012 , "美术" , "MS"),
subject_50(643013 , "计算机" , "XX"),
subject_51(643014 , "艺术" , "YS"),
subject_52(643015 , "科学" , "KX"),
subject_53(643016 , "信息科技" , "XX"),
subject_54(643017 , "心理学" , "QT"),
subject_55(643018 , "其他" , "QT"),
subject_56(643019 , "劳技劳动" , "LD"),
subject_57(643020 , "综合理科" , "QT"),
subject_58(643021 , "教育辅助" , "QT"),
subject_59(643022 , "团队辅导" , "QT"),
subject_60(644001 , "校外教育" , "QT"),
subject_61(644003 , "特殊教育" , "QT"),
subject_62(644004 , "安全教育" , "QT"),
subject_63(644005 , "教育管理" , "QT"),
subject_64(644006 , "教师专业发展" , "QT"),
subject_65(644007 , "校本研修" , "QT"),
subject_66(644008 , "其他" , "QT"),
subject_67(641015 , "科学" , "KX"),
subject_68(113102 , "农林牧渔类" , "QT"),
subject_69(113103 , "资源环境类" , "QT"),
subject_70(113104 , "能源与新能源类" , "QT"),
subject_71(113105 , "土木水利类" , "QT"),
subject_72(113106 , "加工制造类" , "QT"),
subject_73(113107 , "石油化工类" , "QT"),
subject_74(113108 , "轻纺食品类" , "QT"),
subject_75(113109 , "交通运输类" , "QT"),
subject_76(113110 , "信息技术类" , "XX"),
subject_77(113111 , "医药卫生类" , "QT"),
subject_78(113112 , "休闲保健类" , "QT"),
subject_79(113113 , "财经商贸类" , "QT"),
subject_80(113114 , "旅游服务类" , "QT"),
subject_81(113115 , "文化艺术类" , "QT"),
subject_82(113116 , "体育与健身" , "TJ"),
subject_83(113117 , "教育类" , "QT"),
subject_84(113118 , "司法服务类" , "QT"),
subject_85(113119 , "公共管理与服务类" , "QT"),
subject_86(113120 , "其他" , "QT"),
subject_87(113121 , "中高职(中本)贯通类", "QT");
private int code;
private String name;
private String operationCode;
public static DianjiaoguanSubjectType getByCode(Integer code){
if(null==code)
return null;
else{
for (DianjiaoguanSubjectType type : DianjiaoguanSubjectType.values()){
if(code.intValue()==type.getCode())
return type;
}
return null;
}
}
}
package com.chineseall.eden.authcenter.agent.enums;
import lombok.Getter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public enum DianjiaoguanTeacherStageType {
P5("103", "小学"),
J4("101", "初中"),
S3("102", "高中");
@Getter
private final String code;
@Getter
private final String description;
private final static Map<String, DianjiaoguanTeacherStageType> stageMap;
private final static Map<String, DianjiaoguanTeacherStageType> descriptionMap;
static {
stageMap = new LinkedHashMap<>();
descriptionMap = new HashMap<>();
for (DianjiaoguanTeacherStageType type : DianjiaoguanTeacherStageType.values()) {
stageMap.put(type.getCode(), type);
descriptionMap.put(type.getDescription(), type);
}
}
DianjiaoguanTeacherStageType(String code, String description) {
this.code = code;
this.description = description;
}
public static DianjiaoguanTeacherStageType getByName(String name) {
try {
return DianjiaoguanTeacherStageType.valueOf(name);
} catch (Exception ex) {
return null;
}
}
public static DianjiaoguanTeacherStageType getByCode(String code) {
try {
return stageMap.get(code);
} catch (Exception ex) {
return null;
}
}
public static DianjiaoguanTeacherStageType getByDescription(String description) {
try {
return descriptionMap.get(description);
} catch (Exception ex) {
return null;
}
}
}
package com.chineseall.eden.authcenter.agent.oauth;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Map;
@Data
@Component
@ConfigurationProperties(prefix = "oauth")
public class OauthConfig implements Serializable {
Map<String,OauthConfigItem> items;
}
package com.chineseall.eden.authcenter.agent.oauth;
import lombok.Data;
import java.io.Serializable;
/**
* Created by yuchunlin on 2019/1/3.
*/
@Data
public class OauthConfigItem implements Serializable {
//http://castest.edu.sh.cn/CAS/oauth2.0
private String oauthUrl;
private String clientId;
private String clientSecret;
private String loginSuccessUrl;
private String logoutSuccessUrl;
}
package com.chineseall.eden.authcenter.agent.oauth;
import lombok.Getter;
public enum OauthType {
dianjiaoguan("dianjiaoguan","电教馆账号认证"),
idp("idp","idp认证"),
jsyd("jsyd","金山教育"),
qpjy("qpjy","青浦教育"),
hpjy("hpjy","黄浦教育"),
fxjy("fxjy","奉贤教育"),
pdjy("pdjy","浦东教育"),
ypjy("ypjy","杨浦教育"),
edenoperation("edenoperation","数字教材账号认证");
@Getter
private final String code;
@Getter
private final String description;
OauthType(String code, String description) {
this.code = code;
this.description = description;
}
public static OauthType getValue(String name) {
try {
return OauthType.valueOf(name);
} catch (Exception ex) {
return null;
}
}
}
package com.chineseall.eden.authcenter.agent.utils;
import com.chineseall.eden.authcenter.agent.enums.DianjiaoguanGradeType;
import com.chineseall.eden.authcenter.agent.enums.DianjiaoguanStudentStageType;
import com.chineseall.eden.authcenter.agent.enums.DianjiaoguanSubjectType;
import com.chineseall.eden.authcenter.agent.enums.DianjiaoguanTeacherStageType;
import com.chineseall.eden.common.enums.meta.EducationSystem;
import com.chineseall.eden.common.enums.meta.GradeLevel;
import com.chineseall.eden.common.enums.meta.SubjectType;
import com.chineseall.eden.service.user.entities.AuthUserInfo;
import com.chineseall.eden.service.user.enums.UserType;
import org.apache.commons.lang.StringUtils;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class ConvertMessageMapToBean {
public static AuthUserInfo converDianjiaoguanData(Map<String, Object> dataMap){
List<Map<String, String>> attributes = (List<Map<String, String>>) dataMap.get("attributes");
Map<String, String> map = new LinkedHashMap<>();
if(null != attributes) {
attributes.stream().forEach(stringMap -> {
for (Map.Entry entry : stringMap.entrySet()) {
map.put(entry.getKey().toString(), entry.getValue().toString());
}
});
}
AuthUserInfo authUserInfo = new AuthUserInfo();
if(StringUtils.isNotBlank(map.get("ID")))
authUserInfo.setId(map.get("ID").toString());
if(StringUtils.isNotBlank(map.get("XM")))
authUserInfo.setRealName(map.get("XM").toString());
if(StringUtils.isNotBlank(map.get("ROLE"))) {
if (map.get("ROLE").toString().equals("1001"))
authUserInfo.setUserType(UserType.STUDENT);
else if(map.get("ROLE").toString().equals("2001")||map.get("ROLE").toString().equals("2002"))
authUserInfo.setUserType(UserType.TEACHER);
}
if(StringUtils.isNotBlank(map.get("XJXSID")))
authUserInfo.setStudentId(map.get("XJXSID").toString());
if(StringUtils.isNotBlank(map.get("XJFH")))
authUserInfo.setStudentCode(map.get("XJFH").toString());
if(StringUtils.isNotBlank(map.get("XJXD"))) {
DianjiaoguanStudentStageType type = DianjiaoguanStudentStageType.getByCode(map.get("XJXD").toString());
if(type != null)
authUserInfo.setStudentStage(EducationSystem.safeParse(type.name()));
}
if(StringUtils.isNotBlank(map.get("XJNJ"))){
DianjiaoguanGradeType type = DianjiaoguanGradeType.getByCode(map.get("XJNJ").toString());
if(type != null)
authUserInfo.setStudentGrade(GradeLevel.getByName(type.name()));
}
if(StringUtils.isNotBlank(map.get("XJBJ")))
authUserInfo.setStudentClass(map.get("XJBJ").toString());
if(authUserInfo.getStudentStage() != null)
authUserInfo.setStudentStageName(authUserInfo.getStudentStage().getDescription());
if(authUserInfo.getStudentGrade() != null)
authUserInfo.setStudentGradeName(authUserInfo.getStudentGrade().getDescription());
if(StringUtils.isNotBlank(map.get("XJBJMC")))
authUserInfo.setStudentClassName(map.get("XJBJMC").toString());
if(StringUtils.isNotBlank(map.get("XJXXID")))
authUserInfo.setStudentSchoolId(map.get("XJXXID").toString());
if(StringUtils.isNotBlank(map.get("XJDQZT")))
authUserInfo.setStudentCodeStatus(map.get("XJDQZT").toString());
if(StringUtils.isNotBlank(map.get("XJXXDM")))
authUserInfo.setStudentSchoolCode(map.get("XJXXDM").toString());
if(StringUtils.isNotBlank(map.get("XJXXMC")))
authUserInfo.setStudentSchoolName(map.get("XJXXMC").toString());
if(StringUtils.isNotBlank(map.get("XJQXDM")))
authUserInfo.setStudentRegionCode(map.get("XJQXDM").toString());
if(StringUtils.isNotBlank(map.get("XJQXMC")))
authUserInfo.setStudentRegionName(map.get("XJQXMC").toString());
if(StringUtils.isNotBlank(map.get("SXTEACHNUMBER")))
authUserInfo.setTeacherTrainingNo(map.get("SXTEACHNUMBER").toString());
if(StringUtils.isNotBlank(map.get("SXENAME")))
authUserInfo.setTeacherTrainingUserName(map.get("SXENAME").toString());
if(StringUtils.isNotBlank(map.get("SXQUXIANID")))
authUserInfo.setTeacherRegionCode(map.get("SXQUXIANID").toString());
if(StringUtils.isNotBlank(map.get("SXXUQUID")))
authUserInfo.setTeacherCampusCode(map.get("SXXUQUID").toString());
if(StringUtils.isNotBlank(map.get("SXSCHOOL_TYPEID")))
authUserInfo.setTeacherTrainingSchoolType(map.get("SXSCHOOL_TYPEID").toString());
if(StringUtils.isNotBlank(map.get("SXXUEDUANID"))){
DianjiaoguanTeacherStageType type = DianjiaoguanTeacherStageType.getByCode(map.get("SXXUEDUANID").toString());
if(type != null)
authUserInfo.setTeacherStage(EducationSystem.safeParse(type.name()));
}
if(StringUtils.isNotBlank(map.get("SXNIANJIID"))){
DianjiaoguanGradeType type = DianjiaoguanGradeType.getByCode(map.get("SXNIANJIID").toString());
if(type != null)
authUserInfo.setTeacherGrade(GradeLevel.getByName(type.name()));
}
if(StringUtils.isNotBlank(map.get("SXMASTERSUBJECT"))) {
DianjiaoguanSubjectType dType = DianjiaoguanSubjectType.getByCode(Integer.valueOf(map.get("SXMASTERSUBJECT").toString()));
if(null != dType)
authUserInfo.setTeacherSubject(SubjectType.getByCode(dType.getOperationCode()));
}
if(StringUtils.isNotBlank(map.get("SXSCHOOLID")))
authUserInfo.setTeacherSchoolId(map.get("SXSCHOOLID").toString());
if(StringUtils.isNotBlank(map.get("SXSCHOOL_NAME")))
authUserInfo.setTeacherSchoolName(map.get("SXSCHOOL_NAME").toString());
return authUserInfo;
}
public static AuthUserInfo converEdenoperationData(Map<String, Object> dataMap){
Map<String, String> map = (Map<String, String>) dataMap.get("authUserInfo");
AuthUserInfo authUserInfo = new AuthUserInfo();
if(StringUtils.isNotBlank(map.get("id")))
authUserInfo.setId(map.get("id").toString());
if(StringUtils.isNotBlank(map.get("real_name")))
authUserInfo.setRealName(map.get("real_name").toString());
if(StringUtils.isNotBlank(map.get("user_type")))
authUserInfo.setUserType(UserType.valueOf(map.get("user_type")));
if(StringUtils.isNotBlank(map.get("student_id")))
authUserInfo.setStudentId(map.get("student_id").toString());
if(StringUtils.isNotBlank(map.get("student_code")))
authUserInfo.setStudentCode(map.get("student_code").toString());
if(StringUtils.isNotBlank(map.get("student_stage")))
authUserInfo.setStudentStage(EducationSystem.safeParse(map.get("student_stage").toString()));
if(StringUtils.isNotBlank(map.get("student_grade")))
authUserInfo.setStudentGrade(GradeLevel.getByName(map.get("student_grade")));
if(StringUtils.isNotBlank(map.get("student_class")))
authUserInfo.setStudentClass(map.get("student_class").toString());
if(StringUtils.isNotBlank(map.get("student_stage_name")))
authUserInfo.setStudentStageName(map.get("student_stage_name").toString());
if(authUserInfo.getStudentGrade() != null)
authUserInfo.setStudentGradeName(authUserInfo.getStudentGrade().getDescription());
if(StringUtils.isNotBlank(map.get("student_class_name")))
authUserInfo.setStudentClassName(map.get("student_class_name").toString());
if(StringUtils.isNotBlank(map.get("student_school_id")))
authUserInfo.setStudentSchoolId(map.get("student_school_id").toString());
if(StringUtils.isNotBlank(map.get("student_code_status")))
authUserInfo.setStudentCodeStatus(map.get("student_code_status").toString());
if(StringUtils.isNotBlank(map.get("student_school_code")))
authUserInfo.setStudentSchoolCode(map.get("student_school_code").toString());
if(StringUtils.isNotBlank(map.get("student_school_name")))
authUserInfo.setStudentSchoolName(map.get("student_school_name").toString());
if(StringUtils.isNotBlank(map.get("student_region_code")))
authUserInfo.setStudentRegionCode(map.get("student_region_code").toString());
if(StringUtils.isNotBlank(map.get("student_region_name")))
authUserInfo.setStudentRegionName(map.get("student_region_name").toString());
if(StringUtils.isNotBlank(map.get("teacher_training_no")))
authUserInfo.setTeacherTrainingNo(map.get("teacher_training_no").toString());
if(StringUtils.isNotBlank(map.get("teacher_training_user_name")))
authUserInfo.setTeacherTrainingUserName(map.get("teacher_training_user_name").toString());
if(StringUtils.isNotBlank(map.get("teacher_region_code")))
authUserInfo.setTeacherRegionCode(map.get("teacher_region_code").toString());
if(StringUtils.isNotBlank(map.get("teacher_campus_code")))
authUserInfo.setTeacherCampusCode(map.get("teacher_campus_code").toString());
if(StringUtils.isNotBlank(map.get("teacher_training_school_type")))
authUserInfo.setTeacherTrainingSchoolType(map.get("teacher_training_school_type").toString());
if(StringUtils.isNotBlank(map.get("teacher_stage")))
authUserInfo.setTeacherStage(EducationSystem.safeParse(map.get("teacher_stage").toString()));
if(StringUtils.isNotBlank(map.get("teacher_grade")))
authUserInfo.setTeacherGrade(GradeLevel.getByName(map.get("teacher_grade")));
if(StringUtils.isNotBlank(map.get("teacher_subject")))
authUserInfo.setTeacherSubject(SubjectType.getByName(map.get("teacher_subject")));
if(StringUtils.isNotBlank(map.get("teacher_school_id")))
authUserInfo.setTeacherSchoolId(map.get("teacher_school_id").toString());
if(StringUtils.isNotBlank(map.get("teacher_school_name")))
authUserInfo.setTeacherSchoolName(map.get("teacher_school_name").toString());
return authUserInfo;
}
}
package com.chineseall.eden.authcenter.agent.utils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookiesUtil {
public static String getSessionId(HttpServletRequest request) {
String sessionId = request.getParameter("JSESSIONID");
if (sessionId == null) {
return getCookie(request, "JSESSIONID");
}
return sessionId;
}
public static String getCookie(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
String str = null;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
if (c.getName().equalsIgnoreCase(cookieName)) {
str = c.getValue();
}
}
}
return str;
}
public static void setCookie(HttpServletResponse response, String domain,
String cookieName, String cookieValue, Integer days) {
Cookie cookies = null;
cookies = new Cookie(cookieName, cookieValue);
if (days != null) {
cookies.setMaxAge(60 * 60 * 24 * days);
}
cookies.setPath("/");
if (domain != null) {
cookies.setDomain(domain);
}
response.addCookie(cookies);
}
public static void delCookie(HttpServletResponse response, String domain,
String path, String cookieName, String cookieValue) {
Cookie cookies = new Cookie(cookieName, cookieValue);
if (domain != null) {
cookies.setDomain(domain);
}
cookies.setPath(path);
cookies.setMaxAge(0);
response.addCookie(cookies);
}
public static void delAllCookie(HttpServletRequest request,
HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
c.setValue("");
c.setMaxAge(0);
response.addCookie(c);
}
}
}
}
package com.chineseall.eden.authcenter.agent.vo;
import lombok.Data;
@Data
public class StatItem {
private String code;
private String name;
private Integer count;
}
server:
port: 9600
context-path: /authcenter
spring:
application:
name: eden-authcenter-agent
mvc:
static-path-pattern: /static/**
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
mode: LEGACYHTML5
encoding: UTF-8
enabled: true
content-type: text/html
jackson:
property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
default-property-inclusion: non_null
serialization: true
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
http:
multipart:
max-file-size: 200MB
max-request-size: 300MB
oauth:
items:
dianjiaoguan: #电教馆
#oauthUrl: https://castest.edu.sh.cn/CAS
oauthUrl: https://cas2.edu.sh.cn/CAS
clientId: clientid
clientSecret: clientSecret
loginSuccessUrl: https://ds.etextbook.cn/authcenter/auth/loginsuccess
logoutSuccessUrl: https://ds.etextbook.cn/authcenter/auth/logoutsuccess
edenoperation: #运营中心
#oauthUrl: https://operator-api-test.etextbook.cn/cas
oauthUrl: https://operator-api.sh-genius.cn/cas/
clientId: testClentId
clientSecret: testClientSecret
loginSuccessUrl: https://ds.etextbook.cn/authcenter/auth/loginsuccess
logoutSuccessUrl: https://ds.etextbook.cn/authcenter/auth/logoutsuccess
qpjy: #idp
#oauthUrl: https://operator-api-test.etextbook.cn/cas
oauthUrl: https://sp.etextbook.cn/authcenter/auth/login
clientId: dsClentId
clientSecret: VjyqUkkM5Znu
loginSuccessUrl: https://ds.etextbook.cn/authcenter/authcenter/auth/idp/loginsuccess
logoutSuccessUrl: https://ds.etextbook.cn/authcenter/auth/logoutsuccess
oauthclient:
clients:
- clientName: 上海运营中心
clientId: testClentId
clientSecret: testClientSecret
- clientName: 接入样例
clientId: testClentId2
clientSecret: testClientSecret2
- clientName: 第三方接入
clientId: xhzyClientId
clientSecret: xhzyClientSecret
- clientName: 阅览室
clientId: readingroomClientId
clientSecret: readingroomClientSecret
{
"mongo": [
{
"connectionName": "mongo",
"host": "dds-uf6124f9044c34741.mongodb.rds.aliyuncs.com",
"port": 3717,
"replicaSet": "dds-uf6124f9044c34742.mongodb.rds.aliyuncs.com:3717",
"maxConnectionsPerHost": 3000,
"threadsAllowedToBlockForConnectionMultiplier": 10,
"authentication": true,
"connectTimeout": 10000,
"password": "ChineseAll&0219",
"userName": "dsuser",
"dbName": "dslog"
}
]
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
.ds {
max-width: 1900px;
margin: 0 auto;
}
.ds-header-img {
margin-left: 120px;
}
.ds-content {
width: 100%;
height: 603px;
background: url("../img/bg.png") no-repeat center center;
overflow: hidden;
}
.ds-content-mask {
margin: 30px 30px;
height: 543px;
background: rgba(255, 255, 255, 0.1);
}
.ds-content-title {
padding: 50px 0 20px 0;
text-align: center;
color: white;
font-weight: 500;
font-size: 28px;
letter-spacing: 6px;
}
.ds-footer {
width: 100%;
height: 139px;
background: white url("../img/Login-b.jpg") no-repeat center center;
}
.ds-footer > p {
color: #aab9c5;
font-size: 12px;
line-height: 75px;
text-align: center;
}
.ds-content-city {
width: 80%;
margin: 0 auto;
display: flex;
}
.ds-content-city > p {
width: 100px;
color: white;
font-size: 20px;
line-height: 42px;
flex-shrink: 0;
margin: 0;
margin-top: 10px;
}
.ds-content-district {
width: 80%;
margin: 0 auto;
display: flex;
}
.ds-content-district > p {
width: 100px;
color: white;
font-size: 20px;
line-height: 52px;
flex-shrink: 0;
margin: 0;
margin-top: 10px;
height: 52px;
}
.logo-btn {
border: 0;
border-radius: 5px;
background-repeat: no-repeat !important;
background-position: center center !important;
position: relative;
outline: 0;
}
.logo-btn:focus {
outline: 0;
}
.djg-btn {
width: 320px;
height: 42px;
margin: 10px 10px;
}
.idp-btn {
width: 143px;
height: 52px;
background-size: 100% 100% !important;
margin: 10px 10px;
}
.logo-btn:after{
position: absolute;
content: "\00a0";
}
.logo-btn-mask:after {
position: absolute;
border-radius: 5px;
top: 0;
left: 0;
content: "\00a0";
background-color: black;
opacity: 0.2;
width: 100%;
height: 100%;
}
.ds-content-text {
color: white;
text-align: center;
font-size: 18px;
letter-spacing: 2px;
margin-top: 40px;
margin-bottom: 8px;
}
.ds-divide-line {
width: 80%;
margin: 20px auto;
height: 2px;
background: -webkit-linear-gradient(left, rgba(251, 251, 251, 0.09), rgba(251, 251, 251, 0.59), rgba(251, 251, 251, 0.09)); /* Safari 5.1 - 6.0 */
background: -o-linear-gradient(right, rgba(251, 251, 251, 0.09), rgba(251, 251, 251, 0.59), rgba(251, 251, 251, 0.09)); /* Opera 11.1 - 12.0 */
background: -moz-linear-gradient(right, rgba(251, 251, 251, 0.09), rgba(251, 251, 251, 0.59), rgba(251, 251, 251, 0.09)); /* Firefox 3.6 - 15 */
background: linear-gradient(to right, rgba(251, 251, 251, 0.09), rgba(251, 251, 251, 0.59), rgba(251, 251, 251, 0.09));
}
.szjc-login {
width: 80%;
margin: 0px auto;
text-align: center;
}
.szjc-login > p {
color: white;
font-size: 18px;
margin: 0;
margin-bottom: 6px;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! HTML5 Boilerplate v4.3.0 | MIT License | http://h5bp.com/ */
/*
* What follows is the result of much research on cross-browser styling.
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
* Kroc Camen, and the H5BP dev community and team.
*/
/* ==========================================================================
Base styles: opinionated defaults
========================================================================== */
html,
button,
input,
select,
textarea {
color: #222;
}
html {
width: 100%;
height: 100%;
font-size: 1em;
line-height: 1.4;
}
/*
* Remove text-shadow in selection highlight: h5bp.com/i
* These selection rule sets have to be separate.
* Customize the background color to match your design.
*/
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
/*
* A better looking default horizontal rule
*/
hr {
display: block;
height: 1px;
border: 0;
border-top: 1px solid #ccc;
margin: 1em 0;
padding: 0;
}
/*
* Remove the gap between images, videos, audio and canvas and the bottom of
* their containers: h5bp.com/i/440
*/
audio,
canvas,
img,
video {
vertical-align: middle;
}
/*
* Remove default fieldset styles.
*/
fieldset {
border: 0;
margin: 0;
padding: 0;
}
/*
* Allow only vertical resizing of textareas.
*/
textarea {
resize: vertical;
}
/* ==========================================================================
Browse Happy prompt
========================================================================== */
.browsehappy {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
/* ==========================================================================
Author's custom styles
========================================================================== */
/* ==========================================================================
Helper classes
========================================================================== */
/*
* Image replacement
*/
.ir {
background-color: transparent;
border: 0;
overflow: hidden;
/* IE 6/7 fallback */
*text-indent: -9999px;
}
.ir:before {
content: "";
display: block;
width: 0;
height: 150%;
}
/*
* Hide from both screenreaders and browsers: h5bp.com/u
*/
.hidden {
display: none !important;
visibility: hidden;
}
a,button,input{
outline: none;
}
/*
* Hide only visually, but have it available for screenreaders: h5bp.com/v
*/
.visuallyhidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/*
* Extends the .visuallyhidden class to allow the element to be focusable
* when navigated to via the keyboard: h5bp.com/p
*/
.visuallyhidden.focusable:active,
.visuallyhidden.focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
/*
* Hide visually and from screenreaders, but maintain layout
*/
.invisible {
visibility: hidden;
}
/*
* Clearfix: contain floats
*
* For modern browsers
* 1. The space content is one way to avoid an Opera bug when the
* `contenteditable` attribute is included anywhere else in the document.
* Otherwise it causes space to appear at the top and bottom of elements
* that receive the `clearfix` class.
* 2. The use of `table` rather than `block` is only necessary if using
* `:before` to contain the top-margins of child elements.
*/
.clearfix:before,
.clearfix:after {
content: " "; /* 1 */
display: table; /* 2 */
}
.clearfix:after {
clear: both;
}
/*
* For IE 6/7 only
* Include this rule to trigger hasLayout and contain floats.
*/
.clearfix {
*zoom: 1;
}
/* ==========================================================================
EXAMPLE Media Queries for Responsive Design.
These examples override the primary ('mobile first') styles.
Modify as content requires.
========================================================================== */
@media only screen and (min-width: 35em) {
/* Style adjustments for viewports that meet the condition */
}
@media print,
(-o-min-device-pixel-ratio: 5/4),
(-webkit-min-device-pixel-ratio: 1.25),
(min-resolution: 120dpi) {
/* Style adjustments for high resolution devices */
}
/* ==========================================================================
Print styles.
Inlined to avoid required HTTP connection: h5bp.com/r
========================================================================== */
@media print {
* {
background: transparent !important;
color: #000 !important; /* Black prints faster: h5bp.com/s */
box-shadow: none !important;
text-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
/*
* Don't show links for images, or javascript/internal links
*/
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group; /* h5bp.com/t */
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
body{
width: 100%;
height: 100%;
overflow: hidden;
background-color: #4e97f7 !important;
/*display: flex;*/
align-items: center;
justify-content: center;
}
.bg{
width: 887px;
height: 490px;
position: relative;
top:50%;
left:50%;
margin-top:-245px;
margin-left:-444px;
background: url("../img/form_bg.png") no-repeat center;
}
.loginContainer{
width: 435px;
position: absolute;
top: 80px;
/* left: 30px; */
}
.loginContainer h1{
color: #fff;
}
.login-box{
width: 310px;
box-sizing: border-box;
border-radius: 15px;
margin: 0 auto;
}
.login-box h2{
font-size: 20px;
color:#4d8dff ;
font-weight: bolder;
}
.login-box .radioGrop{
width:450px;
clear: both;
font-size: 12px;
margin-left:60px;
}
.radioGrop .radio {
float:left;
}
/*.radioGrop .radio:first-of-type label{*/
/* color:#4d8dff ;*/
/* */
/* */
/*}*/
.login-box small{
color: red;
}
.login-box .radio{
flex: 1;
position:relative;
}
.login-box .radioGrop input[type=radio]{
margin-top: 2px;
/* margin-right:20px;*/
position:absolute;
left:10px;
top:0;
}
.login-box button.btn{
border-radius: 15px;
outline-color:transparent;
}
.login-box a.btn{
/*word-break: normal;*/
white-space: normal;
/* text-align: center; */
width:140px;
font-size: 12px;
height: 48px;
/* text-decoration: dashed; */
}
.login-box .btn-primary {
background: -webkit-linear-gradient(left, #4d8dff, blue); /* Safari 5.1 - 6.0 */
background: -o-linear-gradient(right, #4d8dff, blue); /* Opera 11.1 - 12.0 */
background: -moz-linear-gradient(right, #4d8dff, blue); /* Firefox 3.6 - 15 */
background: linear-gradient(to right, #4d8dff, blue); /* 标准的语法 */
box-shadow: #4e97f7;
line-height: 2;
font-size: 20px;
}
.login-box
.bg-line{
margin: 30px auto;
border-top: 1px solid #333;
position: relative;
}
.bg-line span{
position: absolute;
top: -13px;
/* text-align: center; */
padding: 0 20px;
background: #fff;
left: 100px;
}
.login-box .input-group-addon{
background: none;
color:#4d8dff ;
}
.login-box a{
/* border:1px solid #4d8dff ; */
cursor: pointer;
color: #4d8dff;
text-decoration: underline;
}
.login-box .disable_a {
border:1px solid #ccc;
pointer-events: none;
color: #afafaf;
cursor: default;
}
.login-box .radio{
margin-right: 30px;
}
.login-box .radio {
word-break: keep-all;
}
.login-box .logBtn{
background: url("../img/btn_bg.png") no-repeat center;
background-size: contain;
border: none;
}
.login-box .radio+.radio
{
margin-top: 10px;
}
.login-box .btn-default:hover{
color: #fff;
background:#4d8dff ;
}
.login-btn{
font-size: 16px;
width: 200px;
height: 43px;
display: inline-block;
margin: 105px 0px 67px 42px;
border-radius: 21px;
background-image: linear-gradient(to right, #4E97F6, rgb(34, 124, 241));
color: white;
}
.login-span{
/* margin-top: 67px; */
}
@media screen and (min-width: 1025px) and (max-width: 1280px){
.bg{
background-size: initial;
}
}
@media screen and (min-width: 768px) and (max-width: 1024px){
.bg{
background-size: contain;
}
}
@media screen and (min-width: 1921px) and (max-width: 3000px) {
.bg{
width: 1600px;
height: 980px;
position: absolute;
top:0;
left:0;
bottom: 0;
right: 0;
margin: auto;
background-size: 100%;
background-color: #000;
background: url("../img/bg1.png") no-repeat center;
}
.bg_box {
position: relative;
top: 0;
left: 0;
}
.loginContainer {
position: absolute;
top: 250px;
left: 12%;
margin-bottom: 22px;
}
.bg-form {
width: 100% !important;
}
.login-box {
width: 100%;
}
.login-box .radioGrop input[type=radio] {
margin-top: 8px;
}
.login-box h2 {
font-size: 40px;
}
.login-box .radioGrop {
font-size: 24px;
width: 100%;
min-height: 50px;
display: fiex;
justify-content: space-between;
margin-left: 0px;
margin-bottom: 22px;
}
.login-box .radio {
margin-right: 28px;
margin-bottom: 30px;
margin-left: 12px;
}
.login-box .radio:last-child {
margin-right: 0px;
}
.login-box small {
font-size: 22px;
padding-top: 10px;
}
.form-group {
margin-bottom: 22px;
}
.input-group-addon {
padding: 12px 24px;
font-size: 22px;
}
.form-control {
font-size: 22px;
height: 58px;
}
.btn {
padding: 12px 24px;
font-size: 22px;
}
.bg-line span {
font-size: 22px;
left: 220px;
}
.login-box a.btn {
width: auto;
font-size: 22px;
height: 60px;
}
}
/*! HTML5 Boilerplate v4.3.0 | MIT License | http://h5bp.com/ */
/*
* What follows is the result of much research on cross-browser styling.
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
* Kroc Camen, and the H5BP dev community and team.
*/
/* ==========================================================================
Base styles: opinionated defaults
========================================================================== */
html,
button,
input,
select,
textarea {
color: #222;
}
html {
width: 100%;
height: 100%;
font-size: 1em;
line-height: 1.4;
}
/*
* Remove text-shadow in selection highlight: h5bp.com/i
* These selection rule sets have to be separate.
* Customize the background color to match your design.
*/
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
/*
* A better looking default horizontal rule
*/
hr {
display: block;
height: 1px;
border: 0;
border-top: 1px solid #ccc;
margin: 1em 0;
padding: 0;
}
/*
* Remove the gap between images, videos, audio and canvas and the bottom of
* their containers: h5bp.com/i/440
*/
audio,
canvas,
img,
video {
vertical-align: middle;
}
/*
* Remove default fieldset styles.
*/
fieldset {
border: 0;
margin: 0;
padding: 0;
}
/*
* Allow only vertical resizing of textareas.
*/
textarea {
resize: vertical;
}
/* ==========================================================================
Browse Happy prompt
========================================================================== */
.browsehappy {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
/* ==========================================================================
Author's custom styles
========================================================================== */
/* ==========================================================================
Helper classes
========================================================================== */
/*
* Image replacement
*/
.ir {
background-color: transparent;
border: 0;
overflow: hidden;
/* IE 6/7 fallback */
*text-indent: -9999px;
}
.ir:before {
content: "";
display: block;
width: 0;
height: 150%;
}
/*
* Hide from both screenreaders and browsers: h5bp.com/u
*/
.hidden {
display: none !important;
visibility: hidden;
}
a,button,input{
outline: none;
}
/*
* Hide only visually, but have it available for screenreaders: h5bp.com/v
*/
.visuallyhidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/*
* Extends the .visuallyhidden class to allow the element to be focusable
* when navigated to via the keyboard: h5bp.com/p
*/
.visuallyhidden.focusable:active,
.visuallyhidden.focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
/*
* Hide visually and from screenreaders, but maintain layout
*/
.invisible {
visibility: hidden;
}
/*
* Clearfix: contain floats
*
* For modern browsers
* 1. The space content is one way to avoid an Opera bug when the
* `contenteditable` attribute is included anywhere else in the document.
* Otherwise it causes space to appear at the top and bottom of elements
* that receive the `clearfix` class.
* 2. The use of `table` rather than `block` is only necessary if using
* `:before` to contain the top-margins of child elements.
*/
.clearfix:before,
.clearfix:after {
content: " "; /* 1 */
display: table; /* 2 */
}
.clearfix:after {
clear: both;
}
/*
* For IE 6/7 only
* Include this rule to trigger hasLayout and contain floats.
*/
.clearfix {
*zoom: 1;
}
/* ==========================================================================
EXAMPLE Media Queries for Responsive Design.
These examples override the primary ('mobile first') styles.
Modify as content requires.
========================================================================== */
@media only screen and (min-width: 35em) {
/* Style adjustments for viewports that meet the condition */
}
@media print,
(-o-min-device-pixel-ratio: 5/4),
(-webkit-min-device-pixel-ratio: 1.25),
(min-resolution: 120dpi) {
/* Style adjustments for high resolution devices */
}
/* ==========================================================================
Print styles.
Inlined to avoid required HTTP connection: h5bp.com/r
========================================================================== */
@media print {
* {
background: transparent !important;
color: #000 !important; /* Black prints faster: h5bp.com/s */
box-shadow: none !important;
text-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
/*
* Don't show links for images, or javascript/internal links
*/
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group; /* h5bp.com/t */
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
body{
width: 100%;
height: 100%;
overflow: hidden;
background-color: #4e97f7 !important;
/*display: flex;*/
align-items: center;
justify-content: center;
}
.bg{
width: 887px;
height: 490px;
position: relative;
top:50%;
left:50%;
margin-top:-245px;
margin-left:-444px;
background: url("../img/form_bg.png") no-repeat center;
}
.loginContainer{
width: 435px;
position: absolute;
top: 80px;
/* left: 30px; */
}
.loginContainer h1{
color: #fff;
}
.login-box{
width: 310px;
box-sizing: border-box;
border-radius: 15px;
margin: 0 auto;
}
.login-box h2{
font-size: 20px;
color:#4d8dff ;
font-weight: bolder;
}
.login-box .radioGrop{
width:450px;
clear: both;
font-size: 12px;
margin-left:60px;
}
.radioGrop .radio {
float:left;
}
/*.radioGrop .radio:first-of-type label{*/
/* color:#4d8dff ;*/
/* */
/* */
/*}*/
.login-box small{
color: red;
}
.login-box .radio{
flex: 1;
position:relative;
}
.login-box .radioGrop input[type=radio]{
margin-top: 2px;
/* margin-right:20px;*/
position:absolute;
left:10px;
top:0;
}
.login-box button.btn{
border-radius: 15px;
outline-color:transparent;
}
.login-box a.btn{
/*word-break: normal;*/
white-space: normal;
/* text-align: center; */
width:140px;
font-size: 12px;
height: 48px;
/* text-decoration: dashed; */
}
.login-box .btn-primary {
background: -webkit-linear-gradient(left, #4d8dff, blue); /* Safari 5.1 - 6.0 */
background: -o-linear-gradient(right, #4d8dff, blue); /* Opera 11.1 - 12.0 */
background: -moz-linear-gradient(right, #4d8dff, blue); /* Firefox 3.6 - 15 */
background: linear-gradient(to right, #4d8dff, blue); /* 标准的语法 */
box-shadow: #4e97f7;
line-height: 2;
font-size: 20px;
}
.login-box
.bg-line{
margin: 30px auto;
border-top: 1px solid #333;
position: relative;
}
.bg-line span{
position: absolute;
top: -13px;
/* text-align: center; */
padding: 0 20px;
background: #fff;
left: 100px;
}
.login-box .input-group-addon{
background: none;
color:#4d8dff ;
}
.login-box a{
/* border:1px solid #4d8dff ; */
cursor: pointer;
color: #4d8dff;
text-decoration: underline;
}
.login-box .disable_a {
border:1px solid #ccc;
pointer-events: none;
color: #afafaf;
cursor: default;
}
.login-box .radio{
margin-right: 30px;
}
.login-box .radio {
word-break: keep-all;
}
.login-box .logBtn{
background: url("../img/btn_bg.png") no-repeat center;
background-size: contain;
border: none;
}
.login-box .radio+.radio
{
margin-top: 10px;
}
.login-box .btn-default:hover{
color: #fff;
background:#4d8dff ;
}
.login-btn{
font-size: 16px;
width: 200px;
height: 43px;
display: inline-block;
margin: 105px 0px 67px 42px;
border-radius: 21px;
background-color: #4E97F6;
/* background-image: linear-gradient(to right, #4E97F6, rgb(34, 124, 241)); */
color: white;
}
.login-span{
/* margin-top: 67px; */
}
@media screen and (min-width: 1025px) and (max-width: 1280px){
.bg{
background-size: initial;
}
}
@media screen and (min-width: 768px) and (max-width: 1024px){
.bg{
background-size: contain;
}
}
/* @media screen and (min-width: 1921px) and (max-width: 3000px) {
.bg{
width: 1600px;
height: 980px;
position: absolute;
top:0;
left:0;
bottom: 0;
right: 0;
margin: auto;
background-size: 100%;
background-color: #000;
background: url("../img/form_bg.png") no-repeat center;
}
.bg_box {
position: relative;
top: 0;
left: 0;
}
.loginContainer {
position: absolute;
top: 250px;
left: 12%;
margin-bottom: 22px;
}
.bg-form {
width: 100% !important;
}
.login-box {
width: 100%;
}
.login-box .radioGrop input[type=radio] {
margin-top: 8px;
}
.login-box h2 {
font-size: 40px;
}
.login-box .radioGrop {
font-size: 24px;
width: 100%;
min-height: 50px;
display: fiex;
justify-content: space-between;
margin-left: 0px;
margin-bottom: 22px;
}
.login-box .radio {
margin-right: 28px;
margin-bottom: 30px;
margin-left: 12px;
}
.login-box .radio:last-child {
margin-right: 0px;
}
.login-box small {
font-size: 22px;
padding-top: 10px;
}
.form-group {
margin-bottom: 22px;
}
.input-group-addon {
padding: 12px 24px;
font-size: 22px;
}
.form-control {
font-size: 22px;
height: 58px;
}
.btn {
padding: 12px 24px;
font-size: 22px;
}
.bg-line span {
font-size: 22px;
left: 220px;
}
.login-box a.btn {
width: auto;
font-size: 22px;
height: 60px;
}
} */
/*! HTML5 Boilerplate v4.3.0 | MIT License | http://h5bp.com/ */
/*
* What follows is the result of much research on cross-browser styling.
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
* Kroc Camen, and the H5BP dev community and team.
*/
/* ==========================================================================
Base styles: opinionated defaults
========================================================================== */
html,
button,
input,
select,
textarea {
color: #222;
}
html {
width: 100%;
height: 100%;
font-size: 1em;
line-height: 1.4;
}
/*
* Remove text-shadow in selection highlight: h5bp.com/i
* These selection rule sets have to be separate.
* Customize the background color to match your design.
*/
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
/*
* A better looking default horizontal rule
*/
hr {
display: block;
height: 1px;
border: 0;
border-top: 1px solid #ccc;
margin: 1em 0;
padding: 0;
}
/*
* Remove the gap between images, videos, audio and canvas and the bottom of
* their containers: h5bp.com/i/440
*/
audio,
canvas,
img,
video {
vertical-align: middle;
}
/*
* Remove default fieldset styles.
*/
fieldset {
border: 0;
margin: 0;
padding: 0;
}
/*
* Allow only vertical resizing of textareas.
*/
textarea {
resize: vertical;
}
/* ==========================================================================
Browse Happy prompt
========================================================================== */
.browsehappy {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
/* ==========================================================================
Author's custom styles
========================================================================== */
/* ==========================================================================
Helper classes
========================================================================== */
/*
* Image replacement
*/
.ir {
background-color: transparent;
border: 0;
overflow: hidden;
/* IE 6/7 fallback */
*text-indent: -9999px;
}
.ir:before {
content: "";
display: block;
width: 0;
height: 150%;
}
/*
* Hide from both screenreaders and browsers: h5bp.com/u
*/
.hidden {
display: none !important;
visibility: hidden;
}
a,
button,
input {
outline: none;
}
/*
* Hide only visually, but have it available for screenreaders: h5bp.com/v
*/
.visuallyhidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/*
* Extends the .visuallyhidden class to allow the element to be focusable
* when navigated to via the keyboard: h5bp.com/p
*/
.visuallyhidden.focusable:active,
.visuallyhidden.focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
/*
* Hide visually and from screenreaders, but maintain layout
*/
.invisible {
visibility: hidden;
}
/*
* Clearfix: contain floats
*
* For modern browsers
* 1. The space content is one way to avoid an Opera bug when the
* `contenteditable` attribute is included anywhere else in the document.
* Otherwise it causes space to appear at the top and bottom of elements
* that receive the `clearfix` class.
* 2. The use of `table` rather than `block` is only necessary if using
* `:before` to contain the top-margins of child elements.
*/
.clearfix:before,
.clearfix:after {
content: " ";
/* 1 */
display: table;
/* 2 */
}
.clearfix:after {
clear: both;
}
/*
* For IE 6/7 only
* Include this rule to trigger hasLayout and contain floats.
*/
.clearfix {
*zoom: 1;
}
/* ==========================================================================
EXAMPLE Media Queries for Responsive Design.
These examples override the primary ('mobile first') styles.
Modify as content requires.
========================================================================== */
@media only screen and (min-width: 35em) {
/* Style adjustments for viewports that meet the condition */
}
@media print,
(-o-min-device-pixel-ratio: 5/4),
(-webkit-min-device-pixel-ratio: 1.25),
(min-resolution: 120dpi) {
/* Style adjustments for high resolution devices */
}
/* ==========================================================================
Print styles.
Inlined to avoid required HTTP connection: h5bp.com/r
========================================================================== */
@media print {
* {
background: transparent !important;
color: #000 !important;
/* Black prints faster: h5bp.com/s */
box-shadow: none !important;
text-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " ("attr(href) ")";
}
abbr[title]:after {
content: " ("attr(title) ")";
}
/*
* Don't show links for images, or javascript/internal links
*/
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group;
/* h5bp.com/t */
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 0.5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
}
body {
width: 100%;
height: 100%;
overflow: hidden;
/* background-color: #4e97f7 !important; */
/*display: flex;*/
align-items: center;
justify-content: center;
}
.bg {
width: 887px;
height: 490px;
position: relative;
top: 50%;
left: 50%;
margin-top: -245px;
margin-left: -444px;
background: url("../img/form_bg.png") no-repeat center;
}
.loginContainer {
width: 600px;
position: absolute;
top: 80px;
left: 30px;
}
.loginContainer h1 {
color: #fff;
}
.login-box {
width: 450px;
box-sizing: border-box;
border-radius: 15px;
}
.login-box h2 {
font-size: 20px;
color: #4d8dff;
font-weight: bolder;
}
.login-box .radioGrop {
width: 450px;
clear: both;
font-size: 12px;
margin-left: 60px;
}
.radioGrop .radio {
float: left;
}
/*.radioGrop .radio:first-of-type label{*/
/* color:#4d8dff ;*/
/* */
/* */
/*}*/
.login-box small {
color: red;
}
.login-box .radio {
flex: 1;
position: relative;
}
.login-box .radioGrop input[type=radio] {
margin-top: 2px;
/* margin-right:20px;*/
position: absolute;
left: 10px;
top: 0;
}
.login-box button.btn {
border-radius: 15px;
outline-color: transparent;
}
.login-box a.btn {
/*word-break: normal;*/
white-space: normal;
text-align: center;
width: 140px;
font-size: 12px;
height: 48px;
}
.login-box .btn-primary {
background: -webkit-linear-gradient(left, #4d8dff, blue);
/* Safari 5.1 - 6.0 */
background: -o-linear-gradient(right, #4d8dff, blue);
/* Opera 11.1 - 12.0 */
background: -moz-linear-gradient(right, #4d8dff, blue);
/* Firefox 3.6 - 15 */
background: linear-gradient(to right, #4d8dff, blue);
/* 鏍囧噯鐨勮娉� */
box-shadow: #4e97f7;
line-height: 2;
font-size: 20px;
}
.login-box .bg-line {
margin: 30px auto;
border-top: 1px solid #333;
position: relative;
}
.bg-line span {
position: absolute;
top: -13px;
text-align: center;
padding: 0 20px;
background: #fff;
left: 100px;
}
.login-box .input-group-addon {
background: none;
color: #4d8dff;
}
.login-box a {
border: 1px solid #4d8dff;
color: #4d8dff;
}
.login-box .disable_a {
border: 1px solid #ccc;
pointer-events: none;
color: #afafaf;
cursor: default;
}
.login-box .radio {
margin-right: 30px;
}
.login-box .radio {
word-break: keep-all;
}
.login-box .logBtn {
background: url("../img/btn_bg.png") no-repeat center;
background-size: contain;
border: none;
}
.login-box .radio+.radio {
margin-top: 10px;
}
.login-box .btn-default:hover {
color: #fff;
background: #4d8dff;
}
@media screen and (min-width: 1025px) and (max-width: 1280px) {
.bg {
background-size: initial;
}
}
@media screen and (min-width: 768px) and (max-width: 1024px) {
.bg {
background-size: contain;
}
}
@media screen and (min-width: 1921px) {
.bg {
width: 1600px;
height: 980px;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
background-size: 100%;
background-color: #000;
background: url("../img/form_bg.png") no-repeat;
background-size: 100% 100%;
}
.bg_box {
position: relative;
top: 0;
left: 0;
}
.loginContainer {
position: absolute;
top: 250px;
left: 12%;
margin-bottom: 22px;
}
.bg-form {
width: 100% !important;
}
.login-box {
width: 100%;
}
.login-box .radioGrop input[type=radio] {
margin-top: 8px;
}
.login-box h2 {
font-size: 40px;
}
.login-box .radioGrop {
font-size: 24px;
width: 100%;
min-height: 50px;
display: fiex;
justify-content: space-between;
margin-left: 0px;
margin-bottom: 22px;
}
.login-box .radio {
margin-right: 28px;
margin-bottom: 30px;
margin-left: 12px;
}
.login-box .radio:last-child {
margin-right: 0px;
}
.login-box small {
font-size: 22px;
padding-top: 10px;
}
.form-group {
margin-bottom: 22px;
}
.input-group-addon {
padding: 12px 24px;
font-size: 22px;
}
.form-control {
font-size: 22px;
height: 58px;
}
.btn {
padding: 12px 24px;
font-size: 22px;
}
.bg-line span {
font-size: 22px;
left: 220px;
}
.login-box a.btn {
width: auto;
font-size: 22px;
height: 60px;
}
}
\ No newline at end of file
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big,
cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl,
dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, thead, tr, th, td, header {
margin: 0;
padding: 0;
border: 0;
}
ul li{ list-style:none;}
a{ text-decoration:none; outline:none;}
h1, h2, h3, h4 {
font-weight:normal;
}
html{
font-size:14px;
font-family:"Microsoft Yahei","微软雅黑"; color:#323232;
}
ul li{ list-style:none; margin: 0; padding: 0; border: 0;}
a{ text-decoration:none; -webkit-tap-highlight-color: transparent; }
.fl{ float:left; display:inline;}
.fr{ float:right; display:inline;}
.none{ display:none;}
.clearfix{overflow:hidden;_zoom:1;}
.clear{ clear:both;}
::-webkit-input-placeholder { /* WebKit browsers */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
::-moz-placeholder { /* Mozilla Firefox 19+ */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
:-ms-input-placeholder { /* Internet Explorer 10+ */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
.top{ width:100%; height:115px; border-top:solid 5px #87abe0;}
.main{ width:80%; max-width: 1070px; height:auto; margin-left:auto; margin-right:auto;}
.bottom{ width:100%; height:239px; background:#fff url(../img/Login-b.jpg) no-repeat top center; }
.pbottom{ position:absolute; bottom:0px;}
.bottom > p{ color:#aab9c5; font-size:12px; line-height:75px; text-align:center; }
.login-c{ width:100%; height:603px; background:url(../img/login-bg.jpg) no-repeat center center;}
.login-list{ width: 100%; }
ul.login-list-ul{ width:442px; height:285px; padding-left:30px; padding-top:25px; background:url(../img/login-list-bg.png) no-repeat top left;}
ul.login-list-ul > li > a{ padding-left:26px; width:416px; display:block; height:35px; line-height:35px; background:url(../img/li-icon.png) no-repeat left center; color:#313131; font-size:14px; }
ul.login-list-ul > li > a:hover{ text-decoration:underline;}
.login-form{ background-color:#fbfbfb; border-radius:3px; box-shadow:0px 0px 3px rgba(0,0,0,.15); width:270px; margin-top:90px;}
.login-form-h2{ border-bottom:solid 1px #f2f2f2; text-align:center; color:#565656; font-size:16px; line-height:55px; }
.login-form-tip{ background:url(../img/tip-tline.jpg) repeat-x top left; padding-top:16px; padding-bottom:20px; width:260px; margin-left:auto; margin-right:auto; }
.login-form-tip > p{ color:#9b9b9b; font-size:12px; -webkit-transform:scale(0.95,0.95) ; *font-size:11px; line-height:1.8em;}
.login-form-tip > p > a{ color:#5c5c5b; text-decoration:underline;}
.login-jump{height:110px; padding-top:50px; padding-bottom:50px;}
dl.jump-select-dl{ width:213px; height:38px; border:solid 1px #c1c1c1; margin-left:auto; margin-right:auto;}
dl.jump-select-dl dt{ width:37px; height:28px; padding-top:5px; padding-bottom:5px; float:left; display:inline; background:url(../img/user.png) no-repeat center center;}
dl.jump-select-dl > dt >span{ display:block; width:36px; height:28px; border-right:solid 1px #c1c1c1;}
dl.jump-select-dl dd{ width:176px; height:38px; float:right; display:inline;}
select.jump-select {
width: 176px;
padding-left:15px;
padding-right:30px;
font-family:"Microsoft Yahei","微软雅黑";
font-size:14px;
color: #c1c1c1;
height:38px;
-moz-appearance:none;
appearance: none;
-webkit-appearance: none;
outline:none;
border:none;
background:url(../img/select-arrow.png) no-repeat center right;
/*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/
order: solid 1px #000;
}
.login-jump-btn{ width:215px; height:37px; margin-top:30px; margin-left:auto; margin-right:auto; }
select::-ms-expand { display: none; }
a.jump-btn{ width:135px; height:37px; display:block; background:url(../img/login-jump-btn1.jpg) no-repeat left center;}
a.help-btn{ width:65px; height:37px; display:block; background:url(../img/help-btn.jpg) no-repeat left center;}
.login-eduroam{ padding-top:65px; height:465px;}
.login-eduroam-form{ width:462px; height:465px; margin-left:auto; margin-right:auto; background-color:#fdfcfc; border-radius:3px; box-shadow:0px 0px 3px rgba(0,0,0,.15); }
.login-eduroam-form > h2{ color:#565656; font-size:18px; padding-top:12px; line-height:2em; text-align:center;}
.login-eduroam-form > h3{ width:100%; background:url(../img/line2.jpg) repeat-x left center; height:20px; text-align:center; }
.login-eduroam-form > h3 > span{color:#85b4ed; font-family:Arial; font-size:12px; -webkit-transform:scale(0.95,0.95) ; *font-size:11px; line-height:1.8em; text-transform:uppercase; background-color:#fcfcfc; display:inline-block; padding-left:10px; padding-right:10px;}
.login-eduroam-tip{background: url(../img/tip-tline.jpg) repeat-x top left; padding-top:15px; padding-bottom:15px; text-align:center;}
ul.eduroam-ul{ margin-left:60px; width:315px;}
ul.eduroam-ul > li > a{ width:300px; padding-left:15px; display:block; text-align:left; background:url(../img/eduroam-li.png) no-repeat left center; color:#959595; font-size:12px; line-height:20px;}
ul.eduroam-ul > li > a > span{ color:#729dd1; font-family:Arial; font-size:12px; -webkit-transform:scale(0.95,0.95) ; *font-size:11px; text-transform:uppercase; display:inline-block; padding-left:5px;}
.login-eduroam-line{ width:346px; height:auto; margin-left:auto; margin-right:auto; margin-top:10px;}
a.login-btn{ width:346px; height:44px; margin-bottom:25px; margin-top:35px; display:block; background:url(../img/login-btn.png) no-repeat top center; }
dl.login-eduroam-txt{ border:solid 1px #c1c1c1; height:38px; width:344px; margin-top:25px;}
dl.login-eduroam-txt dt{ width:37px; height:38px; float:left; display:inline;}
dl.login-eduroam-txt dd{ width:305px; height:28px; padding-top:5px; padding-bottom:5px; float:right; display:inline;}
dl.login-eduroam-txt-user dt{ background:url(../img/user.png) no-repeat center center;}
dl.login-eduroam-txt-password dt{ background:url(../img/password.png) no-repeat center center;}
.login-eduroam-input{ border-left:solid 1px #c1c1c1; width:284px; height:28px; padding:0px 10px; margin:0px; border-bottom:0px; border-right:0px; border-top:0px; outline:none; font-size:14px; line-height:28px; color:#565656;}
.content{padding-top: 200px;font: 20px bold;text-align: center;}
\ No newline at end of file
/*! normalize1.css v1.1.3 | MIT License | git.io/normalize */
/* ==========================================================================
HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
/**
* Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
*/
audio,
canvas,
video {
display: inline-block;
*display: inline;
*zoom: 1;
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
* Known issue: no IE 6 support.
*/
[hidden] {
display: none;
}
/* ==========================================================================
Base
========================================================================== */
/**
* 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
* `em` units.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-size: 100%; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Address `font-family` inconsistency between `textarea` and other form
* elements.
*/
html,
button,
input,
label,
h2,
span,
a,
select,
textarea {
font-family: sans-serif;
}
/**
* Address margins handled incorrectly in IE 6/7.
*/
body {
margin: 0;
}
/* ==========================================================================
Links
========================================================================== */
/**
* Address `outline` inconsistency between Chrome and other browsers.
*/
a:focus {
outline: thin dotted;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* ==========================================================================
Typography
========================================================================== */
/**
* Address font sizes and margins set differently in IE 6/7.
* Address font sizes within `section` and `article` in Firefox 4+, Safari 5,
* and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
h2 {
font-size: 1.5em;
margin: 0.83em 0;
}
h3 {
font-size: 1.17em;
margin: 1em 0;
}
h4 {
font-size: 1em;
margin: 1.33em 0;
}
h5 {
font-size: 0.83em;
margin: 1.67em 0;
}
h6 {
font-size: 0.67em;
margin: 2.33em 0;
}
/**
* Address styling not present in IE 7/8/9, Safari 5, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.
*/
b,
strong {
font-weight: bold;
}
blockquote {
margin: 1em 40px;
}
/**
* Address styling not present in Safari 5 and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address differences between Firefox and other browsers.
* Known issue: no IE 6/7 normalization.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Address styling not present in IE 6/7/8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address margins set differently in IE 6/7.
*/
p,
pre {
margin: 1em 0;
}
/**
* Correct font family set oddly in IE 6, Safari 4/5, and Chrome.
*/
code,
kbd,
pre,
samp {
font-family: monospace, serif;
_font-family: 'courier new', monospace;
font-size: 1em;
}
/**
* Improve readability of pre-formatted text in all browsers.
*/
pre {
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
/**
* Address CSS quotes not supported in IE 6/7.
*/
q {
quotes: none;
}
/**
* Address `quotes` property not supported in Safari 4.
*/
q:before,
q:after {
content: '';
content: none;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* ==========================================================================
Lists
========================================================================== */
/**
* Address margins set differently in IE 6/7.
*/
dl,
menu,
ol,
ul {
margin: 1em 0;
}
dd {
margin: 0 0 0 40px;
}
/**
* Address paddings set differently in IE 6/7.
*/
menu,
ol,
ul {
padding: 0 0 0 40px;
}
/**
* Correct list images handled incorrectly in IE 7.
*/
nav ul,
nav ol {
list-style: none;
list-style-image: none;
}
/* ==========================================================================
Embedded content
========================================================================== */
/**
* 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
* 2. Improve image quality when scaled in IE 7.
*/
img {
border: 0; /* 1 */
-ms-interpolation-mode: bicubic; /* 2 */
}
/**
* Correct overflow displayed oddly in IE 9.
*/
svg:not(:root) {
overflow: hidden;
}
/* ==========================================================================
Figures
========================================================================== */
/**
* Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
*/
figure {
margin: 0;
}
/* ==========================================================================
Forms
========================================================================== */
/**
* Correct margin displayed oddly in IE 6/7.
*/
form {
margin: 0;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct color not being inherited in IE 6/7/8/9.
* 2. Correct text not wrapping in Firefox 3.
* 3. Correct alignment displayed oddly in IE 6/7.
*/
legend {
border: 0; /* 1 */
padding: 0;
white-space: normal; /* 2 */
*margin-left: -7px; /* 3 */
}
/**
* 1. Correct font size not being inherited in all browsers.
* 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
* and Chrome.
* 3. Improve appearance and consistency in all browsers.
*/
button,
input,
select,
textarea {
font-size: 100%; /* 1 */
margin: 0; /* 2 */
vertical-align: baseline; /* 3 */
*vertical-align: middle; /* 3 */
}
/**
* Address Firefox 3+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
button,
input {
line-height: normal;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
* Correct `select` style inheritance in Firefox 4+ and Opera.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
* 4. Remove inner spacing in IE 7 without affecting normal text inputs.
* Known issue: inner spacing remains in IE 6.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
*overflow: visible; /* 4 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* 1. Address box sizing set to content-box in IE 8/9.
* 2. Remove excess padding in IE 8/9.
* 3. Remove excess padding in IE 7.
* Known issue: excess padding remains in IE 6.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
*height: 13px; /* 3 */
*width: 13px; /* 3 */
}
/**
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari 5 and Chrome
* on OS X.
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Remove inner padding and border in Firefox 3+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* 1. Remove default vertical scrollbar in IE 6/7/8/9.
* 2. Improve readability and alignment in all browsers.
*/
textarea {
overflow: auto; /* 1 */
vertical-align: top; /* 2 */
}
/* ==========================================================================
Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
\ No newline at end of file
body {
overflow: auto;
}
.static{
width: 800px;
margin: 0 auto;
background-color: white;
}
.static-title{
font-size: 20px;
text-align: center;
padding-top: 50px;
padding-bottom: 30px;
margin-top: 0;
}
.p-class{
margin-left: 120px;
display: flex;
}
.p-label{
flex-basis: 200px;
text-align: right;
margin-right: 10px;
}
.p-num{
margin-right: 10px;
}
var Browser = function(userAgent){
var u = userAgent||navigator.userAgent;
var _this = this;
var match = {
//内核
Trident: u.indexOf('Trident')>0||u.indexOf('NET CLR')>0,
Presto: u.indexOf('Presto')>0,
WebKit: u.indexOf('AppleWebKit')>0,
Gecko: u.indexOf('Gecko/')>0,
//浏览器
UC: u.indexOf('UC')>0||u.indexOf(' UBrowser')>0,
QQBrowser: u.indexOf('QQBrowser')>0,
QQ: u.indexOf('QQ/')>0,
Baidu: u.indexOf('Baidu')>0||u.indexOf('BIDUBrowser')>0,
Maxthon: u.indexOf('Maxthon')>0,
LBBROWSER: u.indexOf('LBBROWSER')>0,
Sogou: u.indexOf('MetaSr')>0||u.indexOf('Sogou')>0,
IE: u.indexOf('MSIE')>0||u.indexOf('Trident')>0,
Firefox: u.indexOf('Firefox')>0,
Opera: u.indexOf('Opera')>0||u.indexOf('OPR')>0,
Safari: u.indexOf('Safari')>0,
Chrome:u.indexOf('Chrome')>0||u.indexOf('CriOS')>0,
Wechat:u.indexOf('MicroMessenger')>0,
Taobao:u.indexOf('AliApp(TB')>0,
Alipay:u.indexOf('AliApp(AP')>0,
Weibo:u.indexOf('Weibo')>0,
Suning:u.indexOf('SNEBUY-APP')>0,
iQiYi:u.indexOf('IqiyiApp')>0,
//系统或平台
Windows:u.indexOf('Windows')>0,
Linux:u.indexOf('Linux')>0,
Mac:u.indexOf('Macintosh')>0,
Android:u.indexOf('Android')>0||u.indexOf('Adr')>0,
WP:u.indexOf('IEMobile')>0,
BlackBerry:u.indexOf('BlackBerry')>0||u.indexOf('RIM')>0||u.indexOf('BB')>0,
MeeGo:u.indexOf('MeeGo')>0,
Symbian:u.indexOf('Symbian')>0,
iOS:u.indexOf('like Mac OS X')>0,
iPhone: u.indexOf('iPh')>0,
iPad:u.indexOf('iPad')>0,
//设备
Mobile:u.indexOf('Mobi')>0||u.indexOf('iPh')>0||u.indexOf('480')>0,
Tablet:u.indexOf('Tablet')>0||u.indexOf('iPad')>0||u.indexOf('Nexus 7')>0
};
//修正
if(match.Mobile){
match.Mobile = !match.iPad;
}
//基本信息
var hash = {
engine:['WebKit','Trident','Gecko','Presto'],
browser:['Safari','Chrome','IE','Firefox','Opera','UC','QQBrowser','Baidu'],
os:['Windows','Linux','Mac','Android','iOS','iPhone','iPad'],
device:['Mobile','Tablet']
};
_this.device = 'PC';
_this.language = (function(){
var g = (navigator.browserLanguage || navigator.language).toLowerCase();
return g=="c"?"zh-cn":g;
})();
for(var s in hash){
for(var i=0;i< hash[s].length;i++){
var value = hash[s][i];
if(match[value]){
_this[s] = value;
}
}
if (!_this[s]) {
_this[s] = 'others'
}
}
//版本信息
var version = {
'Chrome':function(){
return u.replace(/^.*Chrome\/([\d.]+).*$/,'$1');
},
'IE':function(){
var v = u.replace(/^.*MSIE ([\d.]+).*$/,'$1');
if(v==u){
v = u.replace(/^.*rv:([\d.]+).*$/,'$1');
}
return v!=u?v:'';
},
'Firefox':function(){
return u.replace(/^.*Firefox\/([\d.]+).*$/,'$1');
},
'Safari':function(){
return u.replace(/^.*Version\/([\d.]+).*$/,'$1');
},
'Maxthon':function(){
return u.replace(/^.*Maxthon\/([\d.]+).*$/,'$1');
},
'QQBrowser':function(){
return u.replace(/^.*QQBrowser\/([\d.]+).*$/,'$1');
},
'QQ':function(){
return u.replace(/^.*QQ\/([\d.]+).*$/,'$1');
},
'Baidu':function(){
return u.replace(/^.*BIDUBrowser[\s\/]([\d.]+).*$/,'$1');
},
'UC':function(){
return u.replace(/^.*UC?Browser\/([\d.]+).*$/,'$1');
},
'Wechat':function(){
return u.replace(/^.*MicroMessenger\/([\d.]+).*$/,'$1');
},
'Taobao':function(){
return u.replace(/^.*AliApp\(TB\/([\d.]+).*$/,'$1');
},
'Alipay':function(){
return u.replace(/^.*AliApp\(AP\/([\d.]+).*$/,'$1');
},
'Weibo':function(){
return u.replace(/^.*weibo__([\d.]+).*$/,'$1');
},
'Suning':function(){
return u.replace(/^.*SNEBUY-APP([\d.]+).*$/,'$1');
},
'iQiYi':function(){
return u.replace(/^.*IqiyiVersion\/([\d.]+).*$/,'$1');
}
};
_this.version = '';
if(version[_this.browser]){
_this.version = version[_this.browser]();
}
};
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
//@ sourceMappingURL=jquery-1.10.2.min.map
*/
(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("normalize.css")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"normalize.css")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e, t, n, r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e, t, n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e, t, n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("normalize.css"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t, n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e, n, r, i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e, l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
var Browser = function(userAgent){
var u = userAgent||navigator.userAgent;
var _this = this;
var match = {
//内核
Trident: u.indexOf('Trident')>0||u.indexOf('NET CLR')>0,
Presto: u.indexOf('Presto')>0,
WebKit: u.indexOf('AppleWebKit')>0,
Gecko: u.indexOf('Gecko/')>0,
//浏览器
UC: u.indexOf('UC')>0||u.indexOf(' UBrowser')>0,
QQBrowser: u.indexOf('QQBrowser')>0,
QQ: u.indexOf('QQ/')>0,
Baidu: u.indexOf('Baidu')>0||u.indexOf('BIDUBrowser')>0,
Maxthon: u.indexOf('Maxthon')>0,
LBBROWSER: u.indexOf('LBBROWSER')>0,
Sogou: u.indexOf('MetaSr')>0||u.indexOf('Sogou')>0,
IE: u.indexOf('MSIE')>0||u.indexOf('Trident')>0,
Firefox: u.indexOf('Firefox')>0,
Opera: u.indexOf('Opera')>0||u.indexOf('OPR')>0,
Safari: u.indexOf('Safari')>0,
Chrome:u.indexOf('Chrome')>0||u.indexOf('CriOS')>0,
Wechat:u.indexOf('MicroMessenger')>0,
Taobao:u.indexOf('AliApp(TB')>0,
Alipay:u.indexOf('AliApp(AP')>0,
Weibo:u.indexOf('Weibo')>0,
Suning:u.indexOf('SNEBUY-APP')>0,
iQiYi:u.indexOf('IqiyiApp')>0,
//系统或平台
Windows:u.indexOf('Windows')>0,
Linux:u.indexOf('Linux')>0,
Mac:u.indexOf('Macintosh')>0,
Android:u.indexOf('Android')>0||u.indexOf('Adr')>0,
WP:u.indexOf('IEMobile')>0,
BlackBerry:u.indexOf('BlackBerry')>0||u.indexOf('RIM')>0||u.indexOf('BB')>0,
MeeGo:u.indexOf('MeeGo')>0,
Symbian:u.indexOf('Symbian')>0,
iOS:u.indexOf('like Mac OS X')>0,
iPhone: u.indexOf('iPh')>0,
iPad:u.indexOf('iPad')>0,
//设备
Mobile:u.indexOf('Mobi')>0||u.indexOf('iPh')>0||u.indexOf('480')>0,
Tablet:u.indexOf('Tablet')>0||u.indexOf('iPad')>0||u.indexOf('Nexus 7')>0
};
//修正
if(match.Mobile){
match.Mobile = !match.iPad;
}
//基本信息
var hash = {
engine:['WebKit','Trident','Gecko','Presto'],
browser:['Safari','Chrome','IE','Firefox','Opera','UC','QQBrowser','Baidu'],
os:['Windows','Linux','Mac','Android','iOS','iPhone','iPad'],
device:['Mobile','Tablet']
};
_this.device = 'PC';
_this.language = (function(){
var g = (navigator.browserLanguage || navigator.language).toLowerCase();
return g=="c"?"zh-cn":g;
})();
for(var s in hash){
for(var i=0;i< hash[s].length;i++){
var value = hash[s][i];
if(match[value]){
_this[s] = value;
}
}
if (!_this[s]) {
_this[s] = 'others'
}
}
//版本信息
var version = {
'Chrome':function(){
return u.replace(/^.*Chrome\/([\d.]+).*$/,'$1');
},
'IE':function(){
var v = u.replace(/^.*MSIE ([\d.]+).*$/,'$1');
if(v==u){
v = u.replace(/^.*rv:([\d.]+).*$/,'$1');
}
return v!=u?v:'';
},
'Firefox':function(){
return u.replace(/^.*Firefox\/([\d.]+).*$/,'$1');
},
'Safari':function(){
return u.replace(/^.*Version\/([\d.]+).*$/,'$1');
},
'Maxthon':function(){
return u.replace(/^.*Maxthon\/([\d.]+).*$/,'$1');
},
'QQBrowser':function(){
return u.replace(/^.*QQBrowser\/([\d.]+).*$/,'$1');
},
'QQ':function(){
return u.replace(/^.*QQ\/([\d.]+).*$/,'$1');
},
'Baidu':function(){
return u.replace(/^.*BIDUBrowser[\s\/]([\d.]+).*$/,'$1');
},
'UC':function(){
return u.replace(/^.*UC?Browser\/([\d.]+).*$/,'$1');
},
'Wechat':function(){
return u.replace(/^.*MicroMessenger\/([\d.]+).*$/,'$1');
},
'Taobao':function(){
return u.replace(/^.*AliApp\(TB\/([\d.]+).*$/,'$1');
},
'Alipay':function(){
return u.replace(/^.*AliApp\(AP\/([\d.]+).*$/,'$1');
},
'Weibo':function(){
return u.replace(/^.*weibo__([\d.]+).*$/,'$1');
},
'Suning':function(){
return u.replace(/^.*SNEBUY-APP([\d.]+).*$/,'$1');
},
'iQiYi':function(){
return u.replace(/^.*IqiyiVersion\/([\d.]+).*$/,'$1');
}
};
_this.version = '';
if(version[_this.browser]){
_this.version = version[_this.browser]();
}
};
var Browser = function(userAgent){
var u = userAgent||navigator.userAgent;
var _this = this;
var match = {
//内核
Trident: u.indexOf('Trident')>0||u.indexOf('NET CLR')>0,
Presto: u.indexOf('Presto')>0,
WebKit: u.indexOf('AppleWebKit')>0,
Gecko: u.indexOf('Gecko/')>0,
//浏览器
UC: u.indexOf('UC')>0||u.indexOf(' UBrowser')>0,
QQBrowser: u.indexOf('QQBrowser')>0,
QQ: u.indexOf('QQ/')>0,
Baidu: u.indexOf('Baidu')>0||u.indexOf('BIDUBrowser')>0,
Maxthon: u.indexOf('Maxthon')>0,
LBBROWSER: u.indexOf('LBBROWSER')>0,
Sogou: u.indexOf('MetaSr')>0||u.indexOf('Sogou')>0,
IE: u.indexOf('MSIE')>0||u.indexOf('Trident')>0,
Firefox: u.indexOf('Firefox')>0,
Opera: u.indexOf('Opera')>0||u.indexOf('OPR')>0,
Safari: u.indexOf('Safari')>0,
Chrome:u.indexOf('Chrome')>0||u.indexOf('CriOS')>0,
Wechat:u.indexOf('MicroMessenger')>0,
Taobao:u.indexOf('AliApp(TB')>0,
Alipay:u.indexOf('AliApp(AP')>0,
Weibo:u.indexOf('Weibo')>0,
Suning:u.indexOf('SNEBUY-APP')>0,
iQiYi:u.indexOf('IqiyiApp')>0,
//系统或平台
Windows:u.indexOf('Windows')>0,
Linux:u.indexOf('Linux')>0,
Mac:u.indexOf('Macintosh')>0,
Android:u.indexOf('Android')>0||u.indexOf('Adr')>0,
WP:u.indexOf('IEMobile')>0,
BlackBerry:u.indexOf('BlackBerry')>0||u.indexOf('RIM')>0||u.indexOf('BB')>0,
MeeGo:u.indexOf('MeeGo')>0,
Symbian:u.indexOf('Symbian')>0,
iOS:u.indexOf('like Mac OS X')>0,
iPhone: u.indexOf('iPh')>0,
iPad:u.indexOf('iPad')>0,
//设备
Mobile:u.indexOf('Mobi')>0||u.indexOf('iPh')>0||u.indexOf('480')>0,
Tablet:u.indexOf('Tablet')>0||u.indexOf('iPad')>0||u.indexOf('Nexus 7')>0
};
//修正
if(match.Mobile){
match.Mobile = !match.iPad;
}
//基本信息
var hash = {
engine:['WebKit','Trident','Gecko','Presto'],
browser:['Safari','Chrome','IE','Firefox','Opera','UC','QQBrowser','Baidu'],
os:['Windows','Linux','Mac','Android','iOS','iPhone','iPad'],
device:['Mobile','Tablet']
};
_this.device = 'PC';
_this.language = (function(){
var g = (navigator.browserLanguage || navigator.language).toLowerCase();
return g=="c"?"zh-cn":g;
})();
for(var s in hash){
for(var i=0;i< hash[s].length;i++){
var value = hash[s][i];
if(match[value]){
_this[s] = value;
}
}
if (!_this[s]) {
_this[s] = 'others'
}
}
//版本信息
var version = {
'Chrome':function(){
return u.replace(/^.*Chrome\/([\d.]+).*$/,'$1');
},
'IE':function(){
var v = u.replace(/^.*MSIE ([\d.]+).*$/,'$1');
if(v==u){
v = u.replace(/^.*rv:([\d.]+).*$/,'$1');
}
return v!=u?v:'';
},
'Firefox':function(){
return u.replace(/^.*Firefox\/([\d.]+).*$/,'$1');
},
'Safari':function(){
return u.replace(/^.*Version\/([\d.]+).*$/,'$1');
},
'Maxthon':function(){
return u.replace(/^.*Maxthon\/([\d.]+).*$/,'$1');
},
'QQBrowser':function(){
return u.replace(/^.*QQBrowser\/([\d.]+).*$/,'$1');
},
'QQ':function(){
return u.replace(/^.*QQ\/([\d.]+).*$/,'$1');
},
'Baidu':function(){
return u.replace(/^.*BIDUBrowser[\s\/]([\d.]+).*$/,'$1');
},
'UC':function(){
return u.replace(/^.*UC?Browser\/([\d.]+).*$/,'$1');
},
'Wechat':function(){
return u.replace(/^.*MicroMessenger\/([\d.]+).*$/,'$1');
},
'Taobao':function(){
return u.replace(/^.*AliApp\(TB\/([\d.]+).*$/,'$1');
},
'Alipay':function(){
return u.replace(/^.*AliApp\(AP\/([\d.]+).*$/,'$1');
},
'Weibo':function(){
return u.replace(/^.*weibo__([\d.]+).*$/,'$1');
},
'Suning':function(){
return u.replace(/^.*SNEBUY-APP([\d.]+).*$/,'$1');
},
'iQiYi':function(){
return u.replace(/^.*IqiyiVersion\/([\d.]+).*$/,'$1');
}
};
_this.version = '';
if(version[_this.browser]){
_this.version = version[_this.browser]();
}
};
<!DOCTYPE html>
<!--[if lt IE 7]>
<html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>
<html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>
<html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海市中小学数字教材登录统计</title>
<link rel="stylesheet" th:href="@{/static/css/main_0216.css}"/>
<link rel="stylesheet" th:href="@{/static/css/bootstrap.min.css}"/>
<link rel="stylesheet" th:href="@{/static/css/normalize.css}"/>
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body style="background-color: #4e97f7 !important;">
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<!-- Add your site or application content here -->
<div class="bg">
<div class="bg-form">
<div class="loginContainer">
<div class="login-box text-center">
<form class="form" method="post">
<h2 class="text-center" style="margin-top: 30px;">数字教材统一认证登录统计</h2>
<div class="bg-form" style="width: 80%;margin: 50px auto">
<div class="form-group text-left" style="float: left">
<div class="input-group">
<span class="input-group-addon" id="basic-addon1"><span aria-hidden="true" class="glyphicon glyphicon-user"></span></span>
<input aria-describedby="basic-addon1" autocomplete="off" class="form-control" id="username" placeholder="请输入管理员账号" size="25" tabindex="1" type="text" name="userName" value="" />
</div>
</div>
<div class="form-group text-left" style="float: left">
<div class="input-group">
<span class="input-group-addon " id="basic-addon2"> <span aria-hidden="true" class="glyphicon glyphicon-lock"></span></span>
<input aria-describedby="basic-addon1" autocomplete="off" class="form-control" id="password" placeholder="请输入管理员密码" size="25" tabindex="2" type="password" name="pwd" />
</div>
</div>
<button accesskey="l" class="btn btn-primary btn-block" id="login-button" style="outline: 0" tabindex="6" type="button" onclick="toLogin()">登录
</button>
</div>
</form>
</div>
<!-- <div class="login-box">
<button onclick="toLogin(1)" accesskey="l" class="login-btn" id="login-button" name="button" style="outline: 0" type="button">登录
</button>
</div> -->
</div>
</div>
</div>
<script th:inline="javascript">
/*<![CDATA[*/
var ctxPath = /*[[@{/}]]*/ '';
/*]]>*/
</script>
<script type="text/javascript">
function toLogin () {
var action = ctxPath + "log/doLogin";
$("form").attr("action", action);
$("form").submit();
}
</script>
</body></html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海市中小学数字教材</title>
<link rel="stylesheet" th:href="@{/static/css/ds.css}" />
<link rel="stylesheet" th:href="@{/static/css/bootstrap.min.css}" />
<link rel="stylesheet" th:href="@{/static/css/normalize.css}" />
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<script type="text/javascript" src="../static/js/browser.js"></script>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<!--[if lt IE 7]>
<p class="browsehappy">
You are using an <strong>outdated</strong> browser. Please
<a href="http://browsehappy.com/">upgrade your browser</a> to improve
your experience.
</p>
<![endif]-->
<!-- Add your site or application content here -->
<div class="ds">
<div class="ds-header">
<img class="ds-header-img" th:src="@{/static/img/Rlogo.jpg}" alt="" />
</div>
<div class="ds-content">
<div class="ds-content-mask">
<p class="ds-content-title">发现服务 · 速享之旅</p>
<div class="ds-content-city">
<p>市认证源</p>
<button
onclick="toLogin('djg')"
class="logo-btn djg-btn"
style="background: white url('../static/img/logo-djg.png')"
type="button"
></button>
</div>
<div class="ds-divide-line"></div>
<div class="ds-content-district">
<p>区认证源</p>
<div>
<button
onclick="toLogin('qpjy')"
class="logo-btn idp-btn"
style="background: url('../static/img/logo-qp.png')"
type="button"
></button>
<button
onclick="toLogin('jsyd')"
class="logo-btn idp-btn logo-btn-mask"
disabled="disabled"
style="background: url('../static/img/logo-js.png')"
type="button"
></button>
<button
onclick="toLogin('hpjy')"
class="logo-btn idp-btn logo-btn-mask"
disabled="disabled"
style="background: url('../static/img/logo-hp.png')"
type="button"
></button>
<button
onclick="toLogin('fxjy')"
class="logo-btn idp-btn logo-btn-mask"
disabled="disabled"
style="background: url('../static/img/logo-fx.png')"
type="button"
></button>
<button
onclick="toLogin('pdjy')"
class="logo-btn idp-btn logo-btn-mask"
disabled="disabled"
style="background: url('../static/img/logo-pd.png')"
type="button"
></button>
<button
onclick="toLogin('ypjy')"
class="logo-btn idp-btn logo-btn-mask"
disabled="disabled"
style="background: url('../static/img/logo-yp.png')"
type="button"
></button>
<button
onclick="toLogin('cnjy')"
class="logo-btn idp-btn logo-btn-mask"
disabled="disabled"
style="background: url('../static/img/logo-cn.png')"
type="button"
></button>
</div>
</div>
<p class="ds-content-text">点击图标前往所属认证源 · · ·</p>
<div class="szjc-login">
<p>如果您曾经参与上海市中小学数字教材试验项目,</p>
<p><a style="color: red;" onclick="toLogin('szjc')">请点击此处使用数字教材账号登录>></a></p>
</div>
</div>
</div>
<div class="ds-footer">
<p class="ds-content-text">版权所有&copy;上海教育认证中心</p>
</div>
</div>
<script th:inline="javascript">
/*<![CDATA[*/
var loginUrl1 = [[${loginUrl1}]];
var loginUrl2 = [[${loginUrl2}]];
var loginUrl3 = [[${loginUrl3}]];
var logId = [[${logId}]];
var ctxPath = /*[[@{/}]]*/ '';
/*]]>*/
</script>
<script type="text/javascript">
function toLogin(idp) {
var info = new Browser();
var baseUrl = ctxPath + "auth/tologin?logId="+logId+"&oauthType=";
if (idp=="djg") {
window.location.href = baseUrl+ "dianjiaoguan&loginUrl=" + encodeURIComponent(loginUrl1)+"&browser="+info.browser+"&device="+info.device+"&os="+info.os+"&version="+info.version;
} else if (idp=="szjc") {
window.location.href = baseUrl+ "edenoperation&loginUrl=" + encodeURIComponent(loginUrl2)+"&browser="+info.browser+"&device="+info.device+"&os="+info.os+"&version="+info.version;
} else {
window.location.href = baseUrl+"qpjy&loginUrl=" + encodeURIComponent(loginUrl3+"&auth_source="+idp)+"&browser="+info.browser+"&device="+info.device+"&os="+info.os+"&version="+info.version;
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title></title>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<span th:text="${message}"></span>
</body></html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海数字教材运营管理中心</title>
<link rel="stylesheet" th:href="@{/static/css/main_0216.css}"/>
<link rel="stylesheet" th:href="@{/static/css/bootstrap.min.css}"/>
<link rel="stylesheet" th:href="@{/static/css/normalize.css}"/>
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<script type="text/javascript" src="@{/staticjs/utils.js}"></script>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<div class="bg">
<div class="bg-form">
<div class="loginContainer">
<!--<h1>上海数字教材运营管理中心</h1>-->
<div class="login-box">
<!-- <div class="bg-form" style="width: 80%;margin: 0 auto"></div> -->
<button onclick="toLogin(1)" accesskey="l" class="login-btn" id="login-button" name="button" style="outline:0;" type="button">登录
</button>
<div class="login-span"><span>如果您曾经参与上海市中小学数字教材试验项目,</span><span><a style="color:red;"onclick="toLogin(2)">请点击此处使用数字教材账号登录>></a></span></div> <!-- </div> -->
</div>
</div>
</div>
</div>
<script th:inline="javascript">
/*<![CDATA[*/
var loginUrl1 = [[${loginUrl1}]];
var loginUrl2 = [[${loginUrl2}]];
var logId = [[${logId}]];
var ctxPath = /*[[@{/}]]*/ '';
/*]]>*/
</script>
<script type="text/javascript">
function toLogin (num) {
var baseUrl = ctxPath + "auth/tologin?logId="+logId+"&oauthType=";
//var baseUrl = ctxPath + "auth/tologin?oauthType=";
if (num === 1) {
window.location.href = baseUrl+ "dianjiaoguan&loginUrl=" + encodeURIComponent(loginUrl1);
} else if (num === 2) {
window.location.href = baseUrl+ "edenoperation&loginUrl=" + encodeURIComponent(loginUrl2);
}
return false;
}
</script>
<script>
/*<![CDATA[*/
var loginUrl1 = './ds.html';
var loginUrl2 = 'https://operator-api-test.etextbook.cn/cas/oauth2.0/authorize?client_id=testClentId&redirect_uri=https%3A%2F%2Fds-test.etextbook.cn%2Fauthcenter%2Fauth%2Floginsuccess%3Foauth_type%3Dedenoperation%26return_url%3Dhttps%253A%252F%252Foperator-api-test.etextbook.cn%252Fucenter%252Fauth%252Floginsuccess%253Freturn_url%253Dhttps%25253A%25252F%25252Foperator-test.etextbook.cn%25252Flogin&state=state&response_type=code';
var ctxPath = '/authcenter/';
var info = {};
/*]]>*/
</script>
<script type="text/javascript">
info = new Browser();
function toLogin (num) {
if (num === 1) {
window.location.href = loginUrl1;
} else if (num === 2) {
window.location.href = loginUrl2;
}
return false;
}
</script>
</body></html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海市中小学数字教材</title>
<!-- <link rel="stylesheet" href="css/main_0327.css" />
<link rel="stylesheet" href="css/statistics.css" />
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/normalize.css" />
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script src="js/echarts.min.js"></script> -->
<link rel="stylesheet" th:href="@{/static/css/main_0216.css}"/>
<link rel="stylesheet" th:href="@{/static/css/statistics.css}"/>
<link rel="stylesheet" th:href="@{/static/css/bootstrap.min.css}"/>
<link rel="stylesheet" th:href="@{/static/css/normalize.css}"/>
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<script type="text/javascript" th:src="@{/static/js/echarts.min.js}"></script>
</head>
<body style="background-color: rgb(244, 245, 245);overflow: auto;">
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<!-- Add your site or application content here -->
<div class="static" style="height: 140vh;">
<a th:href="@{/log/loginstat_xhzy}">第三方应用登陆统计</a>
<p class="static-title">登陆数据统计</p>
<p class="p-class"><span class="p-label">累计登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">上海教育认证中心累计登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">数字教材实验账号累计登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">近30日登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">上海教育认证中心近30日登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">数字教材实验账号近30日登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">近7日登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">上海教育认证中心近7日登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">数字教材实验账号近7日登录:</span><span class="p-num"></span>人次</p>
<div id="main" style="width: 600px; height: 400px; margin: 100px auto;"></div>
</div>
<script th:inline="javascript">
// <script type="text/javascript">
/*<![CDATA[*/
var data_djg = [[${data_djg}]];
var data_syy = [[${data_syy}]];
var data_time = [[${data_time}]];
var data_total = [[${data_total}]];
var data_total_djg = [[${data_total_djg}]];
var data_total_syy = [[${data_total_syy}]];
var data_30 = [[${data_30}]];
var data_30_djg = [[${data_30_djg}]];
var data_30_syy = [[${data_30_syy}]];
var data_7 = [[${data_7}]];
var data_7_djj = [[${data_7_djj}]];
var data_7_syy = [[${data_7_syy}]];
// var data_djg = [320, 332, 301, 334, 390, 330, 320];
// var data_syy = [120, 132, 101, 134, 90, 230, 210];
// var data_time = ['3.21', '3.22', '3.23', '3.24', '3.25', '3.26', '3.27'];
// var data_total = 100;
// var data_total_djg = 100;
// var data_total_syy = 100;
// var data_30 = 100;
// var data_30_djg = 100;
// var data_30_syy = 100;
// var data_7 = 100;
// var data_7_djj = 100;
// var data_7_syy = 100;
/*]]>*/
</script>
<script type="text/javascript">
// 初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter(params){
let sum = params[0].value + params[1].value
return params[0].axisValueLabel + '统计 </br>'+
'上海教育认证中心:'+ params[0].value + '</br>' +
'数字教材实验账号:'+ params[1].value + '</br>'+
' 总计:'+ sum
}
},
title: {
text: '近七日登陆数据',
left: '50%',
textAlign: 'center'
},
legend: {
top: 40,
data: ['上海教育认证中心', '数字教材实验账号']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
top: 80,
containLabel: true
},
xAxis: [{
type: 'category',
data: data_time
}],
yAxis: [{
type: 'value'
}],
series: [{
name: '上海教育认证中心',
type: 'bar',
stack: '人次',
data: data_djg
},
{
name: '数字教材实验账号',
type: 'bar',
stack: '人次',
data: data_syy
}
]
};
function displayNum() {
var doc = document.getElementsByClassName('p-num');
doc[0].textContent = data_total;
doc[1].textContent = data_total_djg;
doc[2].textContent = data_total_syy;
doc[3].textContent = data_30;
doc[4].textContent = data_30_djg;
doc[5].textContent = data_30_syy;
doc[6].textContent = data_7;
doc[7].textContent = data_7_djj;
doc[8].textContent = data_7_syy;
}
myChart.setOption(option);
displayNum();
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海市中小学数字教材</title>
<!-- <link rel="stylesheet" href="css/main_0327.css" />
<link rel="stylesheet" href="css/statistics.css" />
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/normalize.css" />
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script src="js/echarts.min.js"></script> -->
<link rel="stylesheet" th:href="@{/static/css/main_0216.css}"/>
<link rel="stylesheet" th:href="@{/static/css/statistics.css}"/>
<link rel="stylesheet" th:href="@{/static/css/bootstrap.min.css}"/>
<link rel="stylesheet" th:href="@{/static/css/normalize.css}"/>
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<script th:src="@{/static/js/echarts.min.js}"></script>
</head>
<body style="background-color: rgb(244, 245, 245);">
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<!-- Add your site or application content here -->
<div class="static">
<a th:href="@{/log/loginstat}">数字教材登陆统计</a>
<p class="static-title">登陆数据统计</p>
<p class="p-class"><span class="p-label">上海教育认证中心累计登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">上海教育认证中心近30日登录:</span><span class="p-num"></span>人次</p>
<p class="p-class"><span class="p-label">上海教育认证中心近7日登录:</span><span class="p-num"></span>人次</p>
<div id="main" style="width: 600px; height: 400px; margin: 100px auto;"></div>
</div>
<script th:inline="javascript">
// <script type="text/javascript">
/*<![CDATA[*/
var data1_djg = [[${data1_djg}]];
var data1_time = [[${data1_time}]];
var data1_total_djg = [[${data1_total_djg}]];
var data1_30_djg = [[${data1_30_djg}]];
var data1_7_djg = [[${data1_7_djg}]];
// var data1_djg = [74, 34, 24, 37, 73, 106, 64];
// var data1_time = ['4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9'];
// var data1_total_djg = 3295;
// var data1_30_djg = 2348;
// var data1_7_djg = 412;
/*]]>*/
</script>
<script type="text/javascript">
// 初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
// formatter(params){
// let sum = params[0].value + params[1].value
// return ` ${params[0].axisValueLabel} 统计 </br>
// 电教馆: ${params[0].value} </br>
// 省运营: ${params[1].value} </br>
// 总计: ${sum}
// `
// }
},
title: {
text: '近七日登陆数据',
left: '50%',
textAlign: 'center'
},
// legend: {
// top: 40,
// data: ['上海教育认证中心', '数字教材实验账号']
// },
grid: {
left: '3%',
right: '4%',
bottom: '3%',
top: 80,
containLabel: true
},
xAxis: [{
type: 'category',
data: data1_time
}],
yAxis: [{
type: 'value'
}],
series: [{
name: '上海教育认证中心',
type: 'bar',
stack: '人次',
data: data1_djg
},
// {
// name: '数字教材实验账号',
// type: 'bar',
// stack: '人次',
// data: data1_syy
// }
]
};
function displayNum() {
var doc = document.getElementsByClassName('p-num');
doc[0].textContent = data1_total_djg;
doc[1].textContent = data1_30_djg;
doc[2].textContent = data1_7_djg;
}
myChart.setOption(option);
displayNum();
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海数字教材运营管理中心</title>
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<form th:action="${successPostUrl}" method="post" th:object="${clientDataInfo}">
<input type="hidden" th:value="${clientDataInfo.authUserInfo.id}" name="authUserInfo.id"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.realName}" name="authUserInfo.realName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.userType}" name="authUserInfo.userType"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.source}" name="authUserInfo.source"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentId}" name="authUserInfo.studentId"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentCode}" name="authUserInfo.studentCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentStage}" name="authUserInfo.studentStage"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentGrade}" name="authUserInfo.studentGrade"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentClass}" name="authUserInfo.studentClass"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentStageName}" name="authUserInfo.studentStageName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentGradeName}" name="authUserInfo.studentGradeName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentClassName}" name="authUserInfo.studentClassName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentSchoolId}" name="authUserInfo.studentSchoolId"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentCodeStatus}" name="authUserInfo.studentCodeStatus"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentSchoolCode}" name="authUserInfo.studentSchoolCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentSchoolName}" name="authUserInfo.studentSchoolName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentRegionCode}" name="authUserInfo.studentRegionCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentRegionName}" name="authUserInfo.studentRegionName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherTrainingNo}" name="authUserInfo.teacherTrainingNo"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherTrainingUserName}" name="authUserInfo.teacherTrainingUserName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherRegionCode}" name="authUserInfo.teacherRegionCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherCampusCode}" name="authUserInfo.teacherCampusCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherTrainingSchoolType}" name="authUserInfo.teacherTrainingSchoolType"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherStage}" name="authUserInfo.teacherStage"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherGrade}" name="authUserInfo.teacherGrade"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherSubject}" name="authUserInfo.teacherSubject"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherSchoolId}" name="authUserInfo.teacherSchoolId"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherSchoolName}" name="authUserInfo.teacherSchoolName"/>
<input type="hidden" th:value="${clientDataInfo.returnUrl}" name="returnUrl"/>
<input type="hidden" th:value="${clientDataInfo.oauthType}" name="oauthType"/>
</form>
<script type="text/javascript">
$(function(){
$("form").submit();
})
</script>
</body></html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>上海教育认证平台</title>
<!-- <link type="text/css" rel="stylesheet" href="./css/css.css" />
<script src="./js/funcation.js" type="text/javascript"></script>
<script src="./js/jquery.js" type="text/javascript"></script> -->
<link type="text/css" rel="stylesheet" th:href="@{/static/css/main_xhzy.css}" />
</head>
<body>
<div class="top">
<div class="main">
<a><img th:src="@{/static/img/Rlogo.jpg}"/></a>
</div>
</div>
<div class="login-c">
<div class="main">
<div class="login-list fl">
<div class="content"><img th:src="@{/static/img/loading-text.png}"/></div>
</div>
<div class="clear"></div>
</div>
</div>
<div class="bottom">
<p>版权所有&copy;上海教育认证中心</p>
</div>
<script th:inline="javascript">
/*<![CDATA[*/
var loginUrl = [[${loginUrl}]];
/*]]>*/
</script>
<script>
setTimeout(function () {
window.location.href = loginUrl;
}, 1200)
</script>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>sh-ds</artifactId>
<groupId>com.chineseall.eden</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eden-authcenter-log</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.chineseall.eden.authcenter.log.dao;
import cn.sh.chineseall.framework.dao.core.hql.Criteria;
import cn.sh.chineseall.framework.dao.core.hql.Query;
import cn.sh.chineseall.framework.dao.mongo.dao.StaticCacheDimensionDocumentMongoDao;
import com.chineseall.eden.authcenter.log.model.AuthLog;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
@Component
public class AuthLogDao extends StaticCacheDimensionDocumentMongoDao<AuthLog, String> {
public Long countLoginByParams(Map<String, Object> params){
Criteria criteria = new Criteria();
criteria.and("logType").is("login");
if(params.get("authSource")!=null){
criteria.and("authSource").is(params.get("authSource").toString());
}
if(params.get("oauthType")!=null){
criteria.and("oauthType").is(params.get("oauthType").toString());
}
if(params.get("loginSuccessFlag")!=null){
criteria.and("loginSuccessFlag").is(Boolean.valueOf(params.get("loginSuccessFlag").toString()));
}
if(params.get("getUserInfoSuccessFlag")!=null){
criteria.and("getUserInfoSuccessFlag").is(Boolean.valueOf(params.get("getUserInfoSuccessFlag").toString()));
}
if(params.get("userType")!=null){
criteria.and("logUserInfo.userType").is(params.get("userType").toString());
}
if(params.get("beginTime")!=null){
criteria.and("createTime").gte((Date) params.get("beginTime"));
}
if(params.get("endTime")!=null){
criteria.lte((Date) params.get("endTime"));
}
Query query = Query.query(criteria);
return count(query);
}
public Long countLogoutByParams(Map<String, Object> params){
Criteria criteria = new Criteria();
criteria.and("logType").is("logout");
Query query = Query.query(criteria);
return count(query);
}
}
package com.chineseall.eden.authcenter.log.enums;
import lombok.Getter;
public enum LogType {
login("login","登录操作"),
logout("logout","登出操作");
@Getter
private final String code;
@Getter
private final String description;
LogType(String code, String description) {
this.code = code;
this.description = description;
}
public static LogType getValue(String name) {
try {
return LogType.valueOf(name);
} catch (Exception ex) {
return null;
}
}
}
package com.chineseall.eden.authcenter.log.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentCollection;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentDatabase;
import com.chineseall.eden.authcenter.log.enums.LogType;
import lombok.Data;
import java.util.Date;
import java.util.Map;
@Data
@DocumentConnection(configName = "mongo")
@DocumentDatabase(database = "dslog")
@DocumentCollection(collection = "auth_log")
public class AuthLog implements CacheDimensionDocument {
@DocumentId
private String id;
@DocumentCreateTimestamp
private Date createTime;
@DocumentUpdateTimestamp
private Date updateTime;
@DocumentField
private String clientId;
@DocumentField
private LogType logType; // 日志类型
@DocumentField
private String authSource; // 请求发起方
@DocumentField
private String fowardUrl; // 登录跳转地址
@DocumentField
private String oauthType; // 第三方登录类型
@DocumentField
private Boolean loginSuccessFlag; // 是否回调成功
@DocumentField
private String returnUrl; // 登录成功回调地址
@DocumentField
private String finalReturnUrl; // 登录或登出成功后最终回调地址
@DocumentField
private Boolean getUserInfoSuccessFlag; // 获取用户信息是否成功
@DocumentField
private LogUserInfo logUserInfo; // 登录用户信息
@DocumentField
private Map<String, Object> userInfoMap;
@DocumentField
private String browser;
@DocumentField
private String version;
@DocumentField
private String os;
@DocumentField
private String device;
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
}
package com.chineseall.eden.authcenter.log.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class LogUserInfo implements Serializable {
private String userId;
private String realName;
private String userType;
private String schoolId;
private String schoolName;
private String teacherTrainingNo;
private String studentCode;
}
package com.chineseall.eden.authcenter.log.service;
import com.chineseall.eden.authcenter.log.model.AuthLog;
import java.util.Map;
public interface AuthLogService {
AuthLog getById(String id);
void save(AuthLog authLog);
Long countLoginByParams(Map<String, Object> params);
Long countLogoutByParams(Map<String, Object> params);
}
package com.chineseall.eden.authcenter.log.service.impl;
import com.chineseall.eden.authcenter.log.dao.AuthLogDao;
import com.chineseall.eden.authcenter.log.model.AuthLog;
import com.chineseall.eden.authcenter.log.service.AuthLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
@Service
public class AuthLogServiceImpl implements AuthLogService {
@Autowired
private AuthLogDao authLogDao;
@Override
public AuthLog getById(String id) {
return authLogDao.load(id);
}
@Override
public void save(AuthLog authLog) {
if(authLog.getId() != null){
authLog.setUpdateTime(new Date());
authLogDao.replace(authLog);
} else{
authLog.setId(UUID.randomUUID().toString());
authLog.setCreateTime(new Date());
authLogDao.insert(authLog);
}
}
@Override
public Long countLoginByParams(Map<String, Object> params) {
return authLogDao.countLoginByParams(params);
}
@Override
public Long countLogoutByParams(Map<String, Object> params) {
return authLogDao.countLogoutByParams(params);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chineseall.eden</groupId>
<artifactId>sh-ds</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eden-authcenter-agent</module>
<module>eden-authcenter-log</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.16.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</spring-cloud.version>
<spring-version>4.3.19.RELEASE</spring-version>
<spring.version>4.3.19.RELEASE</spring.version>
<alpha-framework-version>2.0.6.0014</alpha-framework-version>
<spring-boot.version>1.5.16.RELEASE</spring-boot.version>
<mongodb.version>3.10.2</mongodb.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-api</artifactId>
<version>${alpha-framework-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.chineseall</groupId>
<artifactId>base</artifactId>
<version>0.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.chineseall</groupId>
<artifactId>base-util</artifactId>
<version>0.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<!-- build管理器,子项目可选择性调用某一项build,如果不引入,则默认为maven compiler-->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>public</id>
<url>http://180.167.91.206:5716/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment