├── src ├── images │ ├── al8.png │ ├── alq.png │ ├── disc.png │ ├── disc-o.png │ ├── format.ico │ ├── needle.png │ ├── user_face.png │ ├── netease-logo.png │ └── temp_pic001.jpg ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── js │ ├── index.js │ ├── lyricScroll.js │ ├── request.js │ └── player.js ├── css │ ├── index.css │ └── font-awesome.min.css └── libs │ └── jquery-3.1.1.min.js ├── .gitignore ├── package.json ├── yarn.lock ├── server ├── data-format │ ├── lyric.jsonc │ └── api.jsonc ├── node │ ├── tools │ │ └── request.js │ └── server.js └── php │ └── index.php ├── LICENSE ├── README.md └── index.html /src/images/al8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/al8.png -------------------------------------------------------------------------------- /src/images/alq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/alq.png -------------------------------------------------------------------------------- /src/images/disc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/disc.png -------------------------------------------------------------------------------- /src/images/disc-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/disc-o.png -------------------------------------------------------------------------------- /src/images/format.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/format.ico -------------------------------------------------------------------------------- /src/images/needle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/needle.png -------------------------------------------------------------------------------- /src/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/images/user_face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/user_face.png -------------------------------------------------------------------------------- /src/images/netease-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/netease-logo.png -------------------------------------------------------------------------------- /src/images/temp_pic001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/images/temp_pic001.jpg -------------------------------------------------------------------------------- /src/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yangfan2016/cloud-music-web/HEAD/src/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_* 2 | *.log 3 | logs 4 | **/*.backup.* 5 | **/*.back.* 6 | 7 | node_modules 8 | bower_componets 9 | 10 | *.sublime* 11 | 12 | psd 13 | thumb 14 | sketch 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-music-web", 3 | "version": "1.0.0", 4 | "description": "This is a music player", 5 | "license": "MIT", 6 | "private": true, 7 | "scripts": { 8 | "start":"set PORT=1234 && node server/node/server.js" 9 | }, 10 | "dependencies": { 11 | "mime-types":"^2.1.20" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | mime-db@~1.36.0: 6 | version "1.36.0" 7 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" 8 | 9 | mime-types@^2.1.20: 10 | version "2.1.20" 11 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" 12 | dependencies: 13 | mime-db "~1.36.0" 14 | -------------------------------------------------------------------------------- /server/data-format/lyric.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "sgc":false, 3 | "sfy":false, 4 | "qfy":false, 5 | "lrc":{ 6 | "version":46, 7 | "lyric":"[00:14.700]远处蔚蓝天空下\n[00:16.790]涌动着金色的麦浪\n[00:21.650]就在那里曾是你和我\n[00:25.290]爱过的地方\n[00:28.380]当微风带着收获的味道\n[00:32.270]吹向我脸庞\n[00:35.500]想起你轻柔的话语\n[00:39.000]曾打湿我眼眶\n[00:42.010]嗯…啦…嗯…啦…\n[01:10.000]\n[01:13.860]我们曾在田野里歌唱\n[01:17.560]在冬季盼望\n[01:20.880]却没能等到这阳光下\n[01:24.480]秋天的景象\n[01:27.570]就让曾经的誓言飞舞吧\n[01:31.420]随西风飘荡\n[01:34.860]就像你柔软的长发\n[01:38.250]曾芬芳我梦乡\n[01:41.050]嗯…啦…嗯…啦…\n[02:08.680]\n[02:16.560]远处蔚蓝天空下\n[02:18.540]涌动着金色的麦浪\n[02:23.380]就在那里曾是你和我\n[02:26.990]爱过的地方\n[02:30.130]当微风带着收获的味道\n[02:34.010]吹向我脸庞\n[02:37.270]想起你轻柔的话语\n[02:40.680]曾打湿我眼眶\n[02:43.900]嗯…啦…嗯…啦…\n[02:44.810]我们曾在田野里歌唱\n[02:48.370]在冬季盼望\n[02:51.650]却没能等到阳光下\n[02:55.170]这秋天的景象\n[02:58.350]就让曾经的誓言飞舞吧\n[03:02.230]随西风飘荡\n[03:05.460]就像你柔软的长发\n[03:09.100]曾芬芳我梦乡\n[03:13.300]啦…\n[03:15.550]\n" 8 | }, 9 | "klyric":{ 10 | "version":4,"lyric":null 11 | }, 12 | "tlyric":{ 13 | "version":0 14 | }, 15 | "code":200 16 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /server/data-format/api.jsonc: -------------------------------------------------------------------------------- 1 | [ 2 | // 搜素歌曲API 请求体 3 | { 4 | "url_GET": "http://s.music.163.com/search/get/", 5 | // 必须参数 6 | "s": "", // 搜索内容 7 | "limit": 1, // 返回数量 8 | "type": 1, // 返回类型 9 | // 歌曲 1 10 | // 专辑 10 11 | // 歌手 100 12 | // 歌单 1000 13 | // 用户 1002 14 | // mv 1004 15 | // 歌词 1006 16 | // 主播电台 1009 17 | "offset": 1, // 偏移量,用于分页 18 | // 非必须参数 19 | "sub": false, // 意义不明 20 | "MUSIC_U": "", // 意义不明 21 | }, 22 | // 响应体 23 | { 24 | "code": 200, // 未知 25 | "result": { 26 | "songCount": 2385, // 搜索数量 27 | "songs": [ 28 | { 29 | // 专辑 30 | "album": { 31 | "artists": { 32 | "id": 1131564, 33 | "name": "周二珂", 34 | "picUrl": "http://... .jpg" 35 | }, 36 | "id": 1212312, 37 | "name": "告白气球", 38 | "picUrl": "http://... .jpg" 39 | }, 40 | // 艺术家 41 | "artists": [ 42 | { 43 | "id": 1131564, 44 | "name": "周二珂", 45 | "picUrl": "http://... .jpg" 46 | } 47 | ], 48 | // 音频路径 49 | "audio": "http://... .mp3", 50 | // 歌曲id 51 | "id": 12311123, 52 | // 歌名 53 | "name": "告白气球", 54 | // 歌曲所在页面 55 | "page": "http://... .html", 56 | // 未知 57 | "djProgramId": 13213113 58 | } 59 | ], 60 | } 61 | } 62 | ] -------------------------------------------------------------------------------- /server/node/tools/request.js: -------------------------------------------------------------------------------- 1 | const qs = require("querystring"); 2 | const http = require("http"); 3 | const url = require("url"); 4 | 5 | function serverRequest(options) { 6 | return new Promise(function (resolve, reject) { 7 | let body = options.data || ''; 8 | let req = http.request({ 9 | host: options.host, //域名 10 | path: options.path, //资源地址 11 | method: options.method, //请求方式 12 | headers: Object.assign({}, { 13 | 'Content-Type': 'application/json', 14 | 'Content-Length': Buffer.byteLength(body), 15 | }, options.headers) 16 | }, function (res) { 17 | console.log(`状态码: ${res.statusCode}`); 18 | res.setEncoding('utf8'); 19 | let rawData = ''; 20 | res.on('data', (chunk) => { rawData += chunk; }); 21 | res.on('end', () => { 22 | try { 23 | const parsedData = JSON.parse(rawData); 24 | resolve(parsedData); 25 | } catch (e) { 26 | reject(`解析数据遇到问题: ${e.message} \n ${rawData}`); 27 | } 28 | }); 29 | }); 30 | req.on('error', (e) => { 31 | reject(`请求遇到问题: ${e.message}`); 32 | }); 33 | 34 | req.write(body); 35 | req.end(); 36 | }); 37 | } 38 | 39 | 40 | serverRequest.get = function (options) { 41 | let reqUrl = url.parse(options.url); 42 | let reqPath = reqUrl.pathname; 43 | let body = qs.stringify(options.data || ''); 44 | if (!reqUrl.query) { 45 | reqPath += `?${body}`; 46 | } else { 47 | reqPath += `${reqUrl.search}&${body}`; 48 | } 49 | return serverRequest({ 50 | method: 'GET', 51 | host: reqUrl.host, 52 | path: reqPath, 53 | }, options); 54 | } 55 | 56 | serverRequest.post = function (options) { 57 | let reqUrl = url.parse(options.url); 58 | let body = qs.stringify(options.data); 59 | return serverRequest(Object.assign({}, options, { 60 | method: 'POST', 61 | host: reqUrl.host, 62 | path: reqUrl.path, 63 | data: body, 64 | })); 65 | } 66 | 67 | module.exports = serverRequest; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## cloud-music-web 2 | 3 | This is a music player 4 | 5 | ![cloud-music-pc](https://raw.githubusercontent.com/Yangfan2016/PicBed/master/Blog/cloud-music-pc.gif) 6 | 7 | ### Run 8 | 9 | ```bash 10 | $ yarn 11 | $ yarn start 12 | ``` 13 | 然后打开浏览器输入 http://localhost:9631 14 | > ##### 或者可以到`package.json` 里自定义端口,将 `set PORT=XXXX` 的 `XXXX` 改为你自己想要的端口即可,然后重新执行下 `npm start` 15 | 16 | ```json 17 | "scripts": { 18 | "start":"set PORT=9631 && node server/node/server.js" 19 | } 20 | ``` 21 | 22 | ### Post 23 | 24 | [博客-网易云音乐播放器](https://yangfan2016.github.io/2017/02/18/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/) 25 | 26 | ### Intro 27 | 28 | 功能 29 | - [x] 播放歌曲、暂停歌曲 30 | - [x] 切换歌曲 31 | - [x] 调节音量 32 | - [x] 调节进度条 33 | - [x] 搜索歌曲 34 | - [x] 歌词滚动 35 | - [x] 指定歌单播放(目前是使用的“我喜欢的歌曲”这个歌单) 36 | 37 | 技术栈 38 | - 前台:`Javascript`+`jQuery`+`HTML`+`CSS` 39 | - 后台:`Nodejs` 40 | 41 | 缓存 42 | - 利用`sessionStorage` 存储歌曲基本信息和歌词 43 | 44 | 45 | 原先用的php做的请求代理`server/php/index.php`,现在用nodejs重写了代码作为服务代理,详情`server/node/server.js` 46 | 47 | ### MIT license 48 | Copyright (c) 2018 49 | 50 | Permission is hereby granted, free of charge, to any person obtaining a copy 51 | of this software and associated documentation files (the "Software"), to deal 52 | in the Software without restriction, including without limitation the rights 53 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 54 | copies of the Software, and to permit persons to whom the Software is 55 | furnished to do so, subject to the following conditions: 56 | 57 | The above copyright notice and this permission notice shall be included in 58 | all copies or substantial portions of the Software. 59 | 60 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 61 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 62 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 63 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 64 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 65 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 66 | THE SOFTWARE. 67 | 68 | --- 69 | built upon love by [docor](https://github.com/turingou/docor.git) v0.3.0 70 | -------------------------------------------------------------------------------- /src/js/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme: index Utils 3 | * Dependence: jQuery 4 | * 5 | */ 6 | 7 | 8 | // Utils Func 9 | /** 10 | * @Theme: 添加active样式 11 | * @Param: eles,eventType,className || 12 | * [eles,child],eventType,className 利用冒泡原理给新DOM也添加事件 13 | * 14 | */ 15 | var styleActive=function (eles,eventType,className) { 16 | // 利用冒泡原理给新DOM也添加事件 17 | if (eles instanceof Array) { 18 | eles[0].on(eventType,eles[1],function () { 19 | eles[0].find(eles[1]).each(function (index,item) { 20 | $(item).removeClass(className); 21 | }); 22 | $(this).addClass(className); 23 | }); 24 | } else { 25 | eles.on(eventType,function () { 26 | eles.each(function (index,item) { 27 | $(item).removeClass(className); 28 | }); 29 | $(this).addClass(className); 30 | }); 31 | } 32 | 33 | } 34 | /** 35 | * @Theme: play btn switch style 36 | * @Param: $ele (eg: $("#playBtnGroup").find(".play")), playType:["play","pause"] 37 | */ 38 | var stylePlayBtn=function ($ele,playType) { 39 | var html_play=''; 40 | var html_pause=''; 41 | $ele.html((playType==="play"?html_pause:html_play)); 42 | 43 | }; 44 | /** 45 | * @Theme: 提示框 46 | * @Param: tipType,tipText 47 | * tipType: "error" | "info" | "ok" 48 | * 49 | */ 50 | var showTipBox=function (tipType,tipText) { 51 | $("#tipsBox").find(".tip").each(function (index,item) { 52 | $(item).removeClass("show"); 53 | }); 54 | $("#tipsBox").find(".tip_"+tipType).addClass("show").find(".tiptext").html(tipText); 55 | $("#backScreen").css("display","block"); 56 | $("#tipsBox").css("display","block").on("animationend",function () { 57 | $(this).css("display","none"); 58 | $("#backScreen").animate({ 59 | "opacity":"0" 60 | },30,function () { 61 | $(this).css({ 62 | "display":"none", 63 | "opacity":1 64 | }); 65 | }); 66 | }); 67 | }; 68 | /** 69 | * @Theme: 加载框 70 | * @Param: isShow [,loading_text] 71 | * 72 | * 73 | */ 74 | var showLoadingBox=function (isShow,loading_text) { 75 | $("#loadingBox").css("display",(!!isShow?"block":"none")); 76 | !!loading_text && $("#loadingBox").find(".loading_text").html(loading_text); 77 | }; 78 | /** 79 | * @Theme: 时间格式转换 80 | * @Param: seconds 81 | * @Memo: s-> h:m:s 1-> 01 82 | * 83 | */ 84 | var formatTime=function (seconds) { 85 | var h=0, 86 | i=0, 87 | s=Math.floor(seconds); 88 | h=Math.floor(s/3600); 89 | i=Math.floor((s%3600)/60); 90 | s=s%3600%60; 91 | 92 | return { 93 | H:h=h<10?"0"+h:h, 94 | I:i=i<10?"0"+i:i, 95 | S:s=s<10?"0"+s:s 96 | }; 97 | }; 98 | /** 99 | * @Theme: 日期格式转换 100 | * @Param: seconds 101 | * @Memo: 1486684800000 -> 2017-02-10 102 | * 103 | */ 104 | var formatDate=function (timestamp) { 105 | var now=new Date(timestamp); 106 | var y=now.getFullYear(), 107 | m=+1+now.getMonth(), 108 | d=now.getDate(); 109 | 110 | return { 111 | Y:y, 112 | M:m=m<10?"0"+m:m, 113 | D:d=d<10?"0"+d:d 114 | }; 115 | } 116 | 117 | $(function () { 118 | 119 | // =========================初始化===================================== 120 | 121 | // 清空所有本地存储数据 122 | sessionStorage.clear(); 123 | 124 | // ===========================基础交互样式==================================== 125 | 126 | // tab选项卡切换样式 127 | styleActive([$(".R_page .tabbtns"),".label_btn"],"click","active"); 128 | // list切换样式 129 | styleActive([$("#listContainer>.list>.btngroups"),".btn"],"click","active"); 130 | // tr切换样式 131 | styleActive([$(".infolist"),"tr"],"click","active"); 132 | 133 | // 收起 | 展开 歌单列表 134 | $("#listContainer>.list>.title .unfoldlist").on("click",function () { 135 | var $btnGroups=$(this).parents(".list").find(".btngroups"); 136 | if ($btnGroups.css("display")==="block") { 137 | $btnGroups.slideUp(500); 138 | $(this).html(''); 139 | } else { 140 | $btnGroups.slideDown(500); 141 | $(this).html(''); 142 | } 143 | }); 144 | 145 | 146 | 147 | // ==========================EXPORT============================ 148 | 149 | // export 150 | window.styleActive=styleActive; 151 | window.stylePlayBtn=stylePlayBtn; 152 | window.showTipBox=showTipBox; 153 | window.showLoadingBox=showLoadingBox; 154 | window.formatTime=formatTime; 155 | window.formatDate=formatDate; 156 | }); -------------------------------------------------------------------------------- /server/php/index.php: -------------------------------------------------------------------------------- 1 | $word, 31 | 'offset' => '0', 32 | 'limit' => '20', 33 | 'type' => $type, 34 | ); 35 | $referrer = "http://music.163.com/"; 36 | $URL_Info = parse_url($url); 37 | $values = []; 38 | $result = ''; 39 | $request = ''; 40 | foreach ($post_data as $key => $value) { 41 | $values[] = "$key=" . urlencode($value); 42 | } 43 | $data_string = implode("&", $values); 44 | if (!isset($URL_Info["port"])) { 45 | $URL_Info["port"] = 80; 46 | } 47 | $request .= "POST " . $URL_Info["path"] . " HTTP/1.1\n"; 48 | $request .= "Host: " . $URL_Info["host"] . "\n"; 49 | $request .= "Referer: $referrer\n"; 50 | $request .= "Content-type: application/x-www-form-urlencoded\n"; 51 | $request .= "Content-length: " . strlen($data_string) . "\n"; 52 | $request .= "Connection: close\n"; 53 | $request .= "Cookie: " . "appver=1.5.0.75771;\n"; 54 | $request .= "\n"; 55 | $request .= $data_string . "\n"; 56 | $fp = fsockopen($URL_Info["host"], $URL_Info["port"]); 57 | fputs($fp, $request); 58 | $i = 1; 59 | while (!feof($fp)) { 60 | if ($i >= 15) { 61 | $result .= fgets($fp); 62 | } else { 63 | fgets($fp); 64 | $i++; 65 | } 66 | } 67 | fclose($fp); 68 | return $result; 69 | } 70 | // 获取歌曲信息 71 | function get_music_info($music_id) 72 | { 73 | $url = "http://music.163.com/api/song/detail/?id=" . $music_id . "&ids=%5B" . $music_id . "%5D"; 74 | return curl_get($url); 75 | } 76 | // 获取歌手专辑信息 77 | function get_artist_album($artist_id,$limit) 78 | { 79 | $url = "http://music.163.com/api/artist/albums/" . $artist_id . "?limit=" . $limit; 80 | return curl_get($url); 81 | } 82 | // 获取专辑信息 83 | function get_album_info($album_id) 84 | { 85 | $url = "http://music.163.com/api/album/" . $album_id; 86 | return curl_get($url); 87 | } 88 | // 获取歌单 89 | function get_playlist_info($playlist_id) 90 | { 91 | $url = "http://music.163.com/api/playlist/detail?id=" . $playlist_id; 92 | return curl_get($url); 93 | } 94 | // 获取歌词 95 | function get_music_lyric($music_id) 96 | { 97 | $url = "http://music.163.com/api/song/lyric?os=pc&id=" . $music_id . "&lv=-1&kv=-1&tv=-1"; 98 | return curl_get($url); 99 | } 100 | // 获取MV 101 | function get_mv_info($mv_id) 102 | { 103 | $url = "http://music.163.com/api/mv/detail?id=".$mv_id."&type=mp4"; 104 | return curl_get($url); 105 | } 106 | 107 | 108 | // 调用API 109 | $API_type=$_GET["API_type"]; 110 | $queryString=$_GET['queryString']; 111 | switch ($API_type) { 112 | case 'music_search': 113 | echo "There is a bug in search func"; 114 | break; 115 | case 'get_music_info': 116 | echo get_music_info($queryString['id']); 117 | break; 118 | case 'get_artist_album': 119 | echo get_artist_album($queryString['id'],$queryString['limit']); 120 | break; 121 | case 'get_album_info': 122 | echo get_album_info($queryString['id']); 123 | break; 124 | case 'get_playlist_info': 125 | echo get_playlist_info($queryString['id']); 126 | break; 127 | case 'get_music_lyric': 128 | echo get_music_lyric($queryString['id']); 129 | break; 130 | case 'get_mv_info': 131 | echo get_mv_info($queryString['id']); 132 | break; 133 | default: 134 | echo "SWITCH ERROR"; 135 | break; 136 | } 137 | 138 | 139 | // print_r(json_decode(music_search('十年'))); 140 | // echo get_music_info("28949444"); 141 | // echo get_artist_album("166009", "5"); 142 | // echo get_album_info("3021064"); 143 | // echo get_playlist_info("22320356"); 144 | // echo get_music_lyric("29567020"); 145 | // echo get_mv_info("319104"); -------------------------------------------------------------------------------- /src/js/lyricScroll.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme: 歌词滚动 3 | * Dependence: jQuery 4 | * 5 | */ 6 | 7 | 8 | /** 9 | * @Theme: 歌词时间格式转换 10 | * @Param: str 11 | * @Memo: 02:23.656-> 143.656 12 | * 13 | */ 14 | function formatLyricTime(str) { 15 | var arr=str.split(":"); 16 | var second=0; 17 | if (arr.length==3) { 18 | second=-(-arr[0]*3600-arr[1]*60-arr[2]); 19 | } else { 20 | second=-(-arr[0]*60-arr[1]); 21 | } 22 | return second.toFixed(3); 23 | } 24 | /** 25 | * @Theme: 格式化歌词 26 | * @Param: str 27 | * @Memo: "[02:03.456]abc\n..." -> [{"timepoint":123.456,"lrcstr":"abc"},...] 28 | * 29 | */ 30 | function formatLyric(str) { 31 | var arr=[], 32 | brr=[], 33 | crr=[], 34 | data={}; 35 | 36 | // 将字符串按“\n” 分割成数组 37 | arr=str.split("\n"); 38 | // 去除最后一个空格 39 | arr.splice(-1,1); 40 | // 存入crr数组中 41 | for (var i=0;i" 50 | }; 51 | // 将所有键值对放入数组中 52 | crr.push(data); 53 | } else { 54 | // 歌词贡献者信息,暂不处理 "by:Treckiefans" 55 | } 56 | } 57 | return crr; 58 | } 59 | /** 60 | * @Theme: 生成歌词 DOM 61 | * @Param: crr: 歌词信息数组 lrcBox 包围歌词的盒子 62 | * @Memo: 63 | * 64 | */ 65 | function createLyricDOM(crr,lrcBox) { 66 | var docFrag=document.createDocumentFragment(); 67 | // 清空lrcBox 68 | lrcBox.innerHTML=""; 69 | for (var j=0;j=maxHeight)?maxHeight:offsetTop; 135 | item.dataset.top=offsetTop; 136 | 137 | }); 138 | // 默认第一行歌词高亮 139 | $lrcBox.find(".lrc").eq(0).addClass("current"); 140 | 141 | //=================audio的timeupdate事件监听===================== 142 | $audio.on("timeupdate",function () { 143 | var _this=this; 144 | $lrcBox.find(".lrc").each(function (index,item) { 145 | if (Math.abs(_this.currentTime-item.dataset.timepoint)<=1) { 146 | $(item).addClass("current").siblings().removeClass("current"); 147 | jQ_moveLrc(index); 148 | sessionStorage.setItem("curLine",index); 149 | } 150 | }); 151 | }); 152 | //=================audio的播放结束事件监听===================== 153 | $audio.on("ended",function () { 154 | $lrcContainer.stop(true).animate({ 155 | "scrollTop":0 156 | },300); 157 | }); 158 | //=================鼠标的移入移出事件监听===================== 159 | // 鼠标移入,歌词停止滚动,鼠标移除,歌词恢复滚动 160 | $lrcContainer.on("mouseover",function () { 161 | isScroll=false; 162 | }).on("mouseout",function () { 163 | isScroll=true; 164 | }); 165 | 166 | } 167 | 168 | // export 169 | window.mainLrcScroll=mainLrcScroll; 170 | -------------------------------------------------------------------------------- /server/node/server.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const http = require("http"); 3 | const url = require("url"); 4 | const fs = require("fs"); 5 | const mime = require("mime-types"); 6 | const requset = require("./tools/request.js"); 7 | 8 | // config 9 | const SITE_ROOT_DIR = path.resolve(__dirname, "../../"); 10 | const PORT = process.env.PORT || '9631'; 11 | const staticReg = /\.\w+$/; 12 | const proxyReg = /^\/api/; 13 | 14 | // create httpserver 15 | const app = new http.Server(); 16 | 17 | let requestListener = function (req, res) { 18 | let routePath = url.parse(req.url); 19 | let isStatic = staticReg.test(routePath.pathname); 20 | let isProxy = proxyReg.test(routePath.pathname); 21 | let mimeType = mime.lookup(routePath.pathname); // may be return 'false' 22 | 23 | // 静态资源 24 | if (isStatic) { 25 | // 处理 css js image fonts 等 26 | if (mimeType === false) { 27 | console.log('无法识别此文件类型'); 28 | res.writeHead(200, { 29 | 'Content-Type': 'text/plain' 30 | }); 31 | res.end('无法识别此文件类型'); 32 | return; 33 | } 34 | switch (true) { 35 | case mimeType.indexOf('image') !== -1: 36 | fs.readFile(path.join(SITE_ROOT_DIR, routePath.pathname), 'binary', function (err, bin) { 37 | if (!err) { 38 | res.writeHead(200, { 39 | "Content-Type": mimeType 40 | }); 41 | res.write(bin, 'binary'); 42 | res.end(); 43 | } 44 | }); 45 | break; 46 | case mimeType.indexOf('font') !== -1: 47 | fs.readFile(path.join(SITE_ROOT_DIR, routePath.pathname), 'binary', function (err, bin) { 48 | if (!err) { 49 | res.writeHead(200, { 50 | "Content-Type": mimeType 51 | }); 52 | res.write(bin, 'binary'); 53 | res.end(); 54 | } 55 | }); 56 | break; 57 | default: 58 | fs.readFile(path.join(SITE_ROOT_DIR, routePath.pathname), 'UTF-8', function (err, data) { 59 | if (!err) { 60 | res.writeHead(200, { 61 | "Content-Type": mimeType 62 | }); 63 | res.write(data); 64 | res.end(); 65 | } 66 | }); 67 | break; 68 | } 69 | } else { // 路由 70 | // 需要代理 71 | if (isProxy) { 72 | let target = 'http://music.163.com'; 73 | let proxyPath = `${target}${routePath.path}`; 74 | 75 | requset.get({ 76 | url: proxyPath, 77 | data: routePath.query, 78 | headers: { 79 | 'Referer': 'http://music.163.com/', 80 | 'Cookie': "appver=1.5.0.75771", 81 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36', 82 | } 83 | }) 84 | .then(function (d) { 85 | res.writeHead(200, { 86 | 'Content-Type': 'application/json' 87 | }); 88 | res.write(JSON.stringify(d)); 89 | res.end(); 90 | }) 91 | .catch(function (r) { 92 | res.writeHead(504, { 93 | 'Content-Type': 'text/plain' 94 | }); 95 | res.write(r); 96 | res.end(); 97 | }); 98 | 99 | } else { // 不需要代理 100 | switch (routePath.pathname) { 101 | case '/': 102 | fs.readFile(path.join(SITE_ROOT_DIR, '/index.html'), 'UTF-8', function (err, data) { 103 | if (!err) { 104 | res.writeHead(200, { 105 | "Content-Type": "text/html" 106 | }); 107 | res.write(data); 108 | res.end(); 109 | } 110 | }); 111 | break; 112 | default: 113 | res.write('404 NOT FOUND'); 114 | res.end(); 115 | break; 116 | } 117 | } 118 | 119 | } 120 | 121 | }; 122 | app.on("request", requestListener); 123 | app.listen(PORT); 124 | console.log(`The server is running at http://localhost:${PORT}`); 125 | 126 | -------------------------------------------------------------------------------- /src/js/request.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme: music player data request 3 | * Dependence: jQuery 4 | * 5 | */ 6 | 7 | function getMusicUrl(id) { 8 | if (!id) return; 9 | return `http://music.163.com/song/media/outer/url?id=${id}`; 10 | } 11 | 12 | // create jsonp 13 | function createJsonp(reqdata) { 14 | $.ajax({ 15 | url: reqdata.url, 16 | data: reqdata.data, 17 | dataType: "jsonp", 18 | jsonp: "callback", 19 | success: function (res) { 20 | reqdata.callback(res); 21 | }, 22 | error: function (err) { 23 | console.warn(err.status); 24 | } 25 | }); 26 | } 27 | // 请求API (PHP) GET 28 | function requestAPI(req) { 29 | $.ajax({ 30 | url: req.url, 31 | type: req.method || "GET", 32 | data: req.data, 33 | dataType: "json", 34 | success: function (res) { 35 | req.callback(res); 36 | }, 37 | error: function (err) { 38 | console.warn(err.status); 39 | } 40 | }); 41 | } 42 | 43 | // 搜索请求数据 44 | function searchRequest(str) { 45 | // 搜索内容非空判断 46 | if (!str) { 47 | showTipBox("error", "不能为空哟!"); 48 | } else if (str === sessionStorage.getItem("searchString")) { 49 | // 避免重复请求 50 | showTipBox("error", "重复请求了!"); 51 | } else { 52 | console.log("res-200 " + str); 53 | showLoadingBox(true); 54 | // jsonp 55 | createJsonp({ 56 | url: "http://s.music.163.com/search/get/?", 57 | data: { 58 | s: str, 59 | limit: 100, 60 | type: 1 61 | }, 62 | callback: function (data) { 63 | showLoadingBox(false); 64 | if (!data.result) { 65 | showTipBox("error", "查无此曲!"); // 查无此歌 66 | } else { 67 | console.log(data); 68 | // render DOM 69 | var songs = data.result.songs; 70 | var listLen = songs.length; 71 | var listHtml = ''; 72 | for (var i = 0; i < listLen; i++) { 73 | listHtml += ` 74 | 75 | ` + ((+i + 1) < 10 ? "0" + (+i + 1) : (+i + 1)) + ` 76 |   77 | 78 | `+ songs[i]['name'] + ` 79 | `+ songs[i]['artists'][0]['name'] + ` 80 | `+ songs[i]['album']['name'] + ` 81 | `+ '--:--' + ` 82 | 83 | `; 84 | } 85 | // refreshDOM 86 | $("#infoList_search").html(listHtml); 87 | // render search count 88 | $("#search_count").find(".input").html(str); 89 | $("#search_count").find(".count").html(data.result.songCount); 90 | 91 | 92 | 93 | } 94 | } 95 | }); 96 | } 97 | sessionStorage.setItem("searchString", str); 98 | } 99 | // 刷新DOM tbody 100 | function refreshDOM(songLen) { 101 | var tr = $("#infoList_playlist").find("tr").get(0), // 歌单列表第一行 102 | media = $("#audio").get(0), // 音频audio对象 103 | $songDetail = $("#songDetail"); // 歌曲详情页信息 104 | 105 | // 更新数据 歌曲数量 106 | sessionStorage.setItem("songLen", songLen); 107 | // 初始化播放资源 108 | $(media).attr("src", tr.dataset.audio); 109 | // 暂停播放 110 | media.pause(); 111 | // 初始化播放时长 112 | $("#audio_duration").html(tr.dataset.durationFormat); 113 | // 高亮第一行 114 | $(tr).eq(0).find("td.index").html('').addClass("active"); 115 | // 刷新小窗歌曲信息 116 | $("#smallwindow_albumPic").attr("src", tr.dataset.albumPic); 117 | // 刷新小窗专辑封面 118 | $("#smallwindow_songName").html(tr.dataset.songName); 119 | $("#smallwindow_singerName").html(tr.dataset.singerName); 120 | 121 | // 储存当前歌曲必要信息 122 | sessionStorage.setItem("curPlayInfo_songID", tr.dataset.id); 123 | sessionStorage.setItem("curPlayInfo_songName", tr.dataset.songName); 124 | sessionStorage.setItem("curPlayInfo_singersName", tr.dataset.singerName); 125 | sessionStorage.setItem("curPlayInfo_albumName", tr.dataset.albumName); 126 | sessionStorage.setItem("curPlayInfo_albumPic", tr.dataset.albumPic); 127 | sessionStorage.setItem("curPlayInfo_audioSrc", tr.dataset.audio); 128 | 129 | // 刷新歌曲详情页bg和poster 130 | $("#bgBlur").css({ 131 | "backgroundImage": 'url("' + sessionStorage.getItem('curPlayInfo_albumPic') + '")' 132 | }); 133 | $("#bgDisc").css({ 134 | "backgroundImage": 'url("' + sessionStorage.getItem('curPlayInfo_albumPic') + '")' 135 | }); 136 | 137 | // 刷新歌曲基本信息 138 | $songDetail.find(".songname").html(sessionStorage.getItem('curPlayInfo_songName')); 139 | $songDetail.find(".albumname").html(sessionStorage.getItem('curPlayInfo_singersName')); 140 | $songDetail.find(".singersname").html(sessionStorage.getItem('curPlayInfo_albumName')); 141 | 142 | // 生成歌词 143 | createScrollLrc(); 144 | 145 | } 146 | // 生产滚动歌词 147 | function createScrollLrc() { 148 | // 获取歌词 149 | var songID = sessionStorage.getItem("curPlayInfo_songID"); 150 | // 避免重复请求 151 | if (!sessionStorage.getItem("lyric-" + songID)) { 152 | // 请求歌词信息 153 | requestAPI({ 154 | url: "/api/song/lyric", 155 | data: { 156 | 'os': 'pc', 157 | 'id': songID, 158 | 'lv': -1, 159 | 'kv': -1, 160 | 'tv': -1, 161 | }, 162 | callback: function (data) { 163 | console.log(data.nolyric); 164 | // 判断是否有歌词 165 | if (!data.nolyric && data.lrc) { 166 | // 储存歌词 167 | sessionStorage.setItem("lyric-" + songID, data.lrc.lyric); 168 | // 生成滚动歌词 169 | mainLrcScroll({ 170 | "jQ_lrcContainer": $("#lrcContainer"), 171 | "jQ_lrcBox": $("#lrcBox"), 172 | "jQ_audio": $("#audio"), 173 | "str": data.lrc.lyric, 174 | }); 175 | console.log("网络歌词"); 176 | } else { 177 | $("#lrcBox").html("

暂无歌词

"); 178 | console.log("暂无歌词"); 179 | } 180 | } 181 | }); 182 | } else { 183 | mainLrcScroll({ 184 | "jQ_lrcContainer": $("#lrcContainer"), 185 | "jQ_lrcBox": $("#lrcBox"), 186 | "jQ_audio": $("#audio"), 187 | "str": sessionStorage.getItem("lyric-" + songID), 188 | }); 189 | console.log("本地歌词"); 190 | } 191 | } 192 | // 初始化歌单数据 193 | function initPlaylist(data) { 194 | var docFrag = document.createDocumentFragment(), 195 | result = data['result'], 196 | tracks = result['tracks'], 197 | songLen = tracks.length, 198 | tr = null, 199 | td = null, 200 | timeObj = {}, 201 | createTime = "", 202 | singerArr = [], 203 | allSinger = ""; 204 | 205 | // 清空 206 | $("#infoList_playlist").html(' '); 207 | // 生产歌单列表 208 | for (var i = 0; i < songLen; i++) { 209 | // ms->s /1000 格式化时间 00:00 210 | timeObj = formatTime(tracks[i]['duration'] / 1000); 211 | // 多个歌手名字组合 212 | for (var j = 0; j < tracks[i]['artists'].length; j++) { 213 | singerArr.push(tracks[i]['artists'][j]['name']); 214 | } 215 | allSinger = singerArr.join(" / "); 216 | // 清除 217 | singerArr = []; 218 | 219 | // 创建tr 设置tr 220 | tr = document.createElement("tr"); 221 | tr.dataset.index = i; 222 | tr.dataset.id = tracks[i]['id']; 223 | tr.dataset.songName = tracks[i]['name']; 224 | tr.dataset.duration = tracks[i]['duration']; 225 | tr.dataset.durationFormat = timeObj.I + ":" + timeObj.S; 226 | tr.dataset.audio = tracks[i]['mp3Url'] || getMusicUrl(tracks[i]['id']); 227 | tr.dataset.singerName = allSinger; 228 | tr.dataset.albumName = tracks[i]['album']['name']; 229 | tr.dataset.albumPic = tracks[i]['album']['picUrl']; 230 | tr.innerHTML = ` 231 | ` + ((+i + 1) < 10 ? "0" + (+i + 1) : (+i + 1)) + ` 232 |   233 | 234 | `+ tracks[i]['name'] + ` 235 | `+ allSinger + ` 236 | `+ tracks[i]['album']['name'] + ` 237 | `+ timeObj.I + `:` + timeObj.S + ` 238 | `; 239 | docFrag.appendChild(tr); 240 | } 241 | // 重新渲染DOM 242 | $("#infoList_playlist").append(docFrag); 243 | // 生成歌单的基本信息 244 | createTime = formatDate(result.createTime); 245 | $("#playlist_listPic").attr("src", result.coverImgUrl); 246 | $("#playlist_listName").html(result.name); 247 | $("#playlist_userFace").attr("src", result.creator.avatarUrl); 248 | $("#playlist_userName").html(result.creator.nickname); 249 | $("#playlist_createTime").html(createTime.Y + "-" + createTime.M + "-" + createTime.D); 250 | $("#playlist_trackCount").html(result.trackCount); 251 | $("#playlist_playCount").html(result.playCount); 252 | 253 | /* ==================== REFRESH DOM =============================== */ 254 | refreshDOM(songLen); 255 | 256 | } 257 | 258 | // init 259 | $(function () { 260 | 261 | // 基本信息 262 | var Author = { 263 | "nickname": "前端2017--闯", 264 | "id_like": "40730905" 265 | }; 266 | // 搜索歌曲功能函数 267 | var funcSearch = function () { 268 | var strSearch = $("#inpSearch").val().trim(); 269 | // 显示搜索页 隐藏列表页 270 | $("#pageMain").slideUp(300); 271 | $("#pageSearch").slideDown(300); 272 | // 缩放歌曲详情页 273 | $("#pageSongDetail").css({ 274 | "top": "100%", 275 | "right": "100%", 276 | "opacity": 0 277 | }); 278 | // 请求数据 279 | searchRequest(strSearch); 280 | }; 281 | 282 | // ===============初始化======================== 283 | 284 | // 初始化歌单 我喜欢的音乐 285 | showLoadingBox(true); 286 | requestAPI({ 287 | url: "/api/playlist/detail/", 288 | data: { 289 | "id": Author["id_like"] 290 | }, 291 | callback: function (data) { 292 | initPlaylist(data); 293 | showLoadingBox(false); 294 | } 295 | }); 296 | 297 | // ===============搜索功能======================== 298 | 299 | // 顶部菜单input回车搜索 300 | $("#inpSearch").on("keydown", function (ev) { 301 | var ev = ev || window.event; 302 | if (ev.keyCode === 13) { 303 | funcSearch(); 304 | } 305 | }); 306 | // 顶部菜单query图标点击搜索 307 | $("#top_searchBtn").on("click", function () { 308 | funcSearch(); 309 | }); 310 | 311 | // ===============歌单功能======================== 312 | 313 | // 切换歌单与搜索页 314 | $("#list_create_like").on("click", function () { 315 | // 显示列表页 隐藏搜索页 316 | $("#pageSearch").slideUp(500); 317 | $("#pageMain").slideDown(500); 318 | }); 319 | 320 | // ===============歌曲详情页======================== 321 | 322 | // 展开与缩放歌曲详情页 323 | $("#btnExpandPlayBox").on("click", function () { 324 | // style: 展开歌曲详情页 325 | $("#pageSongDetail").css({ 326 | "top": "60px", 327 | "right": 0, 328 | "opacity": 1 329 | }); 330 | }); 331 | $("#btnCompressPlayBox").on("click", function () { 332 | // style: 缩放歌曲详情页 333 | $("#pageSongDetail").css({ 334 | "top": "100%", 335 | "right": "100%", 336 | "opacity": 0 337 | }); 338 | }); 339 | 340 | 341 | // ==============EXPORT===================== 342 | 343 | // export 344 | window.requestAPI = requestAPI; 345 | 346 | }); 347 | 348 | 349 | -------------------------------------------------------------------------------- /src/js/player.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme: player 3 | * Dependence: jQuery 4 | * 5 | */ 6 | 7 | /** 8 | * dragProgress 9 | * @param {object} data {$progressArc,$progressBar,$progressBox,$audio,callback_move,callback_up} 10 | */ 11 | function dragProgress(data) { 12 | var $progressArc = data.$progressArc, 13 | $progressBar = data.$progressBar, 14 | $progressBox = data.$progressBox, 15 | $audio = data.$audio, 16 | progressBox_offset = $progressBox.get(0).getBoundingClientRect(), 17 | changeVal = 0; 18 | 19 | // 鼠标按下 20 | $progressArc.on("mousedown", function (ev) { 21 | var ev = ev ? ev : window.event; 22 | var ex = ev.clientX; 23 | var arcOffset = $progressArc.get(0).getBoundingClientRect(); 24 | var arcOffset_L = arcOffset.left; 25 | var disX = ex - arcOffset_L; 26 | 27 | var moveArc = function (ev) { 28 | // 更新进度条 29 | var ev = ev ? ev : window.event; 30 | var ex2 = ev.clientX; 31 | var disX2 = (((ex2 - progressBox_offset.left - disX) / progressBox_offset.width) * 100).toFixed(2); 32 | disX2 = disX2 <= 0 ? 0 : (disX2 >= 100 ? 100 : disX2); 33 | // 判断是否可以播放 34 | if (!!$audio.attr("src")) { 35 | $progressBar.css("width", disX2 + "%"); 36 | // 更新 37 | changeVal = data.callback_move && data.callback_move(disX2); 38 | } 39 | }; 40 | var offmouseup = function () { 41 | $(document).off("mousemove", moveArc); 42 | $(document).off("mouseup", offmouseup); 43 | // 判断是否可以播放 44 | if (!!$audio.attr("src")) { 45 | // 更新 46 | data.callback_up && data.callback_up(changeVal); 47 | } 48 | 49 | }; 50 | // 鼠标移动 51 | $(document).on("mousemove", moveArc); 52 | // 鼠标抬起 53 | $(document).on("mouseup", offmouseup); 54 | 55 | }); 56 | } 57 | /** 58 | * audio error 59 | * @param {HTMLAudioElement} audio 60 | * 61 | */ 62 | function audioError(audio) { 63 | // 音频数据出错 64 | // 0 = NETWORK_EMPTY - 音频/视频尚未初始化 65 | // 1 = NETWORK_IDLE - 音频/视频是活动的且已选取资源,但并未使用网络 66 | // 2 = NETWORK_LOADING - 浏览器正在下载数据 67 | // 3 = NETWORK_NO_SOURCE - 未找到音频/视频来源 68 | switch (+audio.networkState) { 69 | case 0: 70 | showTipBox("error", "音频尚未初始化"); 71 | break; 72 | case 1: 73 | // showTipBox("error","音频是活动的且已选取资源,但并未使用网络"); 74 | break; 75 | case 2: 76 | showTipBox("error", "浏览器正在下载数据"); 77 | break; 78 | case 3: 79 | showTipBox("error", "未找到音频来源"); 80 | break; 81 | default: console.warn("SWITCH ERROR"); 82 | break; 83 | } 84 | } 85 | 86 | $(function () { 87 | 88 | // 设置基本信息 89 | var curPlayLine = 0, // 当前播放曲目序号 90 | isDrag = false, // 是否允许拖动进度条 91 | timer = null, // 缓冲进度定时器timer 92 | volume = 0.5, // 默认音量 93 | bufferCache = 0, // 默认缓存进度 94 | bufferCacheStep = 1e3; // 默认加载缓存的时间间隔 95 | 96 | // DOM 97 | var media = $("#audio").get(0), // audio 98 | $playBtnGroup = $("#playBtnGroup"), // 播放按钮组 99 | $muteBtn = $("#muteBtn"), // 静音按钮 100 | $bgDisc = $("#bgDisc"), // 歌曲详情页 磁盘 101 | $discNeedle = $("#discNeedle"), // 歌曲详情页 磁针 102 | $bgBlur = $("#bgBlur"), // 歌曲详情页bg 103 | $songDetail = $("#songDetail"), // 歌曲详情页信息 104 | $smallwindow_albumPic = $("#smallwindow_albumPic"), // 小窗专辑图 105 | $smallwindow_songName = $("#smallwindow_songName"), // 小窗歌曲名字 106 | $smallwindow_singerName = $("#smallwindow_singerName"), // 小窗歌手名字 107 | $infoList_playlist = $("#infoList_playlist"), // 歌单列表 108 | $infoList_search = $("#infoList_search"),// 搜索列表 109 | $trs = $infoList_playlist.find("tr"), // 歌单列表tr 110 | $curTime = $("#audio_currentTime"), // 当前时间 111 | $duration = $("#audio_duration"), // 时长 112 | $time_progressBox = $("#progress_box"), // 进度条父元素 113 | $time_progressBar = $("#progress_bar"), // 进度条本身 114 | $time_progressArc = $("#progress_arc"), // 圆点 115 | $progress_cache = $("#progress_cache"), // 缓冲进度条 116 | $vol_progressBox = $("#vol_progress_box"), // 进度条父元素 117 | $vol_progressBar = $("#vol_progress_bar"), // 进度条本身 118 | $vol_progressArc = $("#vol_progress_arc"); // 圆点 119 | 120 | // ======================播放音乐主函数=============================== 121 | 122 | // @param: curPlayIndex[,$trs,_that] 123 | var playMusic = function () { 124 | var $trs = null; 125 | var _this = null; 126 | 127 | // 搜索页面 128 | if (arguments.length === 2) { 129 | $trs = arguments[0]; 130 | _this = arguments[1]; 131 | } else { // 歌单页面 132 | $trs = $infoList_playlist.find("tr"); 133 | _this = $trs.get(arguments[0]); 134 | } 135 | 136 | // 进度条初始化 137 | $time_progressBar.css("width", "0%"); 138 | $progress_cache.css("width", "0%"); 139 | // 音频暂停播放 140 | media.pause(); 141 | // 播放按钮变为暂停样式 142 | stylePlayBtn($playBtnGroup.find(".play"), "pause"); 143 | // 获取资源 144 | $(media).attr("src", _this.dataset.audio); 145 | // 进行播放 146 | $(media).on("canplay", function () { 147 | this.play(); 148 | }); 149 | // 播放按钮变为播放样式 150 | stylePlayBtn($playBtnGroup.find(".play"), "play"); 151 | // 高亮播放所在列 152 | $trs.find("td.index").each(function (index, item) { 153 | $(item).html(item.dataset.num).removeClass("active"); 154 | }); 155 | $(_this).find("td.index").html('').addClass("active"); 156 | // 刷新小窗歌曲信息 157 | $smallwindow_albumPic.attr("src", _this.dataset.albumPic); 158 | // 刷新小窗专辑封面 159 | $smallwindow_songName.html(_this.dataset.songName); 160 | $smallwindow_singerName.html(_this.dataset.singerName); 161 | // 储存当前歌曲必要信息 162 | sessionStorage.setItem("curPlayInfo_songID", _this.dataset.id); 163 | sessionStorage.setItem("curPlayInfo_songName", _this.dataset.songName); 164 | sessionStorage.setItem("curPlayInfo_singersName", _this.dataset.singerName); 165 | sessionStorage.setItem("curPlayInfo_albumName", _this.dataset.albumName); 166 | sessionStorage.setItem("curPlayInfo_albumPic", _this.dataset.albumPic); 167 | sessionStorage.setItem("curPlayInfo_audioSrc", _this.dataset.audio); 168 | 169 | // 刷新歌曲详情页bg和poster 170 | $bgBlur.css({ 171 | "backgroundImage": 'url("' + sessionStorage.getItem('curPlayInfo_albumPic') + '")' 172 | }); 173 | $bgDisc.css({ 174 | "backgroundImage": 'url("' + sessionStorage.getItem('curPlayInfo_albumPic') + '")' 175 | }); 176 | // 刷新歌曲基本信息 177 | $songDetail.find(".songname").html(sessionStorage.getItem('curPlayInfo_songName')); 178 | $songDetail.find(".albumname").html(sessionStorage.getItem('curPlayInfo_singersName')); 179 | $songDetail.find(".singersname").html(sessionStorage.getItem('curPlayInfo_albumName')); 180 | 181 | // 刷新歌词 182 | createScrollLrc(); 183 | }; 184 | // 恢复清空缓存 185 | var resetAndClear = function () { 186 | bufferCache = 0; 187 | bufferCacheStep = 1e3; 188 | }; 189 | 190 | // ===================初始化=============================== 191 | 192 | // 清除定时器 193 | clearInterval(timer); 194 | // 储存曲目数量 195 | sessionStorage.setItem("songLen", $trs.length); 196 | // 进度条初始化 197 | $time_progressBar.css("width", "0%"); 198 | $vol_progressBar.css("width", "50%"); 199 | // 缓冲条初始化 200 | $progress_cache.css("width", "0%"); 201 | // 音量初始化 202 | media.volume = volume; 203 | 204 | 205 | // ===============双击列表tr播放======================= 206 | 207 | // 双击列表tr播放 208 | $infoList_playlist.on("dblclick", "tr", function (ev) { 209 | var _this = this; 210 | curPlayLine = +_this.dataset.index; 211 | playMusic(curPlayLine); 212 | }); 213 | 214 | // 双击搜索列表tr播放 215 | $infoList_search.on("dblclick", "tr", function () { 216 | playMusic($infoList_search.find("tr"), this); 217 | }); 218 | 219 | 220 | // ===================播放器============================ 221 | 222 | // 播放按钮 223 | $playBtnGroup.find(".play").on("click", function () { 224 | if (!media.src) { 225 | showTipBox("info", "没有播放资源,请选择曲目"); 226 | } else { 227 | if (!media.paused) { 228 | media.pause(); 229 | // play按钮样式 230 | stylePlayBtn($playBtnGroup.find(".play"), "pause"); 231 | } else { 232 | media.play(); 233 | // play按钮样式 234 | stylePlayBtn($playBtnGroup.find(".play"), "play"); 235 | } 236 | audioError(media); 237 | } 238 | }); 239 | // 切换下一首 240 | $playBtnGroup.find(".next").on("click", function () { 241 | resetAndClear(); 242 | if (!media.src) { 243 | showTipBox("info", "没有播放资源,请选择曲目"); 244 | } else { 245 | var songLen = +sessionStorage.getItem("songLen"); 246 | curPlayLine = curPlayLine + 1 >= songLen ? 0 : curPlayLine + 1; 247 | playMusic(curPlayLine); 248 | } 249 | }); 250 | // 切换上一首 251 | $playBtnGroup.find(".prev").on("click", function () { 252 | resetAndClear(); 253 | if (!media.src) { 254 | showTipBox("info", "没有播放资源,请选择曲目"); 255 | } else { 256 | var songLen = +sessionStorage.getItem("songLen"); 257 | curPlayLine = curPlayLine - 1 < 0 ? songLen - 1 : curPlayLine - 1; 258 | playMusic(curPlayLine); 259 | } 260 | }); 261 | // 静音 262 | $muteBtn.on("click", function () { 263 | if (!media.muted) { 264 | media.muted = true; 265 | $muteBtn.html('').attr("title", "恢复音量"); 266 | $vol_progressBar.css("display", "none"); 267 | } else { 268 | media.muted = false; 269 | $muteBtn.html('').attr("title", "静音"); 270 | $vol_progressBar.css("display", "block"); 271 | } 272 | }); 273 | 274 | 275 | // ===============播放监听事件======================= 276 | 277 | // 更新时间 278 | $(media).on("timeupdate", function () { 279 | if (!isDrag) { 280 | var objTimeCurTime = formatTime(this.currentTime); 281 | var objTimeDuration = formatTime(this.duration); 282 | $curTime.html(objTimeCurTime.I + ":" + objTimeCurTime.S); 283 | $duration.html(objTimeDuration.I + ":" + objTimeDuration.S); 284 | // 更新进度条 285 | $time_progressBar.css("width", (this.currentTime / this.duration).toFixed(4) * 100 + "%"); 286 | } 287 | }); 288 | // 播放完成 自动播放下一首 直至最后一首停止 289 | $(media).on("ended", function () { 290 | var songLen = +sessionStorage.getItem("songLen"); 291 | if (curPlayLine + 1 >= songLen) { 292 | $(this).get(0).pause(); 293 | stylePlayBtn($playBtnGroup.find(".play"), "pause"); 294 | } else { 295 | curPlayLine = curPlayLine + 1; 296 | playMusic(curPlayLine); 297 | } 298 | }); 299 | 300 | 301 | 302 | // ===============拖动进度条事件======================= 303 | 304 | // 改变时间 305 | dragProgress({ 306 | $progressBox: $time_progressBox, 307 | $progressBar: $time_progressBar, 308 | $progressArc: $time_progressArc, 309 | $audio: $(media), 310 | callback_move: function (disX2) { 311 | // 改变播放时间 312 | isDrag = true; 313 | var changeVal = (media.duration * disX2 / 100).toFixed(2); 314 | var objTime = formatTime(changeVal); 315 | $curTime.html(objTime.I + ":" + objTime.S); 316 | return changeVal; 317 | }, 318 | callback_up: function (changeVal) { 319 | // 改变播放位置 320 | isDrag = false; 321 | media.currentTime = changeVal; 322 | stylePlayBtn($playBtnGroup.find(".play"), "play"); 323 | } 324 | }); 325 | 326 | // 改变音量 327 | dragProgress({ 328 | $progressBox: $vol_progressBox, 329 | $progressBar: $vol_progressBar, 330 | $progressArc: $vol_progressArc, 331 | $audio: $(media), 332 | callback_move: function (disX2) { 333 | // 更新音量 334 | media.volume = (1 * disX2 / 100).toFixed(2); 335 | if (media.volume <= 0) { 336 | $muteBtn.html('') 337 | } else { 338 | $muteBtn.html('') 339 | } 340 | return 0; 341 | } 342 | }); 343 | 344 | // =======================磁盘转动动画=========================== 345 | 346 | // 监听音频播放事件 347 | $(media).on("play", function () { 348 | // 转盘动画恢复 349 | $bgDisc.css({ 350 | "-webkit-animation-play-state": "running", 351 | "animation-play-state": "running" 352 | }); 353 | // 磁针放下 354 | $discNeedle.addClass("play"); 355 | }); 356 | // 监听音频暂停事件 357 | $(media).on("pause", function () { 358 | // 转盘动画停止 359 | $bgDisc.css({ 360 | "-webkit-animation-play-state": "paused", 361 | "animation-play-state": "paused" 362 | }); 363 | // 磁针抬起 364 | $discNeedle.removeClass("play"); 365 | }); 366 | 367 | 368 | // ===================缓冲进度======================= 369 | 370 | // 判断文件缓冲进度 371 | function laodBuffer() { 372 | // 音频就绪 media.readyState==4 可用数据足以开始播放 373 | if (media.readyState === 4) { 374 | // 获取已缓冲部分的 TimeRanges 对象 375 | var timeRanges = media.buffered; 376 | // 获取最后缓存范围的位置 377 | var timeBuffered = timeRanges.end(timeRanges.length - 1); 378 | // 获取缓存进度,值为0到1 379 | var bufferPercent = (timeBuffered / media.duration).toFixed(3); 380 | // 更新缓冲进度条 381 | $progress_cache.css("width", bufferPercent * 100 + "%"); 382 | console.log(`已缓存${bufferPercent * 100}%`); 383 | if (bufferPercent >= 1) { 384 | clearInterval(timer); 385 | } 386 | if (bufferPercent === bufferCache) { 387 | bufferCacheStep *= 1.2; 388 | console.log(bufferCacheStep); 389 | } 390 | bufferCache = bufferPercent; 391 | } 392 | timer = setTimeout(laodBuffer, bufferCacheStep); 393 | } 394 | timer = setTimeout(laodBuffer, bufferCacheStep); 395 | }); -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 网易云音乐 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |

推荐

19 |
20 |

  发现音乐

21 |

  私人FM

22 |

  MV

23 |

  我的朋友

24 |
25 |
26 |
27 |

我的音乐

28 |
29 |

  本地音乐

30 |

  下载管理

31 |

  我的音乐云盘

32 |

  我的歌手

33 |

  我的MV

34 |

  我的电台

35 |
36 |
37 |
38 |

创建的歌单 39 | 40 | 41 | 42 | 43 |

44 |
45 |

  我喜欢的音乐

46 |

  歌单001

47 |
48 |
49 |
50 |

收藏的歌单 51 | 52 | 53 | 54 |

55 |
56 |

  当年烂大街的舞曲

57 |
58 |
59 |
60 | 61 |
62 |
63 | 64 |
65 |
66 |
67 |

-SONGNAME-

68 |

-SINGER-

69 |
70 |
71 |
72 | 73 |
74 |
75 |
76 | 77 | 89 | 90 |
91 | 92 |
93 | 94 |
95 | 96 |
97 | 98 |
99 |
100 |
101 | 102 |
103 |
104 |
105 |
106 |
00:00
107 |
59:59
108 |
109 |
110 | 111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | 123 |
124 |
125 |
126 |
127 |
128 | 129 |
130 |
131 |
132 |   0 133 |   0 134 |
135 |
136 | 歌单 137 | 歌单名称 138 |
139 |
140 | 141 | user008 142 | 1970-01-01 143 | 创建 144 |
145 |
146 |   播放全部 147 | 149 |   收藏(0) 150 |   分享(0) 151 |   下载全部 152 |
153 |
154 |
155 |
156 |
157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 |
165 | 166 | 167 |
168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 |
  操作音乐标题歌手专辑时长
01  183 | 184 | -SONGNAME--SINGER--ALBUM-00:00
193 |
194 | 195 | 196 |
197 |
198 | 199 | 140 200 | 201 | 202 | 评论 203 |
204 |
205 |
206 |
最新评论(0)
207 |
208 |

用户008Lorem ipsum 209 | dolor sit amet, consectetur adipisicing elit. Laborum, earum cupiditate facere suscipit tenetur quia ab 210 | quasi ea eligendi, neque esse quidem. Eius, quasi! Odit veniam repellat amet, accusamus voluptatem.

211 |
212 | 2016年12月31日 10:35:06 213 | 214 | 举报  |   215 | (0)  |   216 | 分享  |   217 | 回复 218 | 219 |
220 |
221 |
222 |
223 |

用户008Lorem ipsum 224 | dolor sit amet, consectetur adipisicing elit.

225 |
226 | 2016年12月31日 10:35:06 227 | 228 | 举报  |   229 | (0)  |   230 | 分享  |   231 | 回复 232 | 233 |
234 |
235 |
236 |
237 |
238 |
精彩评论(0)
239 |
240 |

-- 暂无评论 --

241 |
242 |
243 |
244 |
245 | 246 | 247 |
248 |
249 | 250 |
-USERNAME-
251 |
252 |
253 | 254 |
-USERNAME-
255 |
256 |
257 | 258 |
-USERNAME-
259 |
260 |
261 |
262 |
263 |
264 |
265 | 266 | 350 | 351 |
352 | 353 |
354 |
355 |
356 | 357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |   喜欢 365 |   收藏 366 |   下载 367 |   分享 368 |
369 |
370 |
371 |
372 |

--SONGNAME--MV320k

373 |

374 | 专辑:--ALBUMNAME-- 375 | 376 | 歌手:--ALBUMNAME-- 377 | 378 | 来源:--ORIGIN-- 379 | 380 |

381 |
382 |
383 |
384 | 385 |
386 |
387 |
388 |
389 |
390 | 391 | 392 | 393 |
394 | 395 |
396 |

  ERROR 397 | STRING

398 |

  INFO 399 | STRING

400 |

  OK 401 | STRING

402 |
403 | 404 |
405 | 406 | 407 | 408 |
409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | -------------------------------------------------------------------------------- /src/css/index.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /* reset */ 3 | *{padding:0;margin:0;} 4 | html,body{width:100%;height:100%;overflow:hidden;} 5 | html{/*font-size:62.5%;*/font-size:20px; /* rem 20>12 20>16 20=10*n */} 6 | body{ 7 | min-width:1024px; 8 | font-size:0.7rem; 9 | font-family:"Microsoft YaHei"; 10 | background-color:#fafafa; 11 | position:relative; 12 | -moz-user-select:none; /* 禁止选中文字 */ 13 | } 14 | img{display:block;border-width:0px;} 15 | a{text-decoration:none;color:#656567;} 16 | a:hover{color:#111;} 17 | table,td,th{ 18 | /*border:1px solid #333;*/ 19 | border-collapse:collapse; 20 | } 21 | .clearfix{zoom:1;} 22 | .clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;} 23 | /* scrollbar */ 24 | /* -webkit- */ 25 | ::-webkit-scrollbar { 26 | width:8px; 27 | height:8px; 28 | } 29 | ::-webkit-scrollbar-button { 30 | display:none; 31 | } 32 | ::-webkit-scrollbar-track { 33 | background:transparent; 34 | } 35 | ::-webkit-scrollbar-track-piece { 36 | background:transparent; 37 | } 38 | ::-webkit-scrollbar-thumb{ 39 | background-color:#ccc; 40 | border-radius:5px; 41 | } 42 | ::-webkit-scrollbar-thumb:hover{ 43 | background-color:#9c9797; 44 | } 45 | ::-webkit-scrollbar-corner { 46 | display:none; 47 | } 48 | ::-webkit-scrollbar-resizer { 49 | display:none; 50 | } 51 | /* main */ 52 | /* ------------------------page_menu------------------------------- */ 53 | .page_menu{ 54 | position:fixed; 55 | top:0;left:0; 56 | width:100%; 57 | height:60px; 58 | padding:0 15px; 59 | box-sizing:border-box; 60 | background-color:#c52f30; 61 | z-index:9; 62 | } 63 | .page_menu>div{ 64 | float:left; 65 | position:relative; 66 | top:50%;left:0; 67 | -webkit-transform:translate(0,-50%); 68 | transform:translate(0,-50%); 69 | } 70 | .menu_btngroups{ 71 | margin:0 20px 0 100px; 72 | } 73 | .menu_btngroups>.btn{ 74 | padding:3px 10px; 75 | border:1px solid #982b26; 76 | color:#ffefe4; 77 | } 78 | .menu_btngroups>.btn.backward{ 79 | border-top-left-radius:5px; 80 | border-bottom-left-radius:5px; 81 | } 82 | .menu_btngroups>.btn.forward{ 83 | border-left:none; 84 | border-top-right-radius:5px; 85 | border-bottom-right-radius:5px; 86 | } 87 | .menu_btngroups>.btn>.fa{ 88 | font-size:1rem; 89 | } 90 | .menu_search{ 91 | position:relative; 92 | } 93 | .menu_search>.search_inp{ 94 | display:inline-block; 95 | border:none; 96 | outline:none; 97 | width:160px; 98 | padding:5px 30px 5px 10px; 99 | border-radius:10px; 100 | background-color:rgba(0,0,0,0.5); 101 | color:#ccc; 102 | } 103 | .menu_search>.search_btn{ 104 | position:absolute; 105 | top:50%;right:10px; 106 | -webkit-transform:translate(0,-50%); 107 | transform:translate(0,-50%); 108 | cursor:pointer; 109 | } 110 | .menu_search>.search_btn>.fa{ 111 | font-size:0.7rem; 112 | color:#ccc; 113 | } 114 | /* ------------------------page_playerbar------------------------------- */ 115 | .page_playerbar{ 116 | position:fixed; 117 | bottom:0;left:0; 118 | width:100%; 119 | height:60px; 120 | border-top:1px solid #dadadc; 121 | background-color:#f6f6f8; 122 | z-index:9; 123 | } 124 | 125 | .playerbar_playbtngroup{ 126 | float:left; 127 | width:220px; 128 | height:100%; 129 | text-align:center; 130 | } 131 | .playerbar_playbtngroup>.btn{ 132 | display:inline-block; 133 | width:40px; 134 | height:40px; 135 | margin-left:16px; 136 | border-radius:50%; 137 | position:relative; 138 | top:50%;left:0; 139 | -webkit-transform:translate(0,-50%); 140 | transform:translate(0,-50%); 141 | background-color:#c52f30; 142 | color:#f7f7f7; 143 | cursor:pointer; 144 | } 145 | .playerbar_playbtngroup>.btn.play{ 146 | width:44px; 147 | height:44px; 148 | } 149 | .playerbar_playbtngroup>.btn>.fa{ 150 | position:relative; 151 | top:50%;left:0; 152 | -webkit-transform:translate(0,-50%); 153 | transform:translate(0,-50%); 154 | font-size:1rem; 155 | font-weight:lighter; 156 | } 157 | .playerbar_others{ 158 | float:right; 159 | height:100%; 160 | } 161 | .playerbar_others>.volume{ 162 | position:relative; 163 | top:50%;left:0; 164 | margin:0 15px; 165 | -webkit-transform:translate(0,-50%); 166 | transform:translate(0,-50%); 167 | } 168 | .playerbar_others>.volume>div{ 169 | display:inline-block; 170 | margin:0 5px; 171 | } 172 | .playerbar_others>.volume>.mutebtn{ 173 | cursor:pointer; 174 | } 175 | .playerbar_others>.volume>.mutebtn>.fa{ 176 | font-weight:lighter; 177 | font-size:1rem; 178 | color:#656567; 179 | } 180 | .playerbar_others>.volume>.mutebtn:hover>.fa{ 181 | color:#111; 182 | } 183 | .playerbar_others>.volume>.progress, 184 | .playerbar_timeprogress>.progress{ 185 | position:relative; 186 | top:50%;left:0; 187 | -webkit-transform:translate(0,-50%); 188 | transform:translate(0,-50%); 189 | width:150px; 190 | height:6px; 191 | border-radius:5px; 192 | background-color:#cbcfd1; 193 | } 194 | .volume>.progress>.progress_curbar, 195 | .playerbar_timeprogress>.progress>.progress_curbar{ 196 | position:absolute; 197 | top:0;left:0; 198 | width:0; 199 | height:100%; 200 | border-radius:5px; 201 | background-color:#e73d3d; 202 | } 203 | .volume>.progress>.progress_curbar>.curbar_arc, 204 | .playerbar_timeprogress>.progress>.progress_curbar>.curbar_arc{ 205 | position:absolute; 206 | top:50%;left:100%; 207 | width:14px; 208 | height:14px; 209 | border-radius:50%; 210 | box-shadow:0 0 2px #bbb; 211 | -webkit-transform:translate(-50%,-50%); 212 | transform:translate(-50%,-50%); 213 | background-color:#fff; 214 | cursor:pointer; 215 | } 216 | .volume>.progress>.progress_curbar>.curbar_arc:after, 217 | .playerbar_timeprogress>.progress>.progress_curbar>.curbar_arc:after{ 218 | content:""; 219 | position:absolute; 220 | top:50%;left:50%; 221 | -webkit-transform:translate(-50%,-50%); 222 | transform:translate(-50%,-50%); 223 | width:6px; 224 | height:6px; 225 | border-radius:50%; 226 | background-color:#c52f30; 227 | } 228 | .volume>.progress>.progress_curbar>.curbar_arc:hover, 229 | .playerbar_timeprogress>.progress>.progress_curbar>.curbar_arc:hover{ 230 | box-shadow:0 0 5px rgba(0,0,0,0.3); 231 | } 232 | /* 音量小圆点的显示与隐藏 */ 233 | .volume>.progress>.progress_curbar>.curbar_arc{ 234 | visibility:hidden; 235 | } 236 | .volume>.progress:hover>.progress_curbar>.curbar_arc{ 237 | visibility:visible; 238 | } 239 | /* 缓冲进度条 */ 240 | .playerbar_timeprogress>.progress>.progress_cache{ 241 | position:absolute; 242 | top:0;left:0; 243 | width:0; 244 | height:100%; 245 | background-color:#ababab; 246 | -webkit-transition:width ease 0.5s; 247 | transition:width ease 0.5s; 248 | } 249 | .playerbar_timeprogress{ 250 | float:left; 251 | width:calc(100% - 220px - 150px - 150px); 252 | height:100%; 253 | } 254 | .playerbar_timeprogress>.progress{ 255 | width:85%; 256 | margin:0 auto; 257 | } 258 | .playerbar_timeprogress>.progress>.time{ 259 | position:absolute; 260 | top:50%; 261 | -webkit-transform:translate(0,-50%); 262 | transform:translate(0,-50%); 263 | } 264 | .playerbar_timeprogress>.progress>.start{ 265 | right:101%; 266 | } 267 | .playerbar_timeprogress>.progress>.end{ 268 | left:101%; 269 | } 270 | /* ------------------------page_list------------------------------- */ 271 | .page_list{ 272 | position:absolute; 273 | top:0;left:0; 274 | width:220px; 275 | height:100%; 276 | padding:60px 0 120px 0; 277 | border-right:1px solid #dadadc; 278 | background-color:#f5f5f7; 279 | box-sizing:border-box; 280 | } 281 | .page_list>.list_container{ 282 | height:100%; 283 | overflow-y:scroll; 284 | } 285 | .list_container>.list{ 286 | margin-bottom:10px; 287 | } 288 | .list>.title{ 289 | padding-left:10px; 290 | line-height:2rem; 291 | color:#8a8a8c; 292 | position:relative; 293 | } 294 | .list>.title>.title_btngroups{ 295 | position:absolute; 296 | top:50%;right:15px; 297 | -webkit-transform:translate(0,-50%); 298 | transform:translate(0,-50%); 299 | } 300 | .list>.title>.title_btngroups>.btn{ 301 | margin:0 3px; 302 | } 303 | .list>.title>.title_btngroups>.btn>.fa{ 304 | font-size:0.8rem; 305 | } 306 | .list>.btngroups>.btn{ 307 | padding-left:20px; 308 | line-height:2rem; 309 | border-left:3px solid transparent; 310 | color:#656567; 311 | cursor:pointer; 312 | } 313 | .list>.btngroups>.btn:hover{ 314 | color:#111; 315 | } 316 | .list>.btngroups>.btn.active{ 317 | border-color:#c52f30; 318 | background-color:#e3e3e5; 319 | color:#111; 320 | } 321 | .page_list>.playlist_smallwindow{ 322 | position:absolute; 323 | bottom:60px;left:0; 324 | width:220px; 325 | height:60px; 326 | border:1px solid #dadadc; 327 | border-left:none; 328 | box-sizing:border-box; 329 | background-color:#f6f6f8; 330 | z-index:6; 331 | } 332 | .playlist_smallwindow>.poster{ 333 | float:left; 334 | width:30%; 335 | height:100%; 336 | position:relative; 337 | overflow:hidden; 338 | } 339 | .poster>img{ 340 | width:100%; 341 | height:100%; 342 | } 343 | .poster>.poster_hoverback{ 344 | display:none; 345 | position:absolute; 346 | top:0;left:0; 347 | width:100%; 348 | height:100%; 349 | background-color:rgba(0,0,0,0.5); 350 | color:rgba(255,255,255,0.65); 351 | cursor:pointer; 352 | } 353 | .poster>.poster_hoverback>.fa{ 354 | position:relative; 355 | top:50%;left:50%; 356 | -webkit-transform:translate(-50%,-50%); 357 | transform:translate(-50%,-50%); 358 | font-size:1.8rem; 359 | font-weight:lighter; 360 | } 361 | .poster:hover>.poster_hoverback{ 362 | display:block; 363 | } 364 | .playlist_smallwindow>.info{ 365 | float:left; 366 | width:55%; 367 | } 368 | .playlist_smallwindow>.info>p{ 369 | margin:5px 10px; 370 | white-space:nowrap; 371 | text-overflow:ellipsis; 372 | overflow:hidden; 373 | cursor:pointer; 374 | } 375 | .playlist_smallwindow>.btngroups{ 376 | position:absolute; 377 | top:0;right:15px; 378 | height:100%; 379 | } 380 | .playlist_smallwindow>.btngroups>.btn{ 381 | height:50%; 382 | text-align:center; 383 | cursor:pointer; 384 | } 385 | .playlist_smallwindow>.btngroups>.btn>.fa{ 386 | position:relative; 387 | top:50%;left:0; 388 | -webkit-transform:translate(0,-50%); 389 | transform:translate(0,-50%); 390 | font-size:0.8rem; 391 | } 392 | 393 | /* ------------------------R_page page_right------------------------------- */ 394 | .R_page{ 395 | padding:60px 0 60px 220px; 396 | height:100%; 397 | box-sizing:border-box; 398 | } 399 | .R_page>.main_container{ 400 | height:100%; 401 | overflow-y:scroll; 402 | } 403 | .listcontainer{ 404 | width:100%; 405 | overflow:hidden; 406 | } 407 | .listcontainer>.listinfo{ 408 | padding:20px 40px; 409 | margin-bottom:30px; 410 | } 411 | .listcontainer>.listinfo>.info_listpic{ 412 | float:left; 413 | width:200px; 414 | margin-right:40px; 415 | position:relative; 416 | } 417 | .listcontainer>.listinfo>.info_listpic>img{ 418 | width:100%; 419 | height:auto; 420 | } 421 | .listcontainer>.listinfo>.info_detailtext{ 422 | float:left; 423 | width:calc(100% - 200px - 40px); 424 | position:relative; 425 | } 426 | .listcontainer>.listinfo>.info_detailtext>.playinfo{ 427 | position:absolute; 428 | top:0;right:0; 429 | } 430 | .listcontainer>.listinfo>.info_detailtext>.playinfo>span{ 431 | margin:0 5px; 432 | color:#646464; 433 | } 434 | .listcontainer>.listinfo>.info_detailtext>.detail_name>.listtag{ 435 | display:inline-block; 436 | padding:5px 10px; 437 | background-color:#c52f30; 438 | color:#f1f1f1; 439 | } 440 | .listcontainer>.listinfo>.info_detailtext>.detail_name>.listname{ 441 | margin:0 5px; 442 | font-size:1rem; 443 | } 444 | .listcontainer>.listinfo>.info_detailtext>.detail_time{ 445 | margin:15px 0; 446 | padding-left:50px; 447 | position:relative; 448 | } 449 | .listcontainer>.listinfo>.info_detailtext>.detail_time>span{ 450 | margin:0 5px; 451 | } 452 | .listcontainer>.listinfo>.info_detailtext>.detail_time>.userpic{ 453 | display:inline-block; 454 | position:absolute; 455 | top:50%;left:0; 456 | width:30px; 457 | height:30px; 458 | border:1px solid #dadadc; 459 | border-radius:50%; 460 | -webkit-transform:translate(0,-50%); 461 | transform:translate(0,-50%); 462 | overflow:hidden; 463 | } 464 | .listcontainer>.listinfo>.info_detailtext>.detail_time>.userpic>a>img{ 465 | width:100%; 466 | height:auto; 467 | } 468 | .listcontainer>.listinfo>.info_detailtext>.detail_btns>.btn{ 469 | display:inline-block; 470 | margin:0 5px; 471 | padding:5px 10px; 472 | border:1px solid #dadadc; 473 | border-radius:5px; 474 | cursor:pointer; 475 | } 476 | .listcontainer>.listinfo>.info_detailtext>.detail_btns>.btn.playall{ 477 | margin-right:0; 478 | border-top-right-radius:0; 479 | border-bottom-right-radius:0; 480 | } 481 | .listcontainer>.listinfo>.info_detailtext>.detail_btns>.btn.plus{ 482 | margin-left:0; 483 | border-left:none; 484 | border-top-left-radius:0; 485 | border-bottom-left-radius:0; 486 | } 487 | .listcontainer>.listinfo>.info_detailtext>.detail_btns>.btn:hover{ 488 | background-color:#f5f5f7; 489 | } 490 | .listcontainer>.listinfo>.info_detailtext>.detail_btns>.btn>.fa{ 491 | font-size:0.8rem; 492 | } 493 | .listcontainer>.listtab>.tabbtns{ 494 | padding:0 40px; 495 | border-bottom:1px solid #c52f30; 496 | } 497 | .listcontainer>.listtab>.tabbtns>label{ 498 | display:inline-block; 499 | padding:0.5em 2em; 500 | margin:0 3px; 501 | border:1px solid #dadadc; 502 | border-bottom:none; 503 | cursor:pointer; 504 | } 505 | .listcontainer>.listtab>.tabbtns>label:hover{ 506 | background-color:#e3e3e5; 507 | } 508 | .listcontainer>.listtab>.tabbtns>label.active{ 509 | background-color:#c52f30; 510 | color:#f1f1f1; 511 | border-color:#c52f30; 512 | } 513 | .listcontainer>.listtab>.tabbtns>.menu_search{ 514 | float:right; 515 | } 516 | .listcontainer>.listtab>.tabbtns>.menu_search>.search_inp{ 517 | background-color:#fff; 518 | color:#666; 519 | border:1px solid #dadadc; 520 | } 521 | .listcontainer>.listtab>.tabitem{ 522 | display:none; 523 | } 524 | .listcontainer>.listtab>input{ 525 | position:fixed; 526 | top:0;left:-9999px; 527 | } 528 | /* "+" 相邻兄弟选择器 "~" 通用兄弟选择器 */ 529 | .listcontainer>.listtab>input:checked + .tabitem{ 530 | display:block; 531 | } 532 | .musiclist>table{ 533 | width:100%; 534 | text-align:left; 535 | vertical-align:middle; 536 | background-color:#fafafa; 537 | color:#313131; 538 | } 539 | .musiclist>table td, 540 | .musiclist>table th{ 541 | padding-left:15px; 542 | max-width:200px; 543 | height:2rem; 544 | font-weight:lighter; 545 | white-space:nowrap; 546 | text-overflow:ellipsis; 547 | overflow:hidden; 548 | } 549 | .musiclist>table th{ 550 | border-right:1px solid #e0e0e0; 551 | box-sizing:border-box; 552 | color:#6d7172; 553 | } 554 | .musiclist>table th:last-of-type{ 555 | border:none; 556 | } 557 | .musiclist>table td>img{ 558 | width:100%; 559 | height:auto; 560 | } 561 | .musiclist>table>tbody>tr:nth-of-type(odd){ 562 | background-color:#f5f5f7; 563 | } 564 | .musiclist>table>tbody>tr:hover, 565 | .musiclist>table>tbody>tr.active{ 566 | background-color:#e3e3e5; 567 | } 568 | .musiclist>table>tbody>tr>td:first-of-type{ 569 | padding-right:10px; 570 | text-align:right; 571 | color:#9c9c9c; 572 | } 573 | .musiclist>table>tbody>tr>td.index.active{ 574 | font-size:0.8rem; 575 | color:#c52f30; 576 | } 577 | .followerlist{ 578 | padding:20px 50px; 579 | } 580 | .followerlist>figure{ 581 | display:inline-block; 582 | width:80px; 583 | margin:10px 20px; 584 | text-align:center; 585 | } 586 | .followerlist>figure>a>img{ 587 | display:inline-block; 588 | width:60px; 589 | height:60px; 590 | border-radius:50%; 591 | } 592 | .followerlist>figure>figcaption{ 593 | width:100%; 594 | white-space:nowrap; 595 | text-overflow:ellipsis; 596 | font-size:0.6rem; 597 | overflow:hidden; 598 | } 599 | .commentlist{ 600 | padding:15px 40px; 601 | } 602 | .commentlist>.commentbox{ 603 | width:100%; 604 | padding:10px 10px 15px 10px; 605 | background-color:#f0f0f2; 606 | position:relative; 607 | } 608 | .commentlist>.commentbox>textarea{ 609 | margin-bottom:10px; 610 | padding:5px 10px; 611 | width:100%; 612 | height:80px; 613 | resize:none; 614 | outline:none; 615 | border:1px solid #e3e3e5; 616 | background-color:#fff; 617 | box-sizing:border-box; 618 | } 619 | .commentlist>.commentbox>.wordslen{ 620 | position:absolute; 621 | top:66px;right:15px; 622 | color:#8b8b86; 623 | } 624 | .commentlist>.commentbox>.btn.comment{ 625 | float:right; 626 | display:inline-block; 627 | padding:5px 10px; 628 | border:1px solid #e3e3e5; 629 | border-radius:5px; 630 | background-color:#fdfdfd; 631 | } 632 | .commentlist>.commentbox>.btn.emoji, 633 | .commentlist>.commentbox>.btn.at{ 634 | float:left; 635 | margin-right:10px; 636 | font-size:1rem; 637 | } 638 | .commentlist>.commenttable{ 639 | margin:30px 0; 640 | } 641 | .commentlist>.commenttable>.comment>.title{ 642 | margin:10px 0; 643 | font-size:0.8rem; 644 | color:#a5a4a9; 645 | } 646 | .commentlist>.commenttable>.comment>.content{ 647 | padding:1em 0 1em 60px; 648 | border-top:1px solid #eee; 649 | position:relative; 650 | } 651 | .commentlist>.commenttable>.comment>.content>.userface{ 652 | position:absolute; 653 | top:1em;left:0; 654 | width:40px; 655 | height:40px; 656 | } 657 | .commentlist>.commenttable>.comment>.content>.userface>a>img{ 658 | width:100%; 659 | height:auto; 660 | } 661 | .commentlist>.commenttable>.comment>.content>p{ 662 | margin-bottom:1em; 663 | } 664 | .commentlist>.commenttable>.comment>.content>p>.username>a{ 665 | color:#0b75c3; 666 | } 667 | .commentlist>.commenttable>.comment>.content>p>.usersay{ 668 | color:#343434; 669 | } 670 | .commentlist>.commenttable>.comment>.content>.btngroups>.time{ 671 | float:left; 672 | color:#939393; 673 | } 674 | .commentlist>.commenttable>.comment>.content>.btngroups>.btn{ 675 | float:right; 676 | } 677 | /* ------------------------page_lric------------------------------- */ 678 | .page_songdetail{ 679 | position:fixed; 680 | top:100%;right:100%; 681 | width:100%; 682 | height:100%; 683 | background-color:#fff; 684 | overflow:auto; 685 | -webkit-transition:all 0.5s ease; 686 | transition:all 0.5s ease; 687 | z-index:8; 688 | } 689 | .page_songdetail>.maincontainer{ 690 | width:1000px; 691 | margin:50px auto; 692 | position:relative; 693 | } 694 | .page_songdetail>.maincontainer>.compressbtn{ 695 | position:absolute; 696 | top:0;left:101%; 697 | padding:5px 10px; 698 | border:1px solid #dee2e3; 699 | border-radius:5px; 700 | font-size:1rem; 701 | background-color:#f8f9fb; 702 | cursor:pointer; 703 | } 704 | .page_songdetail>.maincontainer>.compressbtn:hover{ 705 | background-color:#f5f5f7; 706 | } 707 | .page_songdetail>.maincontainer>.lyricsection, 708 | .page_songdetail>.maincontainer>.discsection{ 709 | float:left; 710 | height:400px; 711 | } 712 | .page_songdetail>.maincontainer>.lyricsection{ 713 | width:55%; 714 | } 715 | .page_songdetail>.maincontainer>.discsection{ 716 | width:45%; 717 | position:relative; 718 | } 719 | .page_songdetail>.maincontainer>.lyricsection>.lrcinfo{ 720 | height:100px; 721 | } 722 | .page_songdetail>.maincontainer>.lyricsection>.lrcinfo>.info_song, 723 | .page_songdetail>.maincontainer>.lyricsection>.lrcinfo>.info_album{ 724 | max-width:100%; 725 | margin-bottom:10px; 726 | white-space:nowrap; 727 | text-overflow:ellipsis; 728 | overflow:hidden; 729 | } 730 | .page_songdetail>.maincontainer>.lyricsection>.lrcinfo>.info_song>.songname{ 731 | font-size:1rem; 732 | } 733 | .page_songdetail>.maincontainer>.lyricsection>.lrcinfo>.info_song>.label{ 734 | display:inline-block; 735 | margin:0 6px; 736 | padding:2px; 737 | border:1px solid #f00; 738 | color:#f00; 739 | } 740 | .page_songdetail>.maincontainer>.lyricsection>.lrcinfo>.info_album>span{ 741 | display:inline-block; 742 | margin-right:10px; 743 | } 744 | .page_songdetail>.maincontainer>.lyricsection>.lrccontainer{ 745 | height:calc(100% - 100px); 746 | border-right:1px solid #ccc; 747 | overflow:auto; 748 | } 749 | .page_songdetail>.maincontainer>.lyricsection>.lrccontainer>.lrcbox>.lrc{ 750 | padding:10px 0; 751 | color:#202016; 752 | } 753 | .page_songdetail>.maincontainer>.lyricsection>.lrccontainer>.lrcbox>.lrc.current{ 754 | text-shadow:0 0 3px #333; 755 | color:#f9fcf5; 756 | } 757 | .page_songdetail>.maincontainer>.discsection>.disc_arc{ 758 | width:320px; 759 | height:320px; 760 | border-radius:50%; 761 | background-color:rgba(251, 251, 251, 0.08); 762 | background-image:url("../images/disc.png"); 763 | background-repeat:no-repeat; 764 | background-position:center center; 765 | background-size:68%; 766 | border:3px solid rgba(251, 251, 251, 0.08); 767 | overflow:hidden; 768 | } 769 | .page_songdetail>.maincontainer>.discsection>.disc_arc>.poster{ 770 | width:100%; 771 | height:100%; 772 | overflow:hidden; 773 | } 774 | .page_songdetail>.maincontainer>.discsection>.disc_arc>.poster>img{ 775 | display:block; 776 | width:100%; 777 | height:100%; 778 | } 779 | .page_songdetail>.maincontainer>.discsection>.disc_needle{ 780 | position:absolute; 781 | top:-72px;left:30%; 782 | -webkit-transform:rotate(-40deg); 783 | transform:rotate(-40deg); 784 | transform-origin:16px 16px; 785 | -webkit-transition:all 0.3s ease; 786 | transition:all 0.3s ease; 787 | z-index:6; 788 | } 789 | .page_songdetail>.maincontainer>.discsection>.disc_btns{ 790 | position:absolute; 791 | bottom:0;left:0; 792 | width:100%; 793 | } 794 | .page_songdetail>.maincontainer>.discsection>.disc_btns>.btn{ 795 | display:inline-block; 796 | margin:0 5px; 797 | padding:5px 10px; 798 | border:1px solid #c1c5c6; 799 | border-radius:5px; 800 | background-color:#f6fafb; 801 | cursor:pointer; 802 | } 803 | .page_songdetail>.maincontainer>.discsection>.disc_btns>.btn:hover{ 804 | background-color:#f5f5f7; 805 | } 806 | /* animation */ 807 | .page_songdetail>.maincontainer>.discsection>.disc_needle.play{ 808 | -webkit-transform:rotate(-8deg); 809 | transform:rotate(-8deg); 810 | } 811 | .page_songdetail>.maincontainer>.discsection>.disc_arc{ 812 | -webkit-animation:rotateARC linear 20s infinite normal; 813 | animation:rotateARC linear 20s infinite normal; 814 | -webkit-animation-play-state:paused; 815 | animation-play-state:paused; 816 | } 817 | @keyframes rotateARC{ 818 | 0%{ 819 | -webkit-transform:rotate(0deg); 820 | transform:rotate(0deg); 821 | } 822 | 100%{ 823 | -webkit-transform:rotate(360deg); 824 | transform:rotate(360deg); 825 | } 826 | } 827 | 828 | 829 | 830 | 831 | /* ------------------------plugins------------------------------- */ 832 | /* plugins */ 833 | /* backscreen */ 834 | .g_backscreen{ 835 | display:none; 836 | position:fixed; 837 | top:0;left:0; 838 | bottom:0;right:0; 839 | background-color:rgba(0,0,0,0.15); 840 | z-index:8; 841 | } 842 | /* tipsbox */ 843 | .g_tipsbox{ 844 | display:none; 845 | position:fixed; 846 | top:50%;left:50%; 847 | padding:20px 30px; 848 | -webkit-transform:translate(-50%,-50%); 849 | transform:translate(-50%,-50%); 850 | font-size:1.5rem; 851 | background-color:rgba(0,0,0,0.8); 852 | color:#f7f7f7; 853 | z-index:9; 854 | opacity:0; 855 | -webkit-animation:hideTipsBox 1s ease; 856 | animation:hideTipsBox 1s ease; 857 | } 858 | .g_tipsbox>.tip{ 859 | display:none; 860 | } 861 | .g_tipsbox>.tip.show{ 862 | display:block; 863 | } 864 | @-webkit-keyframes hideTipsBox{ 865 | 0%,80%{opacity:1;} 866 | 100%{opacity:0;} 867 | } 868 | @keyframes hideTipsBox{ 869 | 0%,80%{opacity:1;} 870 | 100%{opacity:0;} 871 | } 872 | .g_blurbg{ 873 | position:absolute; 874 | top:0;left:0; 875 | bottom:0;right:0; 876 | background-color:#fff; 877 | background-image:url("../images/poster001.jpg"); 878 | background-repeat:no-repeat; 879 | background-position:center 0; 880 | background-size:60% 60%; 881 | -webkit-filter:blur(100px); 882 | filter:blur(100px); 883 | z-index:-1; 884 | } 885 | .g_loadingbox{ 886 | display:none; 887 | position:fixed; 888 | top:50%;left:50%; 889 | padding:10px; 890 | font-size:1.2rem; 891 | -webkit-transform:translate(-50%,-50%); 892 | transform:translate(-50%,-50%); 893 | border-radius:8px; 894 | background-color:rgba(0,0,0,0.6); 895 | color:#f7f7f7; 896 | } 897 | -------------------------------------------------------------------------------- /src/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} 5 | -------------------------------------------------------------------------------- /src/libs/jquery-3.1.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ 2 | !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), 3 | a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), 4 | void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("