From f222156c55c9d08b46a77b89d45df9549d2356ab Mon Sep 17 00:00:00 2001 From: hakasenyang Date: Wed, 2 Nov 2016 08:51:06 +0900 Subject: [PATCH] First commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 마루마루 관련 파일입니다. --- Material_Icons.woff | Bin 0 -> 60704 bytes Material_Icons.woff2 | Bin 0 -> 46736 bytes _function.php | 241 + app.js | 70590 +++++++++++++++++++++++++++++++++++++++++ config.js | 3 + favicon.ico | Bin 0 -> 32038 bytes fmaru.php | 18 + image.php | 80 + image_parse.php | 21 + index.php | 120 + manga.php | 15 + mangalist.php | 20 + style.css | 23 + 13 files changed, 71131 insertions(+) create mode 100644 Material_Icons.woff create mode 100644 Material_Icons.woff2 create mode 100644 _function.php create mode 100644 app.js create mode 100644 config.js create mode 100644 favicon.ico create mode 100644 fmaru.php create mode 100644 image.php create mode 100644 image_parse.php create mode 100644 index.php create mode 100644 manga.php create mode 100644 mangalist.php create mode 100644 style.css diff --git a/Material_Icons.woff b/Material_Icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..4c0a056b6c9ba499543566f160511c0b57d52f09 GIT binary patch literal 60704 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 true, + CURLOPT_URL => $url, + CURLOPT_TIMEOUT => 10, + CURLOPT_CONNECTTIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => FALSE, + CURLOPT_HEADER => $headershow, + CURLOPT_USERAGENT => $this->httph + ); + curl_setopt_array($ch, $opts); + if ($otherheader) curl_setopt($ch, CURLOPT_HTTPHEADER, $otherheader); + if ($cookie) curl_setopt($ch, CURLOPT_COOKIE, $cookie); + if ($postparam) + { + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postparam); + } + + $data = curl_exec($ch); + curl_close($ch); + if ($curl_errno > 0) + $this->ErrorEcho(14, 'Connect Error!!!'); + return ($data) ? $data : false; + } + /** + * sucuri - sucuri 프록시 관련 쿠키 우회 + * 소스 : https://github.com/organization/cloudflare-bypass + * 소스 : http://cafe.naver.com/gogoomas/337647 + * @param string $result 쿠키 string 입력 + * @return strring 쿠키 데이터 출력 + */ + public function sucuri($result) + { + if(strpos($result, 'sucuri_cloudproxy_js') !== false) + { + $cp_temp1 = explode('S=\'', $result); + $cp_temp2 = explode(';', $cp_temp1[1]); + $cp_script = $cp_temp2[0]; + $cp_temp1 = explode('A=\'', $result); + $cp_temp2 = explode('\';', $cp_temp1[1]); + $cp_chlist = $cp_temp2[0]; + $cp_charr = array(); + for($i = 0; $i < 64; $i++) + $cp_charr[$cp_chlist[$i]] = $i; + $cp_len = strlen($cp_script); + $cp_c = 0; + $cp_u = 0; + $cp_i = 0; + $cp_l = 0; + $cp_a = NULL; + $cp_r = NULL; + for($i = 0; $i < $cp_len; $i++) + { + $cp_c = $cp_charr[$cp_script[$i]]; + $cp_u = ($cp_u << 6) + $cp_c; + $cp_l += 6; + while($cp_l >= 8) + (($cp_a = ($cp_u >> ($cp_l -= 8)) & 0xff) || ($cp_i < ($cp_len - 2))) && ($cp_r .= chr($cp_a)); + } + $cp_temp1 = explode('document.cookie=', $cp_r); + $cp_temp2 = explode('=', $cp_temp1[1]); + $cp_cnam = str_replace('"', '\'', $cp_temp2[0]); + $cp_cnam_split = explode('+', $cp_cnam); + $cp_cnam_split_cnt = count($cp_cnam_split); + $cp_cnam_string = NULL; + for($i = 0 ; $i < $cp_cnam_split_cnt; $i++) + { + $cp_cnam = trim($cp_cnam_split[$i]); + if(strpos($cp_cnam, 'slice') !== false) + { + $cp_temp1 = explode('\'', $cp_cnam); + $cp_temp2 = explode('(', $cp_cnam); + $cp_temp3 = explode(')', $cp_temp2[1]); + $cp_temp4 = explode(',', $cp_temp3[0]); + $cp_cnam_string .= substr($cp_temp1[1], trim($cp_temp4[0]), (intval(trim($cp_temp4[1])-trim($cp_temp4[0])))); + } + elseif(strpos($cp_cnam, 'charAt') !== false) + { + $cp_temp1 = explode('\'', $cp_cnam); + $cp_temp2 = explode('(', $cp_cnam); + $cp_temp3 = explode(')', $cp_temp2[1]); + $cp_cnam_string .= substr($cp_temp1[1], trim($cp_temp3[0]), 1); + } + elseif(strpos($cp_cnam, 'String.fromCharCode') !== false) + { + $cp_temp1 = explode('(', $cp_cnam); + $cp_temp2 = explode(')', $cp_temp1[1]); + if(strpos($cp_temp2[0], '0x') !== false) + $cp_cnam_string .= chr(hexdec($cp_temp2[0])); + else + $cp_cnam_string .= chr($cp_temp2[0]); + } + elseif(strpos($cp_cnam, 'substr') !== false) + { + $cp_temp1 = explode('\'', $cp_cnam); + $cp_temp2 = explode('(', $cp_cnam); + $cp_temp3 = explode(')', $cp_temp2[1]); + $cp_temp4 = explode(',', $cp_temp3[0]); + $cp_cnam_string .= substr($cp_temp1[1], trim($cp_temp4[0]), trim($cp_temp4[1])); + } + else + $cp_cnam_string .= trim(trim($cp_cnam, '\'')); + $cp_cnam_string .= NULL; + } + //$cp_temp1 = explode('=', $cp_r); + $cp_temp1 = strpos($cp_r, '='); + $cp_temp2 = explode(';document.cookie', substr($cp_r, $cp_temp1+1)); //$cp_temp[1] + $cp_cval = str_replace('"', '\'', $cp_temp2[0]); + $cp_cval_split = explode('+', $cp_cval); + $cp_cval_split_cnt = count($cp_cval_split); + $cp_cval_string = null; + for($i = 0 ; $i < $cp_cval_split_cnt; $i++) + { + $cp_nval = trim($cp_cval_split[$i]); + if(strpos($cp_nval, 'slice') !== false) + { + $cp_temp1 = explode('\'', $cp_nval); + $cp_temp2 = explode('(', $cp_nval); + $cp_temp3 = explode(')', $cp_temp2[1]); + $cp_temp4 = explode(',', $cp_temp3[0]); + $cp_cval_string .= substr($cp_temp1[1], trim($cp_temp4[0]), (intval(trim($cp_temp4[1])-trim($cp_temp4[0])))); + } + elseif(strpos($cp_nval, 'charAt') !== false) + { + $cp_temp1 = explode("'", $cp_nval); + $cp_temp2 = explode("(", $cp_nval); + $cp_temp3 = explode(")", $cp_temp2[1]); + $cp_cval_string .= substr($cp_temp1[1], trim($cp_temp3[0]), 1); + } + elseif(strpos($cp_nval, 'String.fromCharCode') !== false) + { + $cp_temp1 = explode('(', $cp_nval); + $cp_temp2 = explode(')', $cp_temp1[1]); + if(strpos($cp_temp2[0], '0x') !== false) + { + $cp_cval_string .= chr(hexdec($cp_temp2[0])); + } + else + { + $cp_cval_string .= chr($cp_temp2[0]); + } + } + elseif(strpos($cp_nval, 'substr') !== false) + { + $cp_temp1 = explode('\'', $cp_nval); + $cp_temp2 = explode('(', $cp_nval); + $cp_temp3 = explode(')', $cp_temp2[1]); + $cp_temp4 = explode(',', $cp_temp3[0]); + $cp_cval_string .= substr($cp_temp1[1], trim($cp_temp4[0]), trim($cp_temp4[1])); + } + else + { + $cp_cval_string .= trim(trim($cp_nval, '\'')); + } + $cp_cval_string .= NULL; + } + + // String Output + return $cp_cnam_string."=".$cp_cval_string; + } + } + public function FileRead($filename=NULL) + { + $filename = ($filename) ? $filename : $this->fname; + if(!is_file($filename)) return false; + if(!filesize($filename)) return false; + $fp = fopen($filename, 'r'); + $data = fread($fp, filesize($filename)); + fclose($fp); + return $data; + } + public function FileWrite($str,$filename=NULL,$time=(60*30)) + { + $filename = ($filename) ? $filename : $this->fname; + $fp = fopen($filename, 'w'); + // 30분 + fwrite($fp, time()+$time.PHP_EOL.$str); + fclose($fp); + } + public function GetCookie() + { + $data = $this->WEBParsing('http://www.yuncomics.com/archives/'); + $cookie = $this->splits($data, ''); + $cookie = $this->sucuri($cookie); + $data = $this->WEBParsing('http://www.yuncomics.com/wp-login.php?action=postpass', $cookie, true, 'post_password=qndxkr&Submit=Submit', + array( + 'Referer: http://www.yuncomics.com/' + ) + ); + $cookie2 = $this->splits($data, 'Set-Cookie: wp-postpass_', ';'); + $cookie2 = ';wp-postpass_'.$cookie2.';wordpress_test_cookie=WP+Cookie+check;_mcnc=1;'; + $cookie .= $cookie2; + if(!$cookie) return false; else return $cookie; + } + public function ErrorEcho($num,$err=NULL) + { + if($err) + die(json_encode(array('error'=>$num, 'message'=>$err))); + else + { + switch($num) + { + case 0: + $err='Connect Error (yuncomics 403 or other error)'; + break; + case 1: + $err='Cookie Send Error (Not applied sucuri cookie data)'; + break; + case 2: + $err='Cookie Get Error'; + break; + case 3: + $err='Password Error (Protected archive) - Retry 10 minutes after view or retry about 3 times'; + break; + case 4: + $err='Not found comics data'; + break; + default: + $err='Unknown Error. Please send me an e-mail (contact@hakase.kr)'; + } + die(json_encode(array('error'=>$num, 'message'=>$err))); + } + } + } \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..d6b2a28 --- /dev/null +++ b/app.js @@ -0,0 +1,70590 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 15) { + title = mangaTitle.slice(0, 15) + "..." + " (" + title + ")"; + } else { + title = mangaTitle + " (" + title + ")"; + } + + var state = { + id: id, + title: title, + mangaTitle: mangaTitle, + episodeTitle: episodeTitle, + data: data, + idx: idx, + episodes: episodes + }; + + return state; + } + }, { + key: 'componentDidMount', + value: function componentDidMount() { + _EpisodeStore2.default.addChangeListener(this._onEpisodeStoreChanged); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _EpisodeStore2.default.removeChangeListener(this._onEpisodeStoreChanged); + } + }, { + key: '_convertUrl', + value: function _convertUrl(url) { + if (url.toLowerCase().indexOf("yuncomic") > -1) { + var comps = url.split('/').slice(3); + return config.apiUrl + "/image_parse.php?url=" + url; + //return config.apiUrl + "/image/" + comps.join("/"); + } + return url; + } + }, { + key: 'renderToolbar', + value: function renderToolbar() { + var icons = []; + if (this.state.idx != 0) { + icons.push(_react2.default.createElement( + _FontIcon2.default, + { + key: 'prev', + className: 'material-icons', + onClick: this._prev + }, + 'keyboard_arrow_left' + )); + } + + if (this.state.idx + 1 < this.state.episodes.length) { + icons.push(_react2.default.createElement( + _FontIcon2.default, + { + key: 'next', + className: 'material-icons', + onClick: this._next + }, + 'keyboard_arrow_right' + )); + } + + return _react2.default.createElement( + _Toolbar.Toolbar, + { style: { position: "fixed", width: "100%" } }, + _react2.default.createElement( + _Toolbar.ToolbarGroup, + null, + _react2.default.createElement(_Toolbar.ToolbarTitle, { text: this.state.title }) + ), + _react2.default.createElement( + _Toolbar.ToolbarGroup, + null, + icons + ) + ); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + if (!this.state.data) { + var detail; + var hrefs; + + (function () { + detail = _MangaDetailStore2.default.getDetail(_this2.state.id); + + var title = _this2.state.episodeTitle; + hrefs = detail.episodes.filter(function (value) { + return value.title == title; + }).map(function (value) { + return value.href; + }); + + if (hrefs.length > 0) { + _ApiUtils2.default.getImageList(_this2.state.id, _this2.state.episodeTitle, hrefs[0]); + } + })(); + } + var contents = null; + if (!this.state.data) { + contents = _react2.default.createElement( + 'div', + { style: { height: "120px" } }, + _react2.default.createElement(_RefreshIndicator2.default, { + left: 0, + top: 30, + status: 'loading', + style: { display: "inline-block", position: "relative" } }) + ); + } else { + var images; + + (function () { + images = []; + + var convertUrl = _this2._convertUrl; + _this2.state.data.forEach(function (value, idx) { + images.push(_react2.default.createElement( + 'div', + { key: idx, style: { width: "100%", textAlign: "center" } }, + _react2.default.createElement('img', { key: idx, src: convertUrl(value), style: { maxWidth: "100%" } }) + )); + }); + + contents = _react2.default.createElement( + 'div', + null, + images + ); + })(); + } + + var toolBar = this.renderToolbar(); + return _react2.default.createElement( + _Paper2.default, + null, + toolBar, + _react2.default.createElement( + 'div', + { style: { paddingTop: "56px", textAlign: "center" } }, + contents + ) + ); + } + }]); + + return EpisodePage; +}(_react2.default.Component); + +exports.default = EpisodePage; + +},{"../actions/AppActionCreators":2,"../stores/AppStore":14,"../stores/EpisodeStore":15,"../stores/MangaDetailStore":16,"../stores/MangaStore":17,"../utils/ApiUtils":18,"material-ui/FontIcon":222,"material-ui/Paper":233,"material-ui/RefreshIndicator":237,"material-ui/Toolbar":252,"react":634}],6:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _Toolbar = require('material-ui/Toolbar'); + +var _FontIcon = require('material-ui/FontIcon'); + +var _FontIcon2 = _interopRequireDefault(_FontIcon); + +var _Paper = require('material-ui/Paper'); + +var _Paper2 = _interopRequireDefault(_Paper); + +var _RefreshIndicator = require('material-ui/RefreshIndicator'); + +var _RefreshIndicator2 = _interopRequireDefault(_RefreshIndicator); + +var _MangaDetailStore = require('../stores/MangaDetailStore'); + +var _MangaDetailStore2 = _interopRequireDefault(_MangaDetailStore); + +var _ApiUtils = require('../utils/ApiUtils'); + +var _ApiUtils2 = _interopRequireDefault(_ApiUtils); + +var _reactBootstrap = require('react-bootstrap'); + +var _AppActionCreators = require('../actions/AppActionCreators'); + +var _AppActionCreators2 = _interopRequireDefault(_AppActionCreators); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MangaItem = function (_React$Component) { + _inherits(MangaItem, _React$Component); + + function MangaItem(props) { + _classCallCheck(this, MangaItem); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MangaItem).call(this, props)); + + _this._onChange = function (id) { + if (_this.props.id == id) { + _this.setState({ + detail: _MangaDetailStore2.default.getDetail(_this.props.id) + }); + } + }; + + _this.state = { + detail: _MangaDetailStore2.default.getDetail(props.id) + }; + return _this; + } + + _createClass(MangaItem, [{ + key: 'componentDidMount', + value: function componentDidMount() { + _MangaDetailStore2.default.addChangeListener(this._onChange); + if (!this.state.detail) { + _ApiUtils2.default.getMangaDetail(this.props.id, this.props.href); + } + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _MangaDetailStore2.default.addChangeListener(this._onChange); + } + }, { + key: '_createIndicator', + value: function _createIndicator() { + var indicatorStyle = { + display: "inline-block", + position: "relative" + }; + + var indicator = _react2.default.createElement( + 'div', + { style: { + textAlign: 'center', + height: '100px' + } }, + _react2.default.createElement(_RefreshIndicator2.default, { left: 0, top: 30, status: 'loading', style: indicatorStyle }) + ); + + return indicator; + } + }, { + key: '_createContent', + value: function _createContent() { + var _this2 = this; + + var episodes = []; + this.state.detail.episodes.forEach(function (value) { + var onClick = function onClick() { + _AppActionCreators2.default.changePage("episode"); + _AppActionCreators2.default.setCurrentEpisode(_this2.props.id, value.title); + }; + var title = value.title.replace(_this2.props.title, "").trim(); + if (title.length < 2) { + title = value.title; + } + episodes.push(_react2.default.createElement( + _reactBootstrap.Col, + { xs: 6, md: 2, key: value.title, style: { verticalAlign: "middle", textAlign: "center", height: 50, cursor: "pointer" }, onClick: onClick }, + _react2.default.createElement( + 'span', + null, + title + ) + )); + }); + + var imageUrl = this.state.detail.cover; + if (imageUrl.indexOf("marumaru.in") > -1) { + var comps = imageUrl.split("\/").slice(3); + //imageUrl = config.apiUrl + "/preview/" + comps.join("/"); + imageUrl = config.apiUrl + "/image_parse.php?url=" + imageUrl; + } + + var content = _react2.default.createElement( + _reactBootstrap.Grid, + { style: { padding: "20px" } }, + _react2.default.createElement( + _reactBootstrap.Row, + null, + _react2.default.createElement( + _reactBootstrap.Col, + { xs: 6, md: 3 }, + _react2.default.createElement('img', { src: imageUrl, width: '100%' }) + ), + _react2.default.createElement( + _reactBootstrap.Col, + { xs: 6, md: 9 }, + _react2.default.createElement( + _reactBootstrap.Row, + null, + episodes + ) + ) + ) + ); + + return content; + } + }, { + key: 'render', + value: function render() { + var style = { + margin: "24px" + }; + + var contents = null; + + if (this.state.detail) { + contents = this._createContent(); + } else { + contents = this._createIndicator(); + } + + var barStyle = { + cursor: "pointer" + }; + return _react2.default.createElement( + _Paper2.default, + { style: style }, + _react2.default.createElement( + _Toolbar.Toolbar, + { style: barStyle }, + _react2.default.createElement( + _Toolbar.ToolbarGroup, + null, + _react2.default.createElement(_Toolbar.ToolbarTitle, { text: this.props.title }) + ) + ), + contents + ); + } + }]); + + return MangaItem; +}(_react2.default.Component); + +exports.default = MangaItem; + +},{"../actions/AppActionCreators":2,"../stores/MangaDetailStore":16,"../utils/ApiUtils":18,"material-ui/FontIcon":222,"material-ui/Paper":233,"material-ui/RefreshIndicator":237,"material-ui/Toolbar":252,"react":634,"react-bootstrap":383}],7:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _MangaItem = require('./MangaItem'); + +var _MangaItem2 = _interopRequireDefault(_MangaItem); + +var _MangaStore = require('../stores/MangaStore'); + +var _MangaStore2 = _interopRequireDefault(_MangaStore); + +var _reactLazyload = require('react-lazyload'); + +var _reactLazyload2 = _interopRequireDefault(_reactLazyload); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MAX_LIST = 10; + +var MangaList = function (_React$Component) { + _inherits(MangaList, _React$Component); + + function MangaList(props) { + _classCallCheck(this, MangaList); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MangaList).call(this, props)); + + _this._onChange = function () { + var list = _MangaStore2.default.searchList().slice(0, MAX_LIST); + _this.setState({ list: list }); + }; + + _this.state = { + list: _MangaStore2.default.searchList().slice(0, MAX_LIST) + }; + return _this; + } + + _createClass(MangaList, [{ + key: 'componentDidMount', + value: function componentDidMount() { + _MangaStore2.default.addChangeListener(this._onChange); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _MangaStore2.default.removeChangeListener(this._onChange); + } + }, { + key: 'render', + value: function render() { + var items = []; + this.state.list.forEach(function (value) { + items.push(_react2.default.createElement( + _reactLazyload2.default, + { key: value.id, once: true, height: 156, offset: 100 }, + _react2.default.createElement(_MangaItem2.default, { id: value.id, title: value.title, href: value.href }) + )); + }); + return _react2.default.createElement( + 'div', + null, + items + ); + } + }]); + + return MangaList; +}(_react2.default.Component); + +exports.default = MangaList; + +},{"../stores/MangaStore":17,"./MangaItem":6,"react":634,"react-lazyload":431}],8:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _SearchBar = require('./SearchBar'); + +var _SearchBar2 = _interopRequireDefault(_SearchBar); + +var _MangaList = require('./MangaList'); + +var _MangaList2 = _interopRequireDefault(_MangaList); + +var _MangaStore = require('../stores/MangaStore'); + +var _MangaStore2 = _interopRequireDefault(_MangaStore); + +var _ApiUtils = require('../utils/ApiUtils'); + +var _ApiUtils2 = _interopRequireDefault(_ApiUtils); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MangaSearchPage = function (_React$Component) { + _inherits(MangaSearchPage, _React$Component); + + function MangaSearchPage(props) { + _classCallCheck(this, MangaSearchPage); + + return _possibleConstructorReturn(this, Object.getPrototypeOf(MangaSearchPage).call(this, props)); + } + + _createClass(MangaSearchPage, [{ + key: 'render', + value: function render() { + var indicatorStyle = { + display: "inline-block", + position: "relative" + }; + return _react2.default.createElement( + 'div', + null, + _react2.default.createElement(_SearchBar2.default, { list: this.props.list }), + _react2.default.createElement( + 'div', + { style: { paddingTop: "56px" } }, + _react2.default.createElement(_MangaList2.default, null) + ) + ); + } + }]); + + return MangaSearchPage; +}(_react2.default.Component); + +exports.default = MangaSearchPage; + +},{"../stores/MangaStore":17,"../utils/ApiUtils":18,"./MangaList":7,"./SearchBar":9,"react":634}],9:[function(require,module,exports){ +(function (global){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _Toolbar = require('material-ui/Toolbar'); + +var _FontIcon = require('material-ui/FontIcon'); + +var _FontIcon2 = _interopRequireDefault(_FontIcon); + +var _AutoComplete = require('material-ui/AutoComplete'); + +var _AutoComplete2 = _interopRequireDefault(_AutoComplete); + +var _FlatButton = require('material-ui/FlatButton'); + +var _FlatButton2 = _interopRequireDefault(_FlatButton); + +var _search = require('material-ui/svg-icons/action/search'); + +var _search2 = _interopRequireDefault(_search); + +var _ListActionCreator = require('../actions/ListActionCreator'); + +var _ListActionCreator2 = _interopRequireDefault(_ListActionCreator); + +var _colors = require('material-ui/styles/colors'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var SearchBar = function (_React$Component) { + _inherits(SearchBar, _React$Component); + + function SearchBar() { + var _Object$getPrototypeO; + + var _temp, _this, _ret; + + _classCallCheck(this, SearchBar); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(SearchBar)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this._onUpdateInput = function (t) { + _this.searchText = t; + }, _this._onKeyDown = function (event) { + if (event.key == "Enter") { + _this._onSearch(); + } + }, _this._onNewRequest = function (t) { + _this.searchText = t; + }, _this._onSearch = function () { + _ListActionCreator2.default.search(_this.searchText); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(SearchBar, [{ + key: 'render', + value: function render() { + var barStyle = { + position: "fixed", + width: "100%", + paddingTop: "0px", + display: "flex", + zIndex: 8, + backgroundColor: _colors.grey100 + }; + var iconStyles = { + marginRight: 5 + }; + + var dataSource = this.props.list.map(function (item) { + return item.title; + }); + this.autoComplete = _react2.default.createElement(_AutoComplete2.default, { + dataSource: dataSource, + maxSearchResults: 5, + filter: _AutoComplete2.default.caseInsensitiveFilter, + hintText: '만화 제목', + onUpdateInput: this._onUpdateInput, + onKeyDown: this._onKeyDown, + onNewRequest: this._onNewRequest }); + + global.autoComplete = this.autoComplete; + + return _react2.default.createElement( + _Toolbar.Toolbar, + { style: barStyle }, + _react2.default.createElement( + _Toolbar.ToolbarGroup, + null, + this.autoComplete, + _react2.default.createElement(_FlatButton2.default, { label: '검색', icon: _react2.default.createElement(_search2.default, null), onClick: this._onSearch }) + ) + ); + } + }]); + + return SearchBar; +}(_react2.default.Component); + +exports.default = SearchBar; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../actions/ListActionCreator":3,"material-ui/AutoComplete":213,"material-ui/FlatButton":220,"material-ui/FontIcon":222,"material-ui/Toolbar":252,"material-ui/styles/colors":266,"material-ui/svg-icons/action/search":273,"react":634}],10:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _AppBar = require('material-ui/AppBar'); + +var _AppBar2 = _interopRequireDefault(_AppBar); + +var _AppStore = require('../stores/AppStore'); + +var _AppStore2 = _interopRequireDefault(_AppStore); + +var _IconButton = require('material-ui/IconButton'); + +var _IconButton2 = _interopRequireDefault(_IconButton); + +var _home = require('material-ui/svg-icons/action/home'); + +var _home2 = _interopRequireDefault(_home); + +var _AppActionCreators = require('../actions/AppActionCreators'); + +var _AppActionCreators2 = _interopRequireDefault(_AppActionCreators); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TopBar = function (_React$Component) { + _inherits(TopBar, _React$Component); + + function TopBar(props) { + _classCallCheck(this, TopBar); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(TopBar).call(this, props)); + + _this._onHomeTap = function () { + _AppActionCreators2.default.changePage("search"); + }; + + _this._onChange = function () { + _this.setState({ + title: _this._getTitle() + }); + }; + + _this.state = { title: _this._getTitle() }; + return _this; + } + + _createClass(TopBar, [{ + key: 'componentDidMount', + value: function componentDidMount() { + _AppStore2.default.addChangeListener(this._onChange); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _AppStore2.default.removeChangeListener(this._onChange); + } + }, { + key: 'render', + value: function render() { + var appBarStyle = { + position: 'fixed' + }; + return _react2.default.createElement(_AppBar2.default, { + iconElementLeft: _react2.default.createElement( + _IconButton2.default, + { onClick: this._onHomeTap }, + _react2.default.createElement(_home2.default, null) + ), + title: this.state.title, + style: appBarStyle }); + } + }, { + key: '_getTitle', + value: function _getTitle() { + var page = _AppStore2.default.page; + switch (page) { + case "search": + return "만화 검색"; + case "episode": + return "만화 보기"; + } + } + }]); + + return TopBar; +}(_react2.default.Component); + +exports.default = TopBar; + +},{"../actions/AppActionCreators":2,"../stores/AppStore":14,"material-ui/AppBar":211,"material-ui/IconButton":224,"material-ui/svg-icons/action/home":272,"react":634}],11:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _keymirror = require('keymirror'); + +var _keymirror2 = _interopRequireDefault(_keymirror); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + ActionTypes: (0, _keymirror2.default)({ + RECEIVE_MANGA_LIST: null, + RECEIVE_MANGA_DETAIL: null, + RECEIVE_IMAGE_LIST: null, + SEARCH: null, + CHANGE_PAGE: null, + SET_CURRENT_EPISODE: null + }) +}; + +},{"keymirror":88}],12:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _flux = require('flux'); + +exports.default = new _flux.Dispatcher(); + +},{"flux":52}],13:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _AppBar = require('material-ui/AppBar'); + +var _AppBar2 = _interopRequireDefault(_AppBar); + +var _Drawer = require('material-ui/Drawer'); + +var _Drawer2 = _interopRequireDefault(_Drawer); + +var _ApiUtils = require('./utils/ApiUtils'); + +var _ApiUtils2 = _interopRequireDefault(_ApiUtils); + +var _MangaStore = require('./stores/MangaStore'); + +var _MangaStore2 = _interopRequireDefault(_MangaStore); + +var _AppStore = require('./stores/AppStore'); + +var _AppStore2 = _interopRequireDefault(_AppStore); + +var _RefreshIndicator = require('material-ui/RefreshIndicator'); + +var _RefreshIndicator2 = _interopRequireDefault(_RefreshIndicator); + +var _TopBar = require('./componets/TopBar'); + +var _TopBar2 = _interopRequireDefault(_TopBar); + +var _MangaSearchPage = require('./componets/MangaSearchPage'); + +var _MangaSearchPage2 = _interopRequireDefault(_MangaSearchPage); + +var _EpisodePage = require('./componets/EpisodePage'); + +var _EpisodePage2 = _interopRequireDefault(_EpisodePage); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Menu = function (_React$Component) { + _inherits(Menu, _React$Component); + + function Menu(props) { + _classCallCheck(this, Menu); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Menu).call(this, props)); + + _this.state = { showMenu: props.showMenu }; + return _this; + } + + _createClass(Menu, [{ + key: 'render', + value: function render() { + var _this2 = this; + + return _react2.default.createElement(_Drawer2.default, { + docked: false, + open: this.state.open, + onRequestChange: function onRequestChange(open) { + return _this2.setState({ open: open }); + } + }); + } + }]); + + return Menu; +}(_react2.default.Component); + +var Main = function (_React$Component2) { + _inherits(Main, _React$Component2); + + function Main(props) { + _classCallCheck(this, Main); + + var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(Main).call(this, props)); + + _this3.toggleMenu = function () { + _this3.setState({ showMenu: !_this3.state.showMenu }); + }; + + _this3._onChange = function () { + _this3.setState({ list: _MangaStore2.default.list }); + }; + + _this3._onAppStoreChange = function () { + _this3.setState({ page: _AppStore2.default.page }); + }; + + _this3.state = { + list: [], + page: _AppStore2.default.page + }; + return _this3; + } + + _createClass(Main, [{ + key: 'componentDidMount', + value: function componentDidMount() { + _MangaStore2.default.addChangeListener(this._onChange); + _AppStore2.default.addChangeListener(this._onAppStoreChange); + _ApiUtils2.default.getMangaList(); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _MangaStore2.default.removeChangeListener(this._onChange); + _AppStore2.default.removeChangeListener(this._onAppStoreChange); + } + }, { + key: 'createLoadingIndicator', + value: function createLoadingIndicator() { + var indicatorStyle = { + display: "inline-block", + position: "relative" + }; + + return _react2.default.createElement( + 'div', + { style: { + textAlign: 'center' + } }, + _react2.default.createElement(_RefreshIndicator2.default, { left: 0, top: 24, status: 'loading', style: indicatorStyle }), + _react2.default.createElement( + 'div', + { style: { paddingTop: "50px" } }, + '만화 목록을 가져오고 있습니다.' + ) + ); + } + }, { + key: 'createPage', + value: function createPage() { + if (this.state.list.length == 0) { + return this.createLoadingIndicator(); + } + switch (this.state.page) { + case "search": + return _react2.default.createElement(_MangaSearchPage2.default, { list: this.state.list }); + case "episode": + return _react2.default.createElement(_EpisodePage2.default, null); + } + } + }, { + key: 'render', + value: function render() { + var contentStyle = { + paddingTop: "64px" + }; + + var page = this.createPage(); + + return _react2.default.createElement( + 'div', + null, + _react2.default.createElement(_TopBar2.default, null), + _react2.default.createElement( + 'div', + { style: contentStyle }, + page + ) + ); + } + }]); + + return Main; +}(_react2.default.Component); + +exports.default = Main; + +},{"./componets/EpisodePage":5,"./componets/MangaSearchPage":8,"./componets/TopBar":10,"./stores/AppStore":14,"./stores/MangaStore":17,"./utils/ApiUtils":18,"material-ui/AppBar":211,"material-ui/Drawer":217,"material-ui/RefreshIndicator":237,"react":634}],14:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AppDispatcher = require('../dispatchers/AppDispatcher.js'); + +var _AppDispatcher2 = _interopRequireDefault(_AppDispatcher); + +var _AppConstants = require('../constants/AppConstants.js'); + +var _AppConstants2 = _interopRequireDefault(_AppConstants); + +var _events = require('events'); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ActionTypes = _AppConstants2.default.ActionTypes; +var CHANGE_EVENT = 'change'; + +var AppStore = function (_EventEmitter) { + _inherits(AppStore, _EventEmitter); + + function AppStore() { + _classCallCheck(this, AppStore); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(AppStore).call(this)); + + _this.page = "search"; + return _this; + } + + _createClass(AppStore, [{ + key: 'emitChange', + value: function emitChange() { + this.emit(CHANGE_EVENT); + } + }, { + key: 'addChangeListener', + value: function addChangeListener(callback) { + this.on(CHANGE_EVENT, callback); + } + }, { + key: 'removeChangeListener', + value: function removeChangeListener(callback) { + this.removeListener(CHANGE_EVENT, callback); + } + }]); + + return AppStore; +}(_events2.default); + +var store = new AppStore(); +store.dispatchToken = _AppDispatcher2.default.register(function (action) { + switch (action.type) { + case ActionTypes.CHANGE_PAGE: + store.page = action.page; + store.emitChange(); + break; + } +}); + +exports.default = store; + +},{"../constants/AppConstants.js":11,"../dispatchers/AppDispatcher.js":12,"events":50}],15:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AppDispatcher = require('../dispatchers/AppDispatcher.js'); + +var _AppDispatcher2 = _interopRequireDefault(_AppDispatcher); + +var _AppConstants = require('../constants/AppConstants.js'); + +var _AppConstants2 = _interopRequireDefault(_AppConstants); + +var _events = require('events'); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ActionTypes = _AppConstants2.default.ActionTypes; +var CHANGE_EVENT = 'change'; + +var EpisodeStore = function (_EventEmitter) { + _inherits(EpisodeStore, _EventEmitter); + + function EpisodeStore() { + _classCallCheck(this, EpisodeStore); + + // key: id, {key: title, value: data} + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(EpisodeStore).call(this)); + + _this.episodes = {}; + _this.curId = null; + _this.curTitle = null; + return _this; + } + + _createClass(EpisodeStore, [{ + key: 'getData', + value: function getData(id, title) { + if (this.episodes[id] && this.episodes[id][title]) return this.episodes[id][title]; + } + }, { + key: 'emitChange', + value: function emitChange(id, title) { + this.emit(CHANGE_EVENT, id, title); + } + }, { + key: 'addChangeListener', + value: function addChangeListener(callback) { + this.on(CHANGE_EVENT, callback); + } + }, { + key: 'removeChangeListener', + value: function removeChangeListener(callback) { + this.removeListener(CHANGE_EVENT, callback); + } + }]); + + return EpisodeStore; +}(_events2.default); + +var store = new EpisodeStore(); +store.dispatchToken = _AppDispatcher2.default.register(function (action) { + switch (action.type) { + case ActionTypes.RECEIVE_IMAGE_LIST: + if (!store.episodes[action.id]) { + store.episodes[action.id] = {}; + } + store.episodes[action.id][action.title] = action.list; + store.emitChange(action.id, action.title); + break; + + case ActionTypes.SET_CURRENT_EPISODE: + console.log("set_current_episode"); + store.curId = action.id; + store.curTitle = action.title; + store.emitChange(action.id, action.title); + break; + } +}); + +exports.default = store; + +},{"../constants/AppConstants.js":11,"../dispatchers/AppDispatcher.js":12,"events":50}],16:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AppDispatcher = require('../dispatchers/AppDispatcher.js'); + +var _AppDispatcher2 = _interopRequireDefault(_AppDispatcher); + +var _AppConstants = require('../constants/AppConstants.js'); + +var _AppConstants2 = _interopRequireDefault(_AppConstants); + +var _events = require('events'); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ActionTypes = _AppConstants2.default.ActionTypes; +var CHANGE_EVENT = 'change'; + +var MangaDetailStore = function (_EventEmitter) { + _inherits(MangaDetailStore, _EventEmitter); + + function MangaDetailStore() { + _classCallCheck(this, MangaDetailStore); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MangaDetailStore).call(this)); + + _this.detailTable = {}; + _this.setMaxListeners(110); + return _this; + } + + _createClass(MangaDetailStore, [{ + key: 'emitChange', + value: function emitChange(id) { + this.emit(CHANGE_EVENT, id); + } + }, { + key: 'addChangeListener', + value: function addChangeListener(callback) { + this.on(CHANGE_EVENT, callback); + } + }, { + key: 'removeChangeListener', + value: function removeChangeListener(callback) { + this.removeListener(CHANGE_EVENT, callback); + } + }, { + key: 'getDetail', + value: function getDetail(id) { + return this.detailTable[id]; + } + }]); + + return MangaDetailStore; +}(_events2.default); + +var store = new MangaDetailStore(); + +store.dispatchToken = _AppDispatcher2.default.register(function (action) { + switch (action.type) { + case ActionTypes.RECEIVE_MANGA_DETAIL: + store.detailTable[action.id] = action.detail; + store.emitChange(action.id); + break; + } +}); + +exports.default = store; + +},{"../constants/AppConstants.js":11,"../dispatchers/AppDispatcher.js":12,"events":50}],17:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AppDispatcher = require('../dispatchers/AppDispatcher.js'); + +var _AppDispatcher2 = _interopRequireDefault(_AppDispatcher); + +var _AppConstants = require('../constants/AppConstants.js'); + +var _AppConstants2 = _interopRequireDefault(_AppConstants); + +var _events = require('events'); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ActionTypes = _AppConstants2.default.ActionTypes; +var CHANGE_EVENT = 'change'; + +var MangaStore = function (_EventEmitter) { + _inherits(MangaStore, _EventEmitter); + + function MangaStore() { + _classCallCheck(this, MangaStore); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MangaStore).call(this)); + + _this.list = []; + _this.dispatchToken = null; + _this.searchText = ""; + return _this; + } + + _createClass(MangaStore, [{ + key: 'searchList', + value: function searchList() { + var _this2 = this; + + if (!this.searchText || this.searchText.length == 0) { + return []; + } + var result = this.list.filter(function (item) { + return item.title.toLowerCase().indexOf(_this2.searchText.toLowerCase()) > -1; + }); + return result; + } + }, { + key: 'getInfo', + value: function getInfo(id) { + var l = this.list.filter(function (value) { + return value.id == id; + }); + if (l.length > 0) { + return l[0]; + } + return null; + } + }, { + key: 'emitChange', + value: function emitChange() { + this.emit(CHANGE_EVENT); + } + }, { + key: 'addChangeListener', + value: function addChangeListener(callback) { + this.on(CHANGE_EVENT, callback); + } + }, { + key: 'removeChangeListener', + value: function removeChangeListener(callback) { + this.removeListener(CHANGE_EVENT, callback); + } + }]); + + return MangaStore; +}(_events2.default); + +var store = new MangaStore(); +store.dispatchToken = _AppDispatcher2.default.register(function (action) { + switch (action.type) { + case ActionTypes.RECEIVE_MANGA_LIST: + store.list = action.list; + store.emitChange(); + break; + case ActionTypes.SEARCH: + store.searchText = action.searchText; + store.emitChange(); + break; + } +}); +exports.default = store; + +},{"../constants/AppConstants.js":11,"../dispatchers/AppDispatcher.js":12,"events":50}],18:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _jquery = require('jquery'); + +var _jquery2 = _interopRequireDefault(_jquery); + +var _ApiActionCreators = require('../actions/ApiActionCreators.js'); + +var _ApiActionCreators2 = _interopRequireDefault(_ApiActionCreators); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + getMangaList: function getMangaList() { + _jquery2.default.get({ + url: config.apiUrl + "/mangalist.php" + }).done(function (data) { + if (typeof data == "string") { + data = JSON.parse(data); + } + _ApiActionCreators2.default.receiveMangaList(data.list); + }); + }, + + getMangaDetail: function getMangaDetail(mangaId, href) { + _jquery2.default.get({ + url: config.apiUrl + "/manga.php", + data: { + href: href + }, + success: function success(data) { + if (typeof data == "string") { + data = JSON.parse(data); + } + _ApiActionCreators2.default.receiveMangaDetail(mangaId, data); + } + }); + }, + + getImageList: function getImageList(mangaId, title, href) { + _jquery2.default.get({ + url: config.apiUrl + "/images.php", + data: { + href: href + }, + success: function success(data) { + if (typeof data == "string") { + data = JSON.parse(data); + } + + _ApiActionCreators2.default.receiveImageList(mangaId, title, data.images); + } + }); + } +}; + +},{"../actions/ApiActionCreators.js":1,"jquery":86}],19:[function(require,module,exports){ +/*! + * Bowser - a browser detector + * https://github.com/ded/bowser + * MIT License | (c) Dustin Diaz 2015 + */ + +!function (name, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition() + else if (typeof define == 'function' && define.amd) define(definition) + else this[name] = definition() +}('bowser', function () { + /** + * See useragents.js for examples of navigator.userAgent + */ + + var t = true + + function detect(ua) { + + function getFirstMatch(regex) { + var match = ua.match(regex); + return (match && match.length > 1 && match[1]) || ''; + } + + function getSecondMatch(regex) { + var match = ua.match(regex); + return (match && match.length > 1 && match[2]) || ''; + } + + var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() + , likeAndroid = /like android/i.test(ua) + , android = !likeAndroid && /android/i.test(ua) + , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua) + , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua) + , chromeos = /CrOS/.test(ua) + , silk = /silk/i.test(ua) + , sailfish = /sailfish/i.test(ua) + , tizen = /tizen/i.test(ua) + , webos = /(web|hpw)os/i.test(ua) + , windowsphone = /windows phone/i.test(ua) + , windows = !windowsphone && /windows/i.test(ua) + , mac = !iosdevice && !silk && /macintosh/i.test(ua) + , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) + , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) + , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) + , tablet = /tablet/i.test(ua) + , mobile = !tablet && /[^-]mobi/i.test(ua) + , xbox = /xbox/i.test(ua) + , result + + if (/opera|opr|opios/i.test(ua)) { + result = { + name: 'Opera' + , opera: t + , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) + } + } + else if (/coast/i.test(ua)) { + result = { + name: 'Opera Coast' + , coast: t + , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) + } + } + else if (/yabrowser/i.test(ua)) { + result = { + name: 'Yandex Browser' + , yandexbrowser: t + , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) + } + } + else if (/ucbrowser/i.test(ua)) { + result = { + name: 'UC Browser' + , ucbrowser: t + , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) + } + } + else if (/mxios/i.test(ua)) { + result = { + name: 'Maxthon' + , maxthon: t + , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) + } + } + else if (/epiphany/i.test(ua)) { + result = { + name: 'Epiphany' + , epiphany: t + , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i) + } + } + else if (/puffin/i.test(ua)) { + result = { + name: 'Puffin' + , puffin: t + , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i) + } + } + else if (/sleipnir/i.test(ua)) { + result = { + name: 'Sleipnir' + , sleipnir: t + , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i) + } + } + else if (/k-meleon/i.test(ua)) { + result = { + name: 'K-Meleon' + , kMeleon: t + , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i) + } + } + else if (windowsphone) { + result = { + name: 'Windows Phone' + , windowsphone: t + } + if (edgeVersion) { + result.msedge = t + result.version = edgeVersion + } + else { + result.msie = t + result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) + } + } + else if (/msie|trident/i.test(ua)) { + result = { + name: 'Internet Explorer' + , msie: t + , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) + } + } else if (chromeos) { + result = { + name: 'Chrome' + , chromeos: t + , chromeBook: t + , chrome: t + , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) + } + } else if (/chrome.+? edge/i.test(ua)) { + result = { + name: 'Microsoft Edge' + , msedge: t + , version: edgeVersion + } + } + else if (/vivaldi/i.test(ua)) { + result = { + name: 'Vivaldi' + , vivaldi: t + , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier + } + } + else if (sailfish) { + result = { + name: 'Sailfish' + , sailfish: t + , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) + } + } + else if (/seamonkey\//i.test(ua)) { + result = { + name: 'SeaMonkey' + , seamonkey: t + , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) + } + } + else if (/firefox|iceweasel|fxios/i.test(ua)) { + result = { + name: 'Firefox' + , firefox: t + , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) + } + if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { + result.firefoxos = t + } + } + else if (silk) { + result = { + name: 'Amazon Silk' + , silk: t + , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) + } + } + else if (/phantom/i.test(ua)) { + result = { + name: 'PhantomJS' + , phantom: t + , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) + } + } + else if (/slimerjs/i.test(ua)) { + result = { + name: 'SlimerJS' + , slimer: t + , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i) + } + } + else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { + result = { + name: 'BlackBerry' + , blackberry: t + , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) + } + } + else if (webos) { + result = { + name: 'WebOS' + , webos: t + , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) + }; + /touchpad\//i.test(ua) && (result.touchpad = t) + } + else if (/bada/i.test(ua)) { + result = { + name: 'Bada' + , bada: t + , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) + }; + } + else if (tizen) { + result = { + name: 'Tizen' + , tizen: t + , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier + }; + } + else if (/qupzilla/i.test(ua)) { + result = { + name: 'QupZilla' + , qupzilla: t + , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier + } + } + else if (/chromium/i.test(ua)) { + result = { + name: 'Chromium' + , chromium: t + , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier + } + } + else if (/chrome|crios|crmo/i.test(ua)) { + result = { + name: 'Chrome' + , chrome: t + , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) + } + } + else if (android) { + result = { + name: 'Android' + , version: versionIdentifier + } + } + else if (/safari|applewebkit/i.test(ua)) { + result = { + name: 'Safari' + , safari: t + } + if (versionIdentifier) { + result.version = versionIdentifier + } + } + else if (iosdevice) { + result = { + name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' + } + // WTF: version is not part of user agent in web apps + if (versionIdentifier) { + result.version = versionIdentifier + } + } + else if(/googlebot/i.test(ua)) { + result = { + name: 'Googlebot' + , googlebot: t + , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier + } + } + else { + result = { + name: getFirstMatch(/^(.*)\/(.*) /), + version: getSecondMatch(/^(.*)\/(.*) /) + }; + } + + // set webkit or gecko flag for browsers based on these engines + if (!result.msedge && /(apple)?webkit/i.test(ua)) { + if (/(apple)?webkit\/537\.36/i.test(ua)) { + result.name = result.name || "Blink" + result.blink = t + } else { + result.name = result.name || "Webkit" + result.webkit = t + } + if (!result.version && versionIdentifier) { + result.version = versionIdentifier + } + } else if (!result.opera && /gecko\//i.test(ua)) { + result.name = result.name || "Gecko" + result.gecko = t + result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) + } + + // set OS flags for platforms that have multiple browsers + if (!result.msedge && (android || result.silk)) { + result.android = t + } else if (iosdevice) { + result[iosdevice] = t + result.ios = t + } else if (mac) { + result.mac = t + } else if (xbox) { + result.xbox = t + } else if (windows) { + result.windows = t + } else if (linux) { + result.linux = t + } + + // OS version extraction + var osVersion = ''; + if (result.windowsphone) { + osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); + } else if (iosdevice) { + osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); + osVersion = osVersion.replace(/[_\s]/g, '.'); + } else if (android) { + osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); + } else if (result.webos) { + osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); + } else if (result.blackberry) { + osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); + } else if (result.bada) { + osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); + } else if (result.tizen) { + osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); + } + if (osVersion) { + result.osversion = osVersion; + } + + // device type extraction + var osMajorVersion = osVersion.split('.')[0]; + if ( + tablet + || nexusTablet + || iosdevice == 'ipad' + || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile))) + || result.silk + ) { + result.tablet = t + } else if ( + mobile + || iosdevice == 'iphone' + || iosdevice == 'ipod' + || android + || nexusMobile + || result.blackberry + || result.webos + || result.bada + ) { + result.mobile = t + } + + // Graded Browser Support + // http://developer.yahoo.com/yui/articles/gbs + if (result.msedge || + (result.msie && result.version >= 10) || + (result.yandexbrowser && result.version >= 15) || + (result.vivaldi && result.version >= 1.0) || + (result.chrome && result.version >= 20) || + (result.firefox && result.version >= 20.0) || + (result.safari && result.version >= 6) || + (result.opera && result.version >= 10.0) || + (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || + (result.blackberry && result.version >= 10.1) + ) { + result.a = t; + } + else if ((result.msie && result.version < 10) || + (result.chrome && result.version < 20) || + (result.firefox && result.version < 20.0) || + (result.safari && result.version < 6) || + (result.opera && result.version < 10.0) || + (result.ios && result.osversion && result.osversion.split(".")[0] < 6) + ) { + result.c = t + } else result.x = t + + return result + } + + var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '') + + bowser.test = function (browserList) { + for (var i = 0; i < browserList.length; ++i) { + var browserItem = browserList[i]; + if (typeof browserItem=== 'string') { + if (browserItem in bowser) { + return true; + } + } + } + return false; + } + + /* + * Set our detect method to the main bowser object so we can + * reuse it to test other user agents. + * This is needed to implement future tests. + */ + bowser._detect = detect; + + return bowser +}); + +},{}],20:[function(require,module,exports){ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/* global define */ + +(function () { + 'use strict'; + + var hasOwn = {}.hasOwnProperty; + + function classNames () { + var classes = []; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes.push(arg); + } else if (Array.isArray(arg)) { + classes.push(classNames.apply(null, arg)); + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes.push(key); + } + } + } + } + + return classes.join(' '); + } + + if (typeof module !== 'undefined' && module.exports) { + module.exports = classNames; + } else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + // register as 'classnames', consistent with npm package name + define('classnames', [], function () { + return classNames; + }); + } else { + window.classNames = classNames; + } +}()); + +},{}],21:[function(require,module,exports){ +'use strict'; + +var babelHelpers = require('./util/babelHelpers.js'); + +exports.__esModule = true; + +/** + * document.activeElement + */ +exports['default'] = activeElement; + +var _ownerDocument = require('./ownerDocument'); + +var _ownerDocument2 = babelHelpers.interopRequireDefault(_ownerDocument); + +function activeElement() { + var doc = arguments[0] === undefined ? document : arguments[0]; + + try { + return doc.activeElement; + } catch (e) {} +} + +module.exports = exports['default']; +},{"./ownerDocument":30,"./util/babelHelpers.js":43}],22:[function(require,module,exports){ +'use strict'; +var hasClass = require('./hasClass'); + +module.exports = function addClass(element, className) { + if (element.classList) element.classList.add(className);else if (!hasClass(element)) element.className = element.className + ' ' + className; +}; +},{"./hasClass":23}],23:[function(require,module,exports){ +'use strict'; +module.exports = function hasClass(element, className) { + if (element.classList) return !!className && element.classList.contains(className);else return (' ' + element.className + ' ').indexOf(' ' + className + ' ') !== -1; +}; +},{}],24:[function(require,module,exports){ +'use strict'; + +module.exports = { + addClass: require('./addClass'), + removeClass: require('./removeClass'), + hasClass: require('./hasClass') +}; +},{"./addClass":22,"./hasClass":23,"./removeClass":25}],25:[function(require,module,exports){ +'use strict'; + +module.exports = function removeClass(element, className) { + if (element.classList) element.classList.remove(className);else element.className = element.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)', 'g'), '$1').replace(/\s+/g, ' ').replace(/^\s*|\s*$/g, ''); +}; +},{}],26:[function(require,module,exports){ +'use strict'; + +var contains = require('../query/contains'), + qsa = require('../query/querySelectorAll'); + +module.exports = function (selector, handler) { + return function (e) { + var top = e.currentTarget, + target = e.target, + matches = qsa(top, selector); + + if (matches.some(function (match) { + return contains(match, target); + })) handler.call(this, e); + }; +}; +},{"../query/contains":31,"../query/querySelectorAll":36}],27:[function(require,module,exports){ +'use strict'; +var on = require('./on'), + off = require('./off'), + filter = require('./filter'); + +module.exports = { on: on, off: off, filter: filter }; +},{"./filter":26,"./off":28,"./on":29}],28:[function(require,module,exports){ +'use strict'; +var canUseDOM = require('../util/inDOM'); +var off = function off() {}; + +if (canUseDOM) { + + off = (function () { + + if (document.addEventListener) return function (node, eventName, handler, capture) { + return node.removeEventListener(eventName, handler, capture || false); + };else if (document.attachEvent) return function (node, eventName, handler) { + return node.detachEvent('on' + eventName, handler); + }; + })(); +} + +module.exports = off; +},{"../util/inDOM":48}],29:[function(require,module,exports){ +'use strict'; +var canUseDOM = require('../util/inDOM'); +var on = function on() {}; + +if (canUseDOM) { + on = (function () { + + if (document.addEventListener) return function (node, eventName, handler, capture) { + return node.addEventListener(eventName, handler, capture || false); + };else if (document.attachEvent) return function (node, eventName, handler) { + return node.attachEvent('on' + eventName, handler); + }; + })(); +} + +module.exports = on; +},{"../util/inDOM":48}],30:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = ownerDocument; + +function ownerDocument(node) { + return node && node.ownerDocument || document; +} + +module.exports = exports["default"]; +},{}],31:[function(require,module,exports){ +'use strict'; +var canUseDOM = require('../util/inDOM'); + +var contains = (function () { + var root = canUseDOM && document.documentElement; + + return root && root.contains ? function (context, node) { + return context.contains(node); + } : root && root.compareDocumentPosition ? function (context, node) { + return context === node || !!(context.compareDocumentPosition(node) & 16); + } : function (context, node) { + if (node) do { + if (node === context) return true; + } while (node = node.parentNode); + + return false; + }; +})(); + +module.exports = contains; +},{"../util/inDOM":48}],32:[function(require,module,exports){ +'use strict'; + +module.exports = function getWindow(node) { + return node === node.window ? node : node.nodeType === 9 ? node.defaultView || node.parentWindow : false; +}; +},{}],33:[function(require,module,exports){ +'use strict'; +var contains = require('./contains'), + getWindow = require('./isWindow'), + ownerDocument = require('../ownerDocument'); + +module.exports = function offset(node) { + var doc = ownerDocument(node), + win = getWindow(doc), + docElem = doc && doc.documentElement, + box = { top: 0, left: 0, height: 0, width: 0 }; + + if (!doc) return; + + // Make sure it's not a disconnected DOM node + if (!contains(docElem, node)) return box; + + if (node.getBoundingClientRect !== undefined) box = node.getBoundingClientRect(); + + if (box.width || box.height) { + + box = { + top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0), + left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0), + width: (box.width == null ? node.offsetWidth : box.width) || 0, + height: (box.height == null ? node.offsetHeight : box.height) || 0 + }; + } + + return box; +}; +},{"../ownerDocument":30,"./contains":31,"./isWindow":32}],34:[function(require,module,exports){ +'use strict'; + +var babelHelpers = require('../util/babelHelpers.js'); + +exports.__esModule = true; +exports['default'] = offsetParent; + +var _ownerDocument = require('../ownerDocument'); + +var _ownerDocument2 = babelHelpers.interopRequireDefault(_ownerDocument); + +var _style = require('../style'); + +var _style2 = babelHelpers.interopRequireDefault(_style); + +function nodeName(node) { + return node.nodeName && node.nodeName.toLowerCase(); +} + +function offsetParent(node) { + var doc = (0, _ownerDocument2['default'])(node), + offsetParent = node && node.offsetParent; + + while (offsetParent && nodeName(node) !== 'html' && (0, _style2['default'])(offsetParent, 'position') === 'static') { + offsetParent = offsetParent.offsetParent; + } + + return offsetParent || doc.documentElement; +} + +module.exports = exports['default']; +},{"../ownerDocument":30,"../style":40,"../util/babelHelpers.js":43}],35:[function(require,module,exports){ +'use strict'; + +var babelHelpers = require('../util/babelHelpers.js'); + +exports.__esModule = true; +exports['default'] = position; + +var _offset = require('./offset'); + +var _offset2 = babelHelpers.interopRequireDefault(_offset); + +var _offsetParent = require('./offsetParent'); + +var _offsetParent2 = babelHelpers.interopRequireDefault(_offsetParent); + +var _scrollTop = require('./scrollTop'); + +var _scrollTop2 = babelHelpers.interopRequireDefault(_scrollTop); + +var _scrollLeft = require('./scrollLeft'); + +var _scrollLeft2 = babelHelpers.interopRequireDefault(_scrollLeft); + +var _style = require('../style'); + +var _style2 = babelHelpers.interopRequireDefault(_style); + +function nodeName(node) { + return node.nodeName && node.nodeName.toLowerCase(); +} + +function position(node, offsetParent) { + var parentOffset = { top: 0, left: 0 }, + offset; + + // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, + // because it is its only offset parent + if ((0, _style2['default'])(node, 'position') === 'fixed') { + offset = node.getBoundingClientRect(); + } else { + offsetParent = offsetParent || (0, _offsetParent2['default'])(node); + offset = (0, _offset2['default'])(node); + + if (nodeName(offsetParent) !== 'html') parentOffset = (0, _offset2['default'])(offsetParent); + + parentOffset.top += parseInt((0, _style2['default'])(offsetParent, 'borderTopWidth'), 10) - (0, _scrollTop2['default'])(offsetParent) || 0; + parentOffset.left += parseInt((0, _style2['default'])(offsetParent, 'borderLeftWidth'), 10) - (0, _scrollLeft2['default'])(offsetParent) || 0; + } + + // Subtract parent offsets and node margins + return babelHelpers._extends({}, offset, { + top: offset.top - parentOffset.top - (parseInt((0, _style2['default'])(node, 'marginTop'), 10) || 0), + left: offset.left - parentOffset.left - (parseInt((0, _style2['default'])(node, 'marginLeft'), 10) || 0) + }); +} + +module.exports = exports['default']; +},{"../style":40,"../util/babelHelpers.js":43,"./offset":33,"./offsetParent":34,"./scrollLeft":37,"./scrollTop":38}],36:[function(require,module,exports){ +'use strict'; +// Zepto.js +// (c) 2010-2015 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. +var simpleSelectorRE = /^[\w-]*$/, + toArray = Function.prototype.bind.call(Function.prototype.call, [].slice); + +module.exports = function qsa(element, selector) { + var maybeID = selector[0] === '#', + maybeClass = selector[0] === '.', + nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, + isSimple = simpleSelectorRE.test(nameOnly), + found; + + if (isSimple) { + if (maybeID) { + element = element.getElementById ? element : document; + return (found = element.getElementById(nameOnly)) ? [found] : []; + } + + if (element.getElementsByClassName && maybeClass) return toArray(element.getElementsByClassName(nameOnly)); + + return toArray(element.getElementsByTagName(selector)); + } + + return toArray(element.querySelectorAll(selector)); +}; +},{}],37:[function(require,module,exports){ +'use strict'; +var getWindow = require('./isWindow'); + +module.exports = function scrollTop(node, val) { + var win = getWindow(node); + + if (val === undefined) return win ? 'pageXOffset' in win ? win.pageXOffset : win.document.documentElement.scrollLeft : node.scrollLeft; + + if (win) win.scrollTo(val, 'pageYOffset' in win ? win.pageYOffset : win.document.documentElement.scrollTop);else node.scrollLeft = val; +}; +},{"./isWindow":32}],38:[function(require,module,exports){ +'use strict'; +var getWindow = require('./isWindow'); + +module.exports = function scrollTop(node, val) { + var win = getWindow(node); + + if (val === undefined) return win ? 'pageYOffset' in win ? win.pageYOffset : win.document.documentElement.scrollTop : node.scrollTop; + + if (win) win.scrollTo('pageXOffset' in win ? win.pageXOffset : win.document.documentElement.scrollLeft, val);else node.scrollTop = val; +}; +},{"./isWindow":32}],39:[function(require,module,exports){ +'use strict'; + +var babelHelpers = require('../util/babelHelpers.js'); + +var _utilCamelizeStyle = require('../util/camelizeStyle'); + +var _utilCamelizeStyle2 = babelHelpers.interopRequireDefault(_utilCamelizeStyle); + +var rposition = /^(top|right|bottom|left)$/; +var rnumnonpx = /^([+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/i; + +module.exports = function _getComputedStyle(node) { + if (!node) throw new TypeError('No Element passed to `getComputedStyle()`'); + var doc = node.ownerDocument; + + return 'defaultView' in doc ? doc.defaultView.opener ? node.ownerDocument.defaultView.getComputedStyle(node, null) : window.getComputedStyle(node, null) : { //ie 8 "magic" from: https://github.com/jquery/jquery/blob/1.11-stable/src/css/curCSS.js#L72 + getPropertyValue: function getPropertyValue(prop) { + var style = node.style; + + prop = (0, _utilCamelizeStyle2['default'])(prop); + + if (prop == 'float') prop = 'styleFloat'; + + var current = node.currentStyle[prop] || null; + + if (current == null && style && style[prop]) current = style[prop]; + + if (rnumnonpx.test(current) && !rposition.test(prop)) { + // Remember the original values + var left = style.left; + var runStyle = node.runtimeStyle; + var rsLeft = runStyle && runStyle.left; + + // Put in the new values to get a computed value out + if (rsLeft) runStyle.left = node.currentStyle.left; + + style.left = prop === 'fontSize' ? '1em' : current; + current = style.pixelLeft + 'px'; + + // Revert the changed values + style.left = left; + if (rsLeft) runStyle.left = rsLeft; + } + + return current; + } + }; +}; +},{"../util/babelHelpers.js":43,"../util/camelizeStyle":45}],40:[function(require,module,exports){ +'use strict'; + +var camelize = require('../util/camelizeStyle'), + hyphenate = require('../util/hyphenateStyle'), + _getComputedStyle = require('./getComputedStyle'), + removeStyle = require('./removeStyle'); + +var has = Object.prototype.hasOwnProperty; + +module.exports = function style(node, property, value) { + var css = '', + props = property; + + if (typeof property === 'string') { + + if (value === undefined) return node.style[camelize(property)] || _getComputedStyle(node).getPropertyValue(hyphenate(property));else (props = {})[property] = value; + } + + for (var key in props) if (has.call(props, key)) { + !props[key] && props[key] !== 0 ? removeStyle(node, hyphenate(key)) : css += hyphenate(key) + ':' + props[key] + ';'; + } + + node.style.cssText += ';' + css; +}; +},{"../util/camelizeStyle":45,"../util/hyphenateStyle":47,"./getComputedStyle":39,"./removeStyle":41}],41:[function(require,module,exports){ +'use strict'; + +module.exports = function removeStyle(node, key) { + return 'removeProperty' in node.style ? node.style.removeProperty(key) : node.style.removeAttribute(key); +}; +},{}],42:[function(require,module,exports){ +'use strict'; +var canUseDOM = require('../util/inDOM'); + +var has = Object.prototype.hasOwnProperty, + transform = 'transform', + transition = {}, + transitionTiming, + transitionDuration, + transitionProperty, + transitionDelay; + +if (canUseDOM) { + transition = getTransitionProperties(); + + transform = transition.prefix + transform; + + transitionProperty = transition.prefix + 'transition-property'; + transitionDuration = transition.prefix + 'transition-duration'; + transitionDelay = transition.prefix + 'transition-delay'; + transitionTiming = transition.prefix + 'transition-timing-function'; +} + +module.exports = { + transform: transform, + end: transition.end, + property: transitionProperty, + timing: transitionTiming, + delay: transitionDelay, + duration: transitionDuration +}; + +function getTransitionProperties() { + var endEvent, + prefix = '', + transitions = { + O: 'otransitionend', + Moz: 'transitionend', + Webkit: 'webkitTransitionEnd', + ms: 'MSTransitionEnd' + }; + + var element = document.createElement('div'); + + for (var vendor in transitions) if (has.call(transitions, vendor)) { + if (element.style[vendor + 'TransitionProperty'] !== undefined) { + prefix = '-' + vendor.toLowerCase() + '-'; + endEvent = transitions[vendor]; + break; + } + } + + if (!endEvent && element.style.transitionProperty !== undefined) endEvent = 'transitionend'; + + return { end: endEvent, prefix: prefix }; +} +},{"../util/inDOM":48}],43:[function(require,module,exports){ +(function (root, factory) { + if (typeof define === "function" && define.amd) { + define(["exports"], factory); + } else if (typeof exports === "object") { + factory(exports); + } else { + factory(root.babelHelpers = {}); + } +})(this, function (global) { + var babelHelpers = global; + + babelHelpers.interopRequireDefault = function (obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; + }; + + babelHelpers._extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; +}) +},{}],44:[function(require,module,exports){ +"use strict"; + +var rHyphen = /-(.)/g; + +module.exports = function camelize(string) { + return string.replace(rHyphen, function (_, chr) { + return chr.toUpperCase(); + }); +}; +},{}],45:[function(require,module,exports){ +/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/camelizeStyleName.js + */ + +'use strict'; +var camelize = require('./camelize'); +var msPattern = /^-ms-/; + +module.exports = function camelizeStyleName(string) { + return camelize(string.replace(msPattern, 'ms-')); +}; +},{"./camelize":44}],46:[function(require,module,exports){ +'use strict'; + +var rUpper = /([A-Z])/g; + +module.exports = function hyphenate(string) { + return string.replace(rUpper, '-$1').toLowerCase(); +}; +},{}],47:[function(require,module,exports){ +/** + * Copyright 2013-2014, Facebook, Inc. + * All rights reserved. + * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js + */ + +"use strict"; + +var hyphenate = require("./hyphenate"); +var msPattern = /^ms-/; + +module.exports = function hyphenateStyleName(string) { + return hyphenate(string).replace(msPattern, "-ms-"); +}; +},{"./hyphenate":46}],48:[function(require,module,exports){ +'use strict'; +module.exports = !!(typeof window !== 'undefined' && window.document && window.document.createElement); +},{}],49:[function(require,module,exports){ +'use strict'; + +var canUseDOM = require('./inDOM'); + +var size; + +module.exports = function (recalc) { + if (!size || recalc) { + if (canUseDOM) { + var scrollDiv = document.createElement('div'); + + scrollDiv.style.position = 'absolute'; + scrollDiv.style.top = '-9999px'; + scrollDiv.style.width = '50px'; + scrollDiv.style.height = '50px'; + scrollDiv.style.overflow = 'scroll'; + + document.body.appendChild(scrollDiv); + size = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + } + } + + return size; +}; +},{"./inDOM":48}],50:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; + + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; + +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],51:[function(require,module,exports){ +(function (process){ +/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule invariant + */ + +"use strict"; + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var invariant = function (condition, format, a, b, c, d, e, f) { + if (process.env.NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + })); + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +}; + +module.exports = invariant; +}).call(this,require('_process')) + +},{"_process":288}],52:[function(require,module,exports){ +/** + * Copyright (c) 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +module.exports.Dispatcher = require('./lib/Dispatcher'); + +},{"./lib/Dispatcher":53}],53:[function(require,module,exports){ +(function (process){ +/** + * Copyright (c) 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Dispatcher + * + * @preventMunge + */ + +'use strict'; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var invariant = require('fbjs/lib/invariant'); + +var _prefix = 'ID_'; + +/** + * Dispatcher is used to broadcast payloads to registered callbacks. This is + * different from generic pub-sub systems in two ways: + * + * 1) Callbacks are not subscribed to particular events. Every payload is + * dispatched to every registered callback. + * 2) Callbacks can be deferred in whole or part until other callbacks have + * been executed. + * + * For example, consider this hypothetical flight destination form, which + * selects a default city when a country is selected: + * + * var flightDispatcher = new Dispatcher(); + * + * // Keeps track of which country is selected + * var CountryStore = {country: null}; + * + * // Keeps track of which city is selected + * var CityStore = {city: null}; + * + * // Keeps track of the base flight price of the selected city + * var FlightPriceStore = {price: null} + * + * When a user changes the selected city, we dispatch the payload: + * + * flightDispatcher.dispatch({ + * actionType: 'city-update', + * selectedCity: 'paris' + * }); + * + * This payload is digested by `CityStore`: + * + * flightDispatcher.register(function(payload) { + * if (payload.actionType === 'city-update') { + * CityStore.city = payload.selectedCity; + * } + * }); + * + * When the user selects a country, we dispatch the payload: + * + * flightDispatcher.dispatch({ + * actionType: 'country-update', + * selectedCountry: 'australia' + * }); + * + * This payload is digested by both stores: + * + * CountryStore.dispatchToken = flightDispatcher.register(function(payload) { + * if (payload.actionType === 'country-update') { + * CountryStore.country = payload.selectedCountry; + * } + * }); + * + * When the callback to update `CountryStore` is registered, we save a reference + * to the returned token. Using this token with `waitFor()`, we can guarantee + * that `CountryStore` is updated before the callback that updates `CityStore` + * needs to query its data. + * + * CityStore.dispatchToken = flightDispatcher.register(function(payload) { + * if (payload.actionType === 'country-update') { + * // `CountryStore.country` may not be updated. + * flightDispatcher.waitFor([CountryStore.dispatchToken]); + * // `CountryStore.country` is now guaranteed to be updated. + * + * // Select the default city for the new country + * CityStore.city = getDefaultCityForCountry(CountryStore.country); + * } + * }); + * + * The usage of `waitFor()` can be chained, for example: + * + * FlightPriceStore.dispatchToken = + * flightDispatcher.register(function(payload) { + * switch (payload.actionType) { + * case 'country-update': + * case 'city-update': + * flightDispatcher.waitFor([CityStore.dispatchToken]); + * FlightPriceStore.price = + * getFlightPriceStore(CountryStore.country, CityStore.city); + * break; + * } + * }); + * + * The `country-update` payload will be guaranteed to invoke the stores' + * registered callbacks in order: `CountryStore`, `CityStore`, then + * `FlightPriceStore`. + */ + +var Dispatcher = (function () { + function Dispatcher() { + _classCallCheck(this, Dispatcher); + + this._callbacks = {}; + this._isDispatching = false; + this._isHandled = {}; + this._isPending = {}; + this._lastID = 1; + } + + /** + * Registers a callback to be invoked with every dispatched payload. Returns + * a token that can be used with `waitFor()`. + */ + + Dispatcher.prototype.register = function register(callback) { + var id = _prefix + this._lastID++; + this._callbacks[id] = callback; + return id; + }; + + /** + * Removes a callback based on its token. + */ + + Dispatcher.prototype.unregister = function unregister(id) { + !this._callbacks[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined; + delete this._callbacks[id]; + }; + + /** + * Waits for the callbacks specified to be invoked before continuing execution + * of the current callback. This method should only be used by a callback in + * response to a dispatched payload. + */ + + Dispatcher.prototype.waitFor = function waitFor(ids) { + !this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): Must be invoked while dispatching.') : invariant(false) : undefined; + for (var ii = 0; ii < ids.length; ii++) { + var id = ids[ii]; + if (this._isPending[id]) { + !this._isHandled[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): Circular dependency detected while ' + 'waiting for `%s`.', id) : invariant(false) : undefined; + continue; + } + !this._callbacks[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined; + this._invokeCallback(id); + } + }; + + /** + * Dispatches a payload to all registered callbacks. + */ + + Dispatcher.prototype.dispatch = function dispatch(payload) { + !!this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.') : invariant(false) : undefined; + this._startDispatching(payload); + try { + for (var id in this._callbacks) { + if (this._isPending[id]) { + continue; + } + this._invokeCallback(id); + } + } finally { + this._stopDispatching(); + } + }; + + /** + * Is this Dispatcher currently dispatching. + */ + + Dispatcher.prototype.isDispatching = function isDispatching() { + return this._isDispatching; + }; + + /** + * Call the callback stored with the given id. Also do some internal + * bookkeeping. + * + * @internal + */ + + Dispatcher.prototype._invokeCallback = function _invokeCallback(id) { + this._isPending[id] = true; + this._callbacks[id](this._pendingPayload); + this._isHandled[id] = true; + }; + + /** + * Set up bookkeeping needed when dispatching. + * + * @internal + */ + + Dispatcher.prototype._startDispatching = function _startDispatching(payload) { + for (var id in this._callbacks) { + this._isPending[id] = false; + this._isHandled[id] = false; + } + this._pendingPayload = payload; + this._isDispatching = true; + }; + + /** + * Clear bookkeeping used for dispatching. + * + * @internal + */ + + Dispatcher.prototype._stopDispatching = function _stopDispatching() { + delete this._pendingPayload; + this._isDispatching = false; + }; + + return Dispatcher; +})(); + +module.exports = Dispatcher; +}).call(this,require('_process')) + +},{"_process":288,"fbjs/lib/invariant":51}],54:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = calc; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsJoinPrefixedRules = require('../utils/joinPrefixedRules'); + +var _utilsJoinPrefixedRules2 = _interopRequireDefault(_utilsJoinPrefixedRules); + +var _utilsIsPrefixedValue = require('../utils/isPrefixedValue'); + +var _utilsIsPrefixedValue2 = _interopRequireDefault(_utilsIsPrefixedValue); + +function calc(property, value) { + if (typeof value === 'string' && value.indexOf('calc(') > -1) { + if ((0, _utilsIsPrefixedValue2['default'])(value)) return; + + return (0, _utilsJoinPrefixedRules2['default'])(property, value, function (prefix, value) { + return value.replace(/calc\(/g, prefix + 'calc('); + }); + } +} + +module.exports = exports['default']; +},{"../utils/isPrefixedValue":67,"../utils/joinPrefixedRules":68}],55:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = cursor; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsJoinPrefixedRules = require('../utils/joinPrefixedRules'); + +var _utilsJoinPrefixedRules2 = _interopRequireDefault(_utilsJoinPrefixedRules); + +var values = { + 'zoom-in': true, + 'zoom-out': true, + 'grab': true, + 'grabbing': true +}; + +function cursor(property, value) { + if (property === 'cursor' && values[value]) { + return (0, _utilsJoinPrefixedRules2['default'])(property, value); + } +} + +module.exports = exports['default']; +},{"../utils/joinPrefixedRules":68}],56:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = flex; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var values = { flex: true, 'inline-flex': true }; + +function flex(property, value) { + if (property === 'display' && values[value]) { + return { + display: ['-webkit-box', '-moz-box', '-ms-' + value + 'box', '-webkit-' + value, value] + }; + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":65}],57:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = flexboxIE; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var alternativeValues = { + 'space-around': 'distribute', + 'space-between': 'justify', + 'flex-start': 'start', + 'flex-end': 'end' +}; +var alternativeProps = { + alignContent: 'msFlexLinePack', + alignSelf: 'msFlexItemAlign', + alignItems: 'msFlexAlign', + justifyContent: 'msFlexPack', + order: 'msFlexOrder', + flexGrow: 'msFlexPositive', + flexShrink: 'msFlexNegative', + flexBasis: 'msPreferredSize' +}; + +function flexboxIE(property, value) { + if (alternativeProps[property]) { + return _defineProperty({}, alternativeProps[property], alternativeValues[value] || value); + } +} + +module.exports = exports['default']; +},{}],58:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = flexboxOld; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var alternativeValues = { + 'space-around': 'justify', + 'space-between': 'justify', + 'flex-start': 'start', + 'flex-end': 'end', + 'wrap-reverse': 'multiple', + wrap: 'multiple' +}; + +var alternativeProps = { + alignItems: 'WebkitBoxAlign', + justifyContent: 'WebkitBoxPack', + flexWrap: 'WebkitBoxLines' +}; + +function flexboxOld(property, value) { + if (property === 'flexDirection') { + return { + WebkitBoxOrient: value.indexOf('column') > -1 ? 'vertical' : 'horizontal', + WebkitBoxDirection: value.indexOf('reverse') > -1 ? 'reverse' : 'normal' + }; + } + if (alternativeProps[property]) { + return _defineProperty({}, alternativeProps[property], alternativeValues[value] || value); + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":65}],59:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = gradient; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsJoinPrefixedRules = require('../utils/joinPrefixedRules'); + +var _utilsJoinPrefixedRules2 = _interopRequireDefault(_utilsJoinPrefixedRules); + +var _utilsIsPrefixedValue = require('../utils/isPrefixedValue'); + +var _utilsIsPrefixedValue2 = _interopRequireDefault(_utilsIsPrefixedValue); + +var values = /linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/; + +function gradient(property, value) { + if (typeof value === 'string' && value.match(values) !== null) { + if ((0, _utilsIsPrefixedValue2['default'])(value)) return; + + return (0, _utilsJoinPrefixedRules2['default'])(property, value); + } +} + +module.exports = exports['default']; +},{"../utils/isPrefixedValue":67,"../utils/joinPrefixedRules":68}],60:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = sizing; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsJoinPrefixedRules = require('../utils/joinPrefixedRules'); + +var _utilsJoinPrefixedRules2 = _interopRequireDefault(_utilsJoinPrefixedRules); + +var properties = { + maxHeight: true, + maxWidth: true, + width: true, + height: true, + columnWidth: true, + minWidth: true, + minHeight: true +}; +var values = { + 'min-content': true, + 'max-content': true, + 'fill-available': true, + 'fit-content': true, + 'contain-floats': true +}; + +function sizing(property, value) { + if (properties[property] && values[value]) { + return (0, _utilsJoinPrefixedRules2['default'])(property, value); + } +} + +module.exports = exports['default']; +},{"../utils/joinPrefixedRules":68}],61:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = transition; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var _utilsCapitalizeString = require('../utils/capitalizeString'); + +var _utilsCapitalizeString2 = _interopRequireDefault(_utilsCapitalizeString); + +var _utilsIsPrefixedValue = require('../utils/isPrefixedValue'); + +var _utilsIsPrefixedValue2 = _interopRequireDefault(_utilsIsPrefixedValue); + +var _prefixProps = require('../prefixProps'); + +var _prefixProps2 = _interopRequireDefault(_prefixProps); + +var properties = { + transition: true, + transitionProperty: true, + WebkitTransition: true, + WebkitTransitionProperty: true +}; + +function transition(property, value) { + // also check for already prefixed transitions + if (typeof value === 'string' && properties[property]) { + var _ref2; + + var outputValue = prefixValue(value); + var webkitOutput = outputValue.split(',').filter(function (value) { + return value.match(/-moz-|-ms-/) === null; + }).join(','); + + // if the property is already prefixed + if (property.indexOf('Webkit') > -1) { + return _defineProperty({}, property, webkitOutput); + } + + return _ref2 = {}, _defineProperty(_ref2, 'Webkit' + (0, _utilsCapitalizeString2['default'])(property), webkitOutput), _defineProperty(_ref2, property, outputValue), _ref2; + } +} + +function prefixValue(value) { + if ((0, _utilsIsPrefixedValue2['default'])(value)) { + return value; + } + + // only split multi values, not cubic beziers + var multipleValues = value.split(/,(?![^()]*(?:\([^()]*\))?\))/g); + + // iterate each single value and check for transitioned properties + // that need to be prefixed as well + multipleValues.forEach(function (val, index) { + multipleValues[index] = Object.keys(_prefixProps2['default']).reduce(function (out, prefix) { + var dashCasePrefix = '-' + prefix.toLowerCase() + '-'; + + Object.keys(_prefixProps2['default'][prefix]).forEach(function (prop) { + var dashCaseProperty = (0, _utilsCamelToDashCase2['default'])(prop); + + if (val.indexOf(dashCaseProperty) > -1) { + // join all prefixes and create a new value + out = val.replace(dashCaseProperty, dashCasePrefix + dashCaseProperty) + ',' + out; + } + }); + return out; + }, val); + }); + + return multipleValues.join(','); +} +module.exports = exports['default']; +},{"../prefixProps":63,"../utils/camelToDashCase":65,"../utils/capitalizeString":66,"../utils/isPrefixedValue":67}],62:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = prefixAll; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _prefixProps = require('./prefixProps'); + +var _prefixProps2 = _interopRequireDefault(_prefixProps); + +var _utilsCapitalizeString = require('./utils/capitalizeString'); + +var _utilsCapitalizeString2 = _interopRequireDefault(_utilsCapitalizeString); + +var _utilsAssign = require('./utils/assign'); + +var _utilsAssign2 = _interopRequireDefault(_utilsAssign); + +var _pluginsCalc = require('./plugins/calc'); + +var _pluginsCalc2 = _interopRequireDefault(_pluginsCalc); + +var _pluginsCursor = require('./plugins/cursor'); + +var _pluginsCursor2 = _interopRequireDefault(_pluginsCursor); + +var _pluginsFlex = require('./plugins/flex'); + +var _pluginsFlex2 = _interopRequireDefault(_pluginsFlex); + +var _pluginsSizing = require('./plugins/sizing'); + +var _pluginsSizing2 = _interopRequireDefault(_pluginsSizing); + +var _pluginsGradient = require('./plugins/gradient'); + +var _pluginsGradient2 = _interopRequireDefault(_pluginsGradient); + +var _pluginsTransition = require('./plugins/transition'); + +var _pluginsTransition2 = _interopRequireDefault(_pluginsTransition); + +// special flexbox specifications + +var _pluginsFlexboxIE = require('./plugins/flexboxIE'); + +var _pluginsFlexboxIE2 = _interopRequireDefault(_pluginsFlexboxIE); + +var _pluginsFlexboxOld = require('./plugins/flexboxOld'); + +var _pluginsFlexboxOld2 = _interopRequireDefault(_pluginsFlexboxOld); + +var plugins = [_pluginsCalc2['default'], _pluginsCursor2['default'], _pluginsSizing2['default'], _pluginsGradient2['default'], _pluginsTransition2['default'], _pluginsFlexboxIE2['default'], _pluginsFlexboxOld2['default'], _pluginsFlex2['default']]; + +/** + * Returns a prefixed version of the style object using all vendor prefixes + * @param {Object} styles - Style object that gets prefixed properties added + * @returns {Object} - Style object with prefixed properties and values + */ + +function prefixAll(styles) { + return Object.keys(styles).reduce(function (prefixedStyles, property) { + var value = styles[property]; + if (value instanceof Object && !Array.isArray(value)) { + // recurse through nested style objects + prefixedStyles[property] = prefixAll(value); + } else { + Object.keys(_prefixProps2['default']).forEach(function (prefix) { + var properties = _prefixProps2['default'][prefix]; + // add prefixes if needed + if (properties[property]) { + prefixedStyles[prefix + (0, _utilsCapitalizeString2['default'])(property)] = value; + } + }); + + // resolve every special plugins + plugins.forEach(function (plugin) { + return (0, _utilsAssign2['default'])(prefixedStyles, plugin(property, value)); + }); + } + + return prefixedStyles; + }, styles); +} + +module.exports = exports['default']; +},{"./plugins/calc":54,"./plugins/cursor":55,"./plugins/flex":56,"./plugins/flexboxIE":57,"./plugins/flexboxOld":58,"./plugins/gradient":59,"./plugins/sizing":60,"./plugins/transition":61,"./prefixProps":63,"./utils/assign":64,"./utils/capitalizeString":66}],63:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = { "Webkit": { "transform": true, "transformOrigin": true, "transformOriginX": true, "transformOriginY": true, "backfaceVisibility": true, "perspective": true, "perspectiveOrigin": true, "transformStyle": true, "transformOriginZ": true, "animation": true, "animationDelay": true, "animationDirection": true, "animationFillMode": true, "animationDuration": true, "animationIterationCount": true, "animationName": true, "animationPlayState": true, "animationTimingFunction": true, "appearance": true, "userSelect": true, "fontKerning": true, "textEmphasisPosition": true, "textEmphasis": true, "textEmphasisStyle": true, "textEmphasisColor": true, "boxDecorationBreak": true, "clipPath": true, "maskImage": true, "maskMode": true, "maskRepeat": true, "maskPosition": true, "maskClip": true, "maskOrigin": true, "maskSize": true, "maskComposite": true, "mask": true, "maskBorderSource": true, "maskBorderMode": true, "maskBorderSlice": true, "maskBorderWidth": true, "maskBorderOutset": true, "maskBorderRepeat": true, "maskBorder": true, "maskType": true, "textDecorationStyle": true, "textDecorationSkip": true, "textDecorationLine": true, "textDecorationColor": true, "filter": true, "fontFeatureSettings": true, "breakAfter": true, "breakBefore": true, "breakInside": true, "columnCount": true, "columnFill": true, "columnGap": true, "columnRule": true, "columnRuleColor": true, "columnRuleStyle": true, "columnRuleWidth": true, "columns": true, "columnSpan": true, "columnWidth": true, "flex": true, "flexBasis": true, "flexDirection": true, "flexGrow": true, "flexFlow": true, "flexShrink": true, "flexWrap": true, "alignContent": true, "alignItems": true, "alignSelf": true, "justifyContent": true, "order": true, "transition": true, "transitionDelay": true, "transitionDuration": true, "transitionProperty": true, "transitionTimingFunction": true, "backdropFilter": true, "scrollSnapType": true, "scrollSnapPointsX": true, "scrollSnapPointsY": true, "scrollSnapDestination": true, "scrollSnapCoordinate": true, "shapeImageThreshold": true, "shapeImageMargin": true, "shapeImageOutside": true, "hyphens": true, "flowInto": true, "flowFrom": true, "regionFragment": true, "textSizeAdjust": true, "borderImage": true, "borderImageOutset": true, "borderImageRepeat": true, "borderImageSlice": true, "borderImageSource": true, "borderImageWidth": true, "tabSize": true, "objectFit": true, "objectPosition": true }, "Moz": { "appearance": true, "userSelect": true, "boxSizing": true, "textAlignLast": true, "textDecorationStyle": true, "textDecorationSkip": true, "textDecorationLine": true, "textDecorationColor": true, "tabSize": true, "hyphens": true, "fontFeatureSettings": true, "breakAfter": true, "breakBefore": true, "breakInside": true, "columnCount": true, "columnFill": true, "columnGap": true, "columnRule": true, "columnRuleColor": true, "columnRuleStyle": true, "columnRuleWidth": true, "columns": true, "columnSpan": true, "columnWidth": true }, "ms": { "flex": true, "flexBasis": false, "flexDirection": true, "flexGrow": false, "flexFlow": true, "flexShrink": false, "flexWrap": true, "alignContent": false, "alignItems": false, "alignSelf": false, "justifyContent": false, "order": false, "transform": true, "transformOrigin": true, "transformOriginX": true, "transformOriginY": true, "userSelect": true, "wrapFlow": true, "wrapThrough": true, "wrapMargin": true, "scrollSnapType": true, "scrollSnapPointsX": true, "scrollSnapPointsY": true, "scrollSnapDestination": true, "scrollSnapCoordinate": true, "touchAction": true, "hyphens": true, "flowInto": true, "flowFrom": true, "breakBefore": true, "breakAfter": true, "breakInside": true, "regionFragment": true, "gridTemplateColumns": true, "gridTemplateRows": true, "gridTemplateAreas": true, "gridTemplate": true, "gridAutoColumns": true, "gridAutoRows": true, "gridAutoFlow": true, "grid": true, "gridRowStart": true, "gridColumnStart": true, "gridRowEnd": true, "gridRow": true, "gridColumn": true, "gridColumnEnd": true, "gridColumnGap": true, "gridRowGap": true, "gridArea": true, "gridGap": true, "textSizeAdjust": true } }; +module.exports = exports["default"]; +},{}],64:[function(require,module,exports){ +// leight polyfill for Object.assign +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports["default"] = function (base) { + var extend = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + return Object.keys(extend).reduce(function (out, key) { + base[key] = extend[key]; + return out; + }, {}); +}; + +module.exports = exports["default"]; +},{}],65:[function(require,module,exports){ +/** + * Converts a camel-case string to a dash-case string + * @param {string} str - str that gets converted to dash-case + */ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +exports['default'] = function (str) { + return str.replace(/([a-z]|^)([A-Z])/g, function (match, p1, p2) { + return p1 + '-' + p2.toLowerCase(); + }).replace('ms-', '-ms-'); +}; + +module.exports = exports['default']; +},{}],66:[function(require,module,exports){ +// helper to capitalize strings +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports["default"] = function (str) { + return str.charAt(0).toUpperCase() + str.slice(1); +}; + +module.exports = exports["default"]; +},{}],67:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +exports['default'] = function (value) { + if (Array.isArray(value)) value = value.join(','); + + return value.match(/-webkit-|-moz-|-ms-/) !== null; +}; + +module.exports = exports['default']; +},{}],68:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _camelToDashCase = require('./camelToDashCase'); + +var _camelToDashCase2 = _interopRequireDefault(_camelToDashCase); + +// returns a style object with a single concated prefixed value string + +exports['default'] = function (property, value) { + var replacer = arguments.length <= 2 || arguments[2] === undefined ? function (prefix, value) { + return prefix + value; + } : arguments[2]; + return (function () { + return _defineProperty({}, property, ['-webkit-', '-moz-', ''].map(function (prefix) { + return replacer(prefix, value); + })); + })(); +}; + +module.exports = exports['default']; +},{"./camelToDashCase":65}],69:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var _inlineStylePrefixAll = require('inline-style-prefix-all'); + +var _inlineStylePrefixAll2 = _interopRequireDefault(_inlineStylePrefixAll); + +var _utilsGetBrowserInformation = require('./utils/getBrowserInformation'); + +var _utilsGetBrowserInformation2 = _interopRequireDefault(_utilsGetBrowserInformation); + +var _utilsGetPrefixedKeyframes = require('./utils/getPrefixedKeyframes'); + +var _utilsGetPrefixedKeyframes2 = _interopRequireDefault(_utilsGetPrefixedKeyframes); + +var _utilsCapitalizeString = require('./utils/capitalizeString'); + +var _utilsCapitalizeString2 = _interopRequireDefault(_utilsCapitalizeString); + +var _utilsAssign = require('./utils/assign'); + +var _utilsAssign2 = _interopRequireDefault(_utilsAssign); + +var _prefixProps = require('./prefixProps'); + +var _prefixProps2 = _interopRequireDefault(_prefixProps); + +var _pluginsCalc = require('./plugins/calc'); + +var _pluginsCalc2 = _interopRequireDefault(_pluginsCalc); + +var _pluginsCursor = require('./plugins/cursor'); + +var _pluginsCursor2 = _interopRequireDefault(_pluginsCursor); + +var _pluginsFlex = require('./plugins/flex'); + +var _pluginsFlex2 = _interopRequireDefault(_pluginsFlex); + +var _pluginsSizing = require('./plugins/sizing'); + +var _pluginsSizing2 = _interopRequireDefault(_pluginsSizing); + +var _pluginsGradient = require('./plugins/gradient'); + +var _pluginsGradient2 = _interopRequireDefault(_pluginsGradient); + +var _pluginsTransition = require('./plugins/transition'); + +var _pluginsTransition2 = _interopRequireDefault(_pluginsTransition); + +// special flexbox specifications + +var _pluginsFlexboxIE = require('./plugins/flexboxIE'); + +var _pluginsFlexboxIE2 = _interopRequireDefault(_pluginsFlexboxIE); + +var _pluginsFlexboxOld = require('./plugins/flexboxOld'); + +var _pluginsFlexboxOld2 = _interopRequireDefault(_pluginsFlexboxOld); + +var plugins = [_pluginsCalc2['default'], _pluginsCursor2['default'], _pluginsSizing2['default'], _pluginsGradient2['default'], _pluginsTransition2['default'], _pluginsFlexboxIE2['default'], _pluginsFlexboxOld2['default'], +// this must be run AFTER the flexbox specs +_pluginsFlex2['default']]; + +var Prefixer = (function () { + /** + * Instantiante a new prefixer + * @param {string} userAgent - userAgent to gather prefix information according to caniuse.com + * @param {string} keepUnprefixed - keeps unprefixed properties and values + */ + + function Prefixer() { + var _this = this; + + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + _classCallCheck(this, Prefixer); + + var defaultUserAgent = typeof navigator !== 'undefined' ? navigator.userAgent : undefined; + + this._userAgent = options.userAgent || defaultUserAgent; + this._keepUnprefixed = options.keepUnprefixed || false; + + this._browserInfo = (0, _utilsGetBrowserInformation2['default'])(this._userAgent); + + // Checks if the userAgent was resolved correctly + if (this._browserInfo && this._browserInfo.prefix) { + // set additional prefix information + this.cssPrefix = this._browserInfo.prefix.css; + this.jsPrefix = this._browserInfo.prefix.inline; + this.prefixedKeyframes = (0, _utilsGetPrefixedKeyframes2['default'])(this._browserInfo); + } else { + this._usePrefixAllFallback = true; + return false; + } + + var data = this._browserInfo.browser && _prefixProps2['default'][this._browserInfo.browser]; + if (data) { + this._requiresPrefix = Object.keys(data).filter(function (key) { + return data[key] >= _this._browserInfo.version; + }).reduce(function (result, name) { + result[name] = true; + return result; + }, {}); + this._hasPropsRequiringPrefix = Object.keys(this._requiresPrefix).length > 0; + } else { + this._usePrefixAllFallback = true; + } + } + + /** + * Returns a prefixed version of the style object + * @param {Object} styles - Style object that gets prefixed properties added + * @returns {Object} - Style object with prefixed properties and values + */ + + _createClass(Prefixer, [{ + key: 'prefix', + value: function prefix(styles) { + var _this2 = this; + + // use prefixAll as fallback if userAgent can not be resolved + if (this._usePrefixAllFallback) { + return (0, _inlineStylePrefixAll2['default'])(styles); + } + + // only add prefixes if needed + if (!this._hasPropsRequiringPrefix) { + return styles; + } + + styles = (0, _utilsAssign2['default'])({}, styles); + + Object.keys(styles).forEach(function (property) { + var value = styles[property]; + if (value instanceof Object) { + // recurse through nested style objects + styles[property] = _this2.prefix(value); + } else { + // add prefixes if needed + if (_this2._requiresPrefix[property]) { + styles[_this2.jsPrefix + (0, _utilsCapitalizeString2['default'])(property)] = value; + if (!_this2._keepUnprefixed) { + delete styles[property]; + } + } + + // resolve plugins + plugins.forEach(function (plugin) { + // generates a new plugin interface with current data + var resolvedStyles = plugin({ + property: property, + value: value, + styles: styles, + browserInfo: _this2._browserInfo, + prefix: { + js: _this2.jsPrefix, + css: _this2.cssPrefix, + keyframes: _this2.prefixedKeyframes + }, + keepUnprefixed: _this2._keepUnprefixed, + requiresPrefix: _this2._requiresPrefix + }); + (0, _utilsAssign2['default'])(styles, resolvedStyles); + }); + } + }); + + return styles; + } + + /** + * Returns a prefixed version of the style object using all vendor prefixes + * @param {Object} styles - Style object that gets prefixed properties added + * @returns {Object} - Style object with prefixed properties and values + */ + }], [{ + key: 'prefixAll', + value: function prefixAll(styles) { + return (0, _inlineStylePrefixAll2['default'])(styles); + } + }]); + + return Prefixer; +})(); + +exports['default'] = Prefixer; +module.exports = exports['default']; +},{"./plugins/calc":70,"./plugins/cursor":71,"./plugins/flex":72,"./plugins/flexboxIE":73,"./plugins/flexboxOld":74,"./plugins/gradient":75,"./plugins/sizing":76,"./plugins/transition":77,"./prefixProps":78,"./utils/assign":79,"./utils/capitalizeString":81,"./utils/getBrowserInformation":82,"./utils/getPrefixedKeyframes":83,"inline-style-prefix-all":62}],70:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = calc; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +function calc(_ref2) { + var property = _ref2.property; + var value = _ref2.value; + var _ref2$browserInfo = _ref2.browserInfo; + var browser = _ref2$browserInfo.browser; + var version = _ref2$browserInfo.version; + var css = _ref2.prefix.css; + var keepUnprefixed = _ref2.keepUnprefixed; + + if (typeof value === 'string' && value.indexOf('calc(') > -1 && (browser === 'firefox' && version < 15 || browser === 'chrome' && version < 25 || browser === 'safari' && version < 6.1 || browser === 'ios_saf' && version < 7)) { + return _defineProperty({}, property, value.replace(/calc\(/g, css + 'calc(') + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '')); + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],71:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = cursor; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var values = { + 'zoom-in': true, + 'zoom-out': true, + 'grab': true, + 'grabbing': true +}; + +function cursor(_ref) { + var property = _ref.property; + var value = _ref.value; + var _ref$browserInfo = _ref.browserInfo; + var browser = _ref$browserInfo.browser; + var version = _ref$browserInfo.version; + var css = _ref.prefix.css; + var keepUnprefixed = _ref.keepUnprefixed; + + if (property === 'cursor' && values[value] && (browser === 'firefox' && version < 24 || browser === 'chrome' && version < 37 || browser === 'safari' && version < 9 || browser === 'opera' && version < 24)) { + return { + cursor: css + value + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '') + }; + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],72:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = flex; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var values = { + 'flex': true, + 'inline-flex': true +}; + +function flex(_ref) { + var property = _ref.property; + var value = _ref.value; + var _ref$browserInfo = _ref.browserInfo; + var browser = _ref$browserInfo.browser; + var version = _ref$browserInfo.version; + var css = _ref.prefix.css; + var keepUnprefixed = _ref.keepUnprefixed; + + if (property === 'display' && values[value] && (browser === 'chrome' && version < 29 && version > 20 || (browser === 'safari' || browser === 'ios_saf') && version < 9 && version > 6 || browser === 'opera' && (version == 15 || version == 16))) { + return { + display: css + value + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '') + }; + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],73:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = flexboxIE; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var alternativeValues = { + 'space-around': 'distribute', + 'space-between': 'justify', + 'flex-start': 'start', + 'flex-end': 'end', + flex: 'flexbox', + 'inline-flex': 'inline-flexbox' +}; +var alternativeProps = { + alignContent: 'msFlexLinePack', + alignSelf: 'msFlexItemAlign', + alignItems: 'msFlexAlign', + justifyContent: 'msFlexPack', + order: 'msFlexOrder', + flexGrow: 'msFlexPositive', + flexShrink: 'msFlexNegative', + flexBasis: 'msPreferredSize' +}; + +var properties = Object.keys(alternativeProps).reduce(function (result, prop) { + result[prop] = true; + return result; +}, {}); + +function flexboxIE(_ref2) { + var property = _ref2.property; + var value = _ref2.value; + var styles = _ref2.styles; + var _ref2$browserInfo = _ref2.browserInfo; + var browser = _ref2$browserInfo.browser; + var version = _ref2$browserInfo.version; + var css = _ref2.prefix.css; + var keepUnprefixed = _ref2.keepUnprefixed; + + if ((properties[property] || property === 'display' && typeof value === 'string' && value.indexOf('flex') > -1) && (browser === 'ie_mob' || browser === 'ie') && version == 10) { + if (!keepUnprefixed) { + delete styles[property]; + } + if (property === 'display' && alternativeValues[value]) { + return { + display: css + alternativeValues[value] + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '') + }; + } + if (alternativeProps[property]) { + return _defineProperty({}, alternativeProps[property], alternativeValues[value] || value); + } + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],74:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = flexboxOld; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var alternativeValues = { + 'space-around': 'justify', + 'space-between': 'justify', + 'flex-start': 'start', + 'flex-end': 'end', + 'wrap-reverse': 'multiple', + wrap: 'multiple', + flex: 'box', + 'inline-flex': 'inline-box' +}; + +var alternativeProps = { + alignItems: 'WebkitBoxAlign', + justifyContent: 'WebkitBoxPack', + flexWrap: 'WebkitBoxLines' +}; + +var otherProps = ['alignContent', 'alignSelf', 'order', 'flexGrow', 'flexShrink', 'flexBasis', 'flexDirection']; + +var properties = Object.keys(alternativeProps).concat(otherProps).reduce(function (result, prop) { + result[prop] = true; + return result; +}, {}); + +function flexboxOld(_ref2) { + var property = _ref2.property; + var value = _ref2.value; + var styles = _ref2.styles; + var _ref2$browserInfo = _ref2.browserInfo; + var browser = _ref2$browserInfo.browser; + var version = _ref2$browserInfo.version; + var css = _ref2.prefix.css; + var keepUnprefixed = _ref2.keepUnprefixed; + + if ((properties[property] || property === 'display' && typeof value === 'string' && value.indexOf('flex') > -1) && (browser === 'firefox' && version < 22 || browser === 'chrome' && version < 21 || (browser === 'safari' || browser === 'ios_saf') && version <= 6.1 || browser === 'android' && version < 4.4 || browser === 'and_uc')) { + if (!keepUnprefixed) { + delete styles[property]; + } + if (property === 'flexDirection') { + return { + WebkitBoxOrient: value.indexOf('column') > -1 ? 'vertical' : 'horizontal', + WebkitBoxDirection: value.indexOf('reverse') > -1 ? 'reverse' : 'normal' + }; + } + if (property === 'display' && alternativeValues[value]) { + return { + display: css + alternativeValues[value] + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '') + }; + } + if (alternativeProps[property]) { + return _defineProperty({}, alternativeProps[property], alternativeValues[value] || value); + } + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],75:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = gradient; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var values = /linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/; + +function gradient(_ref2) { + var property = _ref2.property; + var value = _ref2.value; + var _ref2$browserInfo = _ref2.browserInfo; + var browser = _ref2$browserInfo.browser; + var version = _ref2$browserInfo.version; + var css = _ref2.prefix.css; + var keepUnprefixed = _ref2.keepUnprefixed; + + if (typeof value === 'string' && value.match(values) !== null && (browser === 'firefox' && version < 16 || browser === 'chrome' && version < 26 || (browser === 'safari' || browser === 'ios_saf') && version < 7 || (browser === 'opera' || browser === 'op_mini') && version < 12.1 || browser === 'android' && version < 4.4 || browser === 'and_uc')) { + return _defineProperty({}, property, css + value + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '')); + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],76:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = sizing; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var properties = { + maxHeight: true, + maxWidth: true, + width: true, + height: true, + columnWidth: true, + minWidth: true, + minHeight: true +}; +var values = { + 'min-content': true, + 'max-content': true, + 'fill-available': true, + 'fit-content': true, + 'contain-floats': true +}; + +function sizing(_ref2) { + var property = _ref2.property; + var value = _ref2.value; + var css = _ref2.prefix.css; + var keepUnprefixed = _ref2.keepUnprefixed; + + // This might change in the future + // Keep an eye on it + if (properties[property] && values[value]) { + return _defineProperty({}, property, css + value + (keepUnprefixed ? ';' + (0, _utilsCamelToDashCase2['default'])(property) + ':' + value : '')); + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80}],77:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = transition; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _utilsCamelToDashCase = require('../utils/camelToDashCase'); + +var _utilsCamelToDashCase2 = _interopRequireDefault(_utilsCamelToDashCase); + +var _utilsCapitalizeString = require('../utils/capitalizeString'); + +var _utilsCapitalizeString2 = _interopRequireDefault(_utilsCapitalizeString); + +var _utilsUnprefixProperty = require('../utils/unprefixProperty'); + +var _utilsUnprefixProperty2 = _interopRequireDefault(_utilsUnprefixProperty); + +var properties = { transition: true, transitionProperty: true }; + +function transition(_ref2) { + var property = _ref2.property; + var value = _ref2.value; + var css = _ref2.prefix.css; + var requiresPrefix = _ref2.requiresPrefix; + var keepUnprefixed = _ref2.keepUnprefixed; + + // also check for already prefixed transitions + var unprefixedProperty = (0, _utilsUnprefixProperty2['default'])(property); + if (typeof value === 'string' && properties[unprefixedProperty]) { + var _ret = (function () { + var requiresPrefixDashCased = Object.keys(requiresPrefix).map(function (prop) { + return (0, _utilsCamelToDashCase2['default'])(prop); + }); + + // only split multi values, not cubic beziers + var multipleValues = value.split(/,(?![^()]*(?:\([^()]*\))?\))/g); + + requiresPrefixDashCased.forEach(function (property) { + multipleValues.forEach(function (val, index) { + if (val.indexOf(property) > -1) { + multipleValues[index] = val.replace(property, css + property) + (keepUnprefixed ? ',' + val : ''); + } + }); + }); + + return { + v: _defineProperty({}, property, multipleValues.join(',')) + }; + })(); + + if (typeof _ret === 'object') return _ret.v; + } +} + +module.exports = exports['default']; +},{"../utils/camelToDashCase":80,"../utils/capitalizeString":81,"../utils/unprefixProperty":84}],78:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = { "chrome": { "transform": 35, "transformOrigin": 35, "transformOriginX": 35, "transformOriginY": 35, "backfaceVisibility": 35, "perspective": 35, "perspectiveOrigin": 35, "transformStyle": 35, "transformOriginZ": 35, "animation": 42, "animationDelay": 42, "animationDirection": 42, "animationFillMode": 42, "animationDuration": 42, "animationIterationCount": 42, "animationName": 42, "animationPlayState": 42, "animationTimingFunction": 42, "appearance": 52, "userSelect": 52, "fontKerning": 32, "textEmphasisPosition": 52, "textEmphasis": 52, "textEmphasisStyle": 52, "textEmphasisColor": 52, "boxDecorationBreak": 52, "clipPath": 52, "maskImage": 52, "maskMode": 52, "maskRepeat": 52, "maskPosition": 52, "maskClip": 52, "maskOrigin": 52, "maskSize": 52, "maskComposite": 52, "mask": 52, "maskBorderSource": 52, "maskBorderMode": 52, "maskBorderSlice": 52, "maskBorderWidth": 52, "maskBorderOutset": 52, "maskBorderRepeat": 52, "maskBorder": 52, "maskType": 52, "textDecorationStyle": 52, "textDecorationSkip": 52, "textDecorationLine": 52, "textDecorationColor": 52, "filter": 52, "fontFeatureSettings": 47, "breakAfter": 52, "breakBefore": 52, "breakInside": 52, "columnCount": 52, "columnFill": 52, "columnGap": 52, "columnRule": 52, "columnRuleColor": 52, "columnRuleStyle": 52, "columnRuleWidth": 52, "columns": 52, "columnSpan": 52, "columnWidth": 52 }, "safari": { "flex": 8, "flexBasis": 8, "flexDirection": 8, "flexGrow": 8, "flexFlow": 8, "flexShrink": 8, "flexWrap": 8, "alignContent": 8, "alignItems": 8, "alignSelf": 8, "justifyContent": 8, "order": 8, "transition": 6, "transitionDelay": 6, "transitionDuration": 6, "transitionProperty": 6, "transitionTimingFunction": 6, "transform": 8, "transformOrigin": 8, "transformOriginX": 8, "transformOriginY": 8, "backfaceVisibility": 8, "perspective": 8, "perspectiveOrigin": 8, "transformStyle": 8, "transformOriginZ": 8, "animation": 8, "animationDelay": 8, "animationDirection": 8, "animationFillMode": 8, "animationDuration": 8, "animationIterationCount": 8, "animationName": 8, "animationPlayState": 8, "animationTimingFunction": 8, "appearance": 9.1, "userSelect": 9.1, "backdropFilter": 9.1, "fontKerning": 9.1, "scrollSnapType": 9.1, "scrollSnapPointsX": 9.1, "scrollSnapPointsY": 9.1, "scrollSnapDestination": 9.1, "scrollSnapCoordinate": 9.1, "textEmphasisPosition": 7, "textEmphasis": 7, "textEmphasisStyle": 7, "textEmphasisColor": 7, "boxDecorationBreak": 9.1, "clipPath": 9.1, "maskImage": 9.1, "maskMode": 9.1, "maskRepeat": 9.1, "maskPosition": 9.1, "maskClip": 9.1, "maskOrigin": 9.1, "maskSize": 9.1, "maskComposite": 9.1, "mask": 9.1, "maskBorderSource": 9.1, "maskBorderMode": 9.1, "maskBorderSlice": 9.1, "maskBorderWidth": 9.1, "maskBorderOutset": 9.1, "maskBorderRepeat": 9.1, "maskBorder": 9.1, "maskType": 9.1, "textDecorationStyle": 9.1, "textDecorationSkip": 9.1, "textDecorationLine": 9.1, "textDecorationColor": 9.1, "shapeImageThreshold": 9.1, "shapeImageMargin": 9.1, "shapeImageOutside": 9.1, "filter": 9, "hyphens": 9.1, "flowInto": 9.1, "flowFrom": 9.1, "breakBefore": 8, "breakAfter": 8, "breakInside": 8, "regionFragment": 9.1, "columnCount": 8, "columnFill": 8, "columnGap": 8, "columnRule": 8, "columnRuleColor": 8, "columnRuleStyle": 8, "columnRuleWidth": 8, "columns": 8, "columnSpan": 8, "columnWidth": 8 }, "firefox": { "appearance": 47, "userSelect": 47, "boxSizing": 28, "textAlignLast": 47, "textDecorationStyle": 35, "textDecorationSkip": 35, "textDecorationLine": 35, "textDecorationColor": 35, "tabSize": 47, "hyphens": 42, "fontFeatureSettings": 33, "breakAfter": 47, "breakBefore": 47, "breakInside": 47, "columnCount": 47, "columnFill": 47, "columnGap": 47, "columnRule": 47, "columnRuleColor": 47, "columnRuleStyle": 47, "columnRuleWidth": 47, "columns": 47, "columnSpan": 47, "columnWidth": 47 }, "opera": { "flex": 16, "flexBasis": 16, "flexDirection": 16, "flexGrow": 16, "flexFlow": 16, "flexShrink": 16, "flexWrap": 16, "alignContent": 16, "alignItems": 16, "alignSelf": 16, "justifyContent": 16, "order": 16, "transform": 22, "transformOrigin": 22, "transformOriginX": 22, "transformOriginY": 22, "backfaceVisibility": 22, "perspective": 22, "perspectiveOrigin": 22, "transformStyle": 22, "transformOriginZ": 22, "animation": 29, "animationDelay": 29, "animationDirection": 29, "animationFillMode": 29, "animationDuration": 29, "animationIterationCount": 29, "animationName": 29, "animationPlayState": 29, "animationTimingFunction": 29, "appearance": 37, "userSelect": 37, "fontKerning": 19, "textEmphasisPosition": 37, "textEmphasis": 37, "textEmphasisStyle": 37, "textEmphasisColor": 37, "boxDecorationBreak": 37, "clipPath": 37, "maskImage": 37, "maskMode": 37, "maskRepeat": 37, "maskPosition": 37, "maskClip": 37, "maskOrigin": 37, "maskSize": 37, "maskComposite": 37, "mask": 37, "maskBorderSource": 37, "maskBorderMode": 37, "maskBorderSlice": 37, "maskBorderWidth": 37, "maskBorderOutset": 37, "maskBorderRepeat": 37, "maskBorder": 37, "maskType": 37, "filter": 37, "fontFeatureSettings": 37, "breakAfter": 37, "breakBefore": 37, "breakInside": 37, "columnCount": 37, "columnFill": 37, "columnGap": 37, "columnRule": 37, "columnRuleColor": 37, "columnRuleStyle": 37, "columnRuleWidth": 37, "columns": 37, "columnSpan": 37, "columnWidth": 37 }, "ie": { "gridTemplateRows": 11, "breakInside": 11, "transformOriginY": 9, "gridRowStart": 11, "gridColumn": 11, "regionFragment": 11, "breakBefore": 11, "userSelect": 11, "gridColumnEnd": 11, "gridRowEnd": 11, "gridTemplateColumns": 11, "gridColumnStart": 11, "gridArea": 11, "flexDirection": 10, "gridRowGap": 11, "gridTemplateAreas": 11, "gridAutoRows": 11, "gridRow": 11, "scrollSnapDestination": 11, "scrollSnapPointsY": 11, "touchAction": 10, "gridGap": 11, "gridColumnGap": 11, "wrapFlow": 11, "scrollSnapPointsX": 11, "flowFrom": 11, "transform": 9, "breakAfter": 11, "wrapMargin": 11, "scrollSnapCoordinate": 11, "flexWrap": 10, "scrollSnapType": 11, "flex": 10, "wrapThrough": 11, "gridAutoColumns": 11, "flexFlow": 10, "gridTemplate": 11, "hyphens": 11, "grid": 11, "transformOriginX": 9, "flowInto": 11, "transformOrigin": 9, "gridAutoFlow": 11, "textSizeAdjust": 11 }, "edge": { "userSelect": 14, "wrapFlow": 14, "wrapThrough": 14, "wrapMargin": 14, "scrollSnapType": 14, "scrollSnapPointsX": 14, "scrollSnapPointsY": 14, "scrollSnapDestination": 14, "scrollSnapCoordinate": 14, "hyphens": 14, "flowInto": 14, "flowFrom": 14, "breakBefore": 14, "breakAfter": 14, "breakInside": 14, "regionFragment": 14, "gridTemplateColumns": 14, "gridTemplateRows": 14, "gridTemplateAreas": 14, "gridTemplate": 14, "gridAutoColumns": 14, "gridAutoRows": 14, "gridAutoFlow": 14, "grid": 14, "gridRowStart": 14, "gridColumnStart": 14, "gridRowEnd": 14, "gridRow": 14, "gridColumn": 14, "gridColumnEnd": 14, "gridColumnGap": 14, "gridRowGap": 14, "gridArea": 14, "gridGap": 14 }, "ios_saf": { "flex": 8.1, "flexBasis": 8.1, "flexDirection": 8.1, "flexGrow": 8.1, "flexFlow": 8.1, "flexShrink": 8.1, "flexWrap": 8.1, "alignContent": 8.1, "alignItems": 8.1, "alignSelf": 8.1, "justifyContent": 8.1, "order": 8.1, "transition": 6, "transitionDelay": 6, "transitionDuration": 6, "transitionProperty": 6, "transitionTimingFunction": 6, "transform": 8.1, "transformOrigin": 8.1, "transformOriginX": 8.1, "transformOriginY": 8.1, "backfaceVisibility": 8.1, "perspective": 8.1, "perspectiveOrigin": 8.1, "transformStyle": 8.1, "transformOriginZ": 8.1, "animation": 8.1, "animationDelay": 8.1, "animationDirection": 8.1, "animationFillMode": 8.1, "animationDuration": 8.1, "animationIterationCount": 8.1, "animationName": 8.1, "animationPlayState": 8.1, "animationTimingFunction": 8.1, "appearance": 9.3, "userSelect": 9.3, "backdropFilter": 9.3, "fontKerning": 9.3, "scrollSnapType": 9.3, "scrollSnapPointsX": 9.3, "scrollSnapPointsY": 9.3, "scrollSnapDestination": 9.3, "scrollSnapCoordinate": 9.3, "boxDecorationBreak": 9.3, "clipPath": 9.3, "maskImage": 9.3, "maskMode": 9.3, "maskRepeat": 9.3, "maskPosition": 9.3, "maskClip": 9.3, "maskOrigin": 9.3, "maskSize": 9.3, "maskComposite": 9.3, "mask": 9.3, "maskBorderSource": 9.3, "maskBorderMode": 9.3, "maskBorderSlice": 9.3, "maskBorderWidth": 9.3, "maskBorderOutset": 9.3, "maskBorderRepeat": 9.3, "maskBorder": 9.3, "maskType": 9.3, "textSizeAdjust": 9.3, "textDecorationStyle": 9.3, "textDecorationSkip": 9.3, "textDecorationLine": 9.3, "textDecorationColor": 9.3, "shapeImageThreshold": 9.3, "shapeImageMargin": 9.3, "shapeImageOutside": 9.3, "filter": 9, "hyphens": 9.3, "flowInto": 9.3, "flowFrom": 9.3, "breakBefore": 8.1, "breakAfter": 8.1, "breakInside": 8.1, "regionFragment": 9.3, "columnCount": 8.1, "columnFill": 8.1, "columnGap": 8.1, "columnRule": 8.1, "columnRuleColor": 8.1, "columnRuleStyle": 8.1, "columnRuleWidth": 8.1, "columns": 8.1, "columnSpan": 8.1, "columnWidth": 8.1 }, "android": { "borderImage": 4.2, "borderImageOutset": 4.2, "borderImageRepeat": 4.2, "borderImageSlice": 4.2, "borderImageSource": 4.2, "borderImageWidth": 4.2, "flex": 4.2, "flexBasis": 4.2, "flexDirection": 4.2, "flexGrow": 4.2, "flexFlow": 4.2, "flexShrink": 4.2, "flexWrap": 4.2, "alignContent": 4.2, "alignItems": 4.2, "alignSelf": 4.2, "justifyContent": 4.2, "order": 4.2, "transition": 4.2, "transitionDelay": 4.2, "transitionDuration": 4.2, "transitionProperty": 4.2, "transitionTimingFunction": 4.2, "transform": 4.4, "transformOrigin": 4.4, "transformOriginX": 4.4, "transformOriginY": 4.4, "backfaceVisibility": 4.4, "perspective": 4.4, "perspectiveOrigin": 4.4, "transformStyle": 4.4, "transformOriginZ": 4.4, "animation": 4.4, "animationDelay": 4.4, "animationDirection": 4.4, "animationFillMode": 4.4, "animationDuration": 4.4, "animationIterationCount": 4.4, "animationName": 4.4, "animationPlayState": 4.4, "animationTimingFunction": 4.4, "appearance": 47, "userSelect": 47, "fontKerning": 4.4, "textEmphasisPosition": 47, "textEmphasis": 47, "textEmphasisStyle": 47, "textEmphasisColor": 47, "boxDecorationBreak": 47, "clipPath": 47, "maskImage": 47, "maskMode": 47, "maskRepeat": 47, "maskPosition": 47, "maskClip": 47, "maskOrigin": 47, "maskSize": 47, "maskComposite": 47, "mask": 47, "maskBorderSource": 47, "maskBorderMode": 47, "maskBorderSlice": 47, "maskBorderWidth": 47, "maskBorderOutset": 47, "maskBorderRepeat": 47, "maskBorder": 47, "maskType": 47, "filter": 47, "fontFeatureSettings": 47, "breakAfter": 47, "breakBefore": 47, "breakInside": 47, "columnCount": 47, "columnFill": 47, "columnGap": 47, "columnRule": 47, "columnRuleColor": 47, "columnRuleStyle": 47, "columnRuleWidth": 47, "columns": 47, "columnSpan": 47, "columnWidth": 47 }, "and_chr": { "appearance": 47, "userSelect": 47, "textEmphasisPosition": 47, "textEmphasis": 47, "textEmphasisStyle": 47, "textEmphasisColor": 47, "boxDecorationBreak": 47, "clipPath": 47, "maskImage": 47, "maskMode": 47, "maskRepeat": 47, "maskPosition": 47, "maskClip": 47, "maskOrigin": 47, "maskSize": 47, "maskComposite": 47, "mask": 47, "maskBorderSource": 47, "maskBorderMode": 47, "maskBorderSlice": 47, "maskBorderWidth": 47, "maskBorderOutset": 47, "maskBorderRepeat": 47, "maskBorder": 47, "maskType": 47, "textDecorationStyle": 47, "textDecorationSkip": 47, "textDecorationLine": 47, "textDecorationColor": 47, "filter": 47, "fontFeatureSettings": 47, "breakAfter": 47, "breakBefore": 47, "breakInside": 47, "columnCount": 47, "columnFill": 47, "columnGap": 47, "columnRule": 47, "columnRuleColor": 47, "columnRuleStyle": 47, "columnRuleWidth": 47, "columns": 47, "columnSpan": 47, "columnWidth": 47 }, "and_uc": { "flex": 9.9, "flexBasis": 9.9, "flexDirection": 9.9, "flexGrow": 9.9, "flexFlow": 9.9, "flexShrink": 9.9, "flexWrap": 9.9, "alignContent": 9.9, "alignItems": 9.9, "alignSelf": 9.9, "justifyContent": 9.9, "order": 9.9, "transition": 9.9, "transitionDelay": 9.9, "transitionDuration": 9.9, "transitionProperty": 9.9, "transitionTimingFunction": 9.9, "transform": 9.9, "transformOrigin": 9.9, "transformOriginX": 9.9, "transformOriginY": 9.9, "backfaceVisibility": 9.9, "perspective": 9.9, "perspectiveOrigin": 9.9, "transformStyle": 9.9, "transformOriginZ": 9.9, "animation": 9.9, "animationDelay": 9.9, "animationDirection": 9.9, "animationFillMode": 9.9, "animationDuration": 9.9, "animationIterationCount": 9.9, "animationName": 9.9, "animationPlayState": 9.9, "animationTimingFunction": 9.9, "appearance": 9.9, "userSelect": 9.9, "fontKerning": 9.9, "textEmphasisPosition": 9.9, "textEmphasis": 9.9, "textEmphasisStyle": 9.9, "textEmphasisColor": 9.9, "maskImage": 9.9, "maskMode": 9.9, "maskRepeat": 9.9, "maskPosition": 9.9, "maskClip": 9.9, "maskOrigin": 9.9, "maskSize": 9.9, "maskComposite": 9.9, "mask": 9.9, "maskBorderSource": 9.9, "maskBorderMode": 9.9, "maskBorderSlice": 9.9, "maskBorderWidth": 9.9, "maskBorderOutset": 9.9, "maskBorderRepeat": 9.9, "maskBorder": 9.9, "maskType": 9.9, "textSizeAdjust": 9.9, "filter": 9.9, "hyphens": 9.9, "flowInto": 9.9, "flowFrom": 9.9, "breakBefore": 9.9, "breakAfter": 9.9, "breakInside": 9.9, "regionFragment": 9.9, "fontFeatureSettings": 9.9, "columnCount": 9.9, "columnFill": 9.9, "columnGap": 9.9, "columnRule": 9.9, "columnRuleColor": 9.9, "columnRuleStyle": 9.9, "columnRuleWidth": 9.9, "columns": 9.9, "columnSpan": 9.9, "columnWidth": 9.9 }, "op_mini": { "borderImage": 5, "borderImageOutset": 5, "borderImageRepeat": 5, "borderImageSlice": 5, "borderImageSource": 5, "borderImageWidth": 5, "tabSize": 5, "objectFit": 5, "objectPosition": 5 } }; +module.exports = exports["default"]; +},{}],79:[function(require,module,exports){ +// leight polyfill for Object.assign +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports["default"] = function (base) { + var extend = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + Object.keys(extend).forEach(function (key) { + return base[key] = extend[key]; + }); + return base; +}; + +module.exports = exports["default"]; +},{}],80:[function(require,module,exports){ +arguments[4][65][0].apply(exports,arguments) +},{"dup":65}],81:[function(require,module,exports){ +arguments[4][66][0].apply(exports,arguments) +},{"dup":66}],82:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _bowser = require('bowser'); + +var _bowser2 = _interopRequireDefault(_bowser); + +var vendorPrefixes = { + Webkit: ['chrome', 'safari', 'ios', 'android', 'phantom', 'opera', 'webos', 'blackberry', 'bada', 'tizen'], + Moz: ['firefox', 'seamonkey', 'sailfish'], + ms: ['msie', 'msedge'] +}; + +var browsers = { + chrome: [['chrome']], + safari: [['safari']], + firefox: [['firefox']], + ie: [['msie']], + edge: [['msedge']], + opera: [['opera']], + ios_saf: [['ios', 'mobile'], ['ios', 'tablet']], + ie_mob: [['windowsphone', 'mobile', 'msie'], ['windowsphone', 'tablet', 'msie'], ['windowsphone', 'mobile', 'msedge'], ['windowsphone', 'tablet', 'msedge']], + op_mini: [['opera', 'mobile'], ['opera', 'tablet']], + and_uc: [['android', 'mobile'], ['android', 'tablet']], + android: [['android', 'mobile'], ['android', 'tablet']] +}; + +/** + * Uses bowser to get default browser information such as version and name + * Evaluates bowser info and adds vendorPrefix information + * @param {string} userAgent - userAgent that gets evaluated + */ + +exports['default'] = function (userAgent) { + if (!userAgent) { + return false; + } + + var info = _bowser2['default']._detect(userAgent); + + Object.keys(vendorPrefixes).forEach(function (prefix) { + vendorPrefixes[prefix].forEach(function (browser) { + if (info[browser]) { + info.prefix = { + inline: prefix, + css: '-' + prefix.toLowerCase() + '-' + }; + } + }); + }); + + var name = ''; + Object.keys(browsers).forEach(function (browser) { + browsers[browser].forEach(function (condition) { + var match = 0; + condition.forEach(function (single) { + if (info[single]) { + match += 1; + } + }); + if (condition.length === match) { + name = browser; + } + }); + }); + + info.browser = name; + // For cordova IOS 8 the version is missing, set truncated osversion to prevent NaN + info.version = info.version ? parseFloat(info.version) : parseInt(parseFloat(info.osversion), 10); + + // seperate native android chrome + // https://github.com/rofrischmann/inline-style-prefixer/issues/45 + if (info.browser === 'android' && info.chrome && info.version > 37) { + info.browser = 'and_chr'; + } + info.version = parseFloat(info.version); + info.osversion = parseFloat(info.osversion); + // For android < 4.4 we want to check the osversion + // not the chrome version, see issue #26 + // https://github.com/rofrischmann/inline-style-prefixer/issues/26 + if (info.browser === 'android' && info.osversion < 5) { + info.version = info.osversion; + } + + return info; +}; + +module.exports = exports['default']; +},{"bowser":19}],83:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +exports['default'] = function (_ref) { + var browser = _ref.browser; + var version = _ref.version; + var prefix = _ref.prefix; + + var prefixedKeyframes = 'keyframes'; + + if (browser === 'chrome' && version < 43 || (browser === 'safari' || browser === 'ios_saf') && version < 9 || browser === 'opera' && version < 30 || browser === 'android' && version <= 4.4 || browser === 'and_uc') { + prefixedKeyframes = prefix.css + prefixedKeyframes; + } + return prefixedKeyframes; +}; + +module.exports = exports['default']; +},{}],84:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +exports['default'] = function (property) { + var unprefixed = property.replace(/^(ms|Webkit|Moz|O)/, ''); + return unprefixed.charAt(0).toLowerCase() + unprefixed.slice(1); +}; + +module.exports = exports['default']; +},{}],85:[function(require,module,exports){ +(function (process){ +/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +'use strict'; + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var invariant = function(condition, format, a, b, c, d, e, f) { + if (process.env.NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +}; + +module.exports = invariant; + +}).call(this,require('_process')) + +},{"_process":288}],86:[function(require,module,exports){ +/*! + * jQuery JavaScript Library v2.2.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:23Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var arr = []; + +var document = window.document; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "2.2.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isPlainObject: function( obj ) { + var key; + + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf( "use strict" ) === 1 ) { + script = document.createElement( "script" ); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + + // Inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + register: function( owner, initial ) { + var value = initial || {}; + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty( owner, this.expando, { + value: value, + writable: true, + configurable: true + } ); + } + return owner[ this.expando ]; + }, + cache: function( owner ) { + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( !acceptData( owner ) ) { + return {}; + } + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + owner[ this.expando ] && owner[ this.expando ][ key ]; + }, + access: function( owner, key, value ) { + var stored; + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase( key ) ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key === undefined ) { + this.register( owner ); + + } else { + + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data, camelKey; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // with the key as-is + data = dataUser.get( elem, key ) || + + // Try to find dashed key if it exists (gh-2779) + // This is for 2.2.x only + dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); + + if ( data !== undefined ) { + return data; + } + + camelKey = jQuery.camelCase( key ); + + // Attempt to get data from the cache + // with the key camelized + data = dataUser.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + camelKey = jQuery.camelCase( key ); + this.each( function() { + + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = dataUser.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + dataUser.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf( "-" ) > -1 && data !== undefined ) { + dataUser.set( this, key, value ); + } + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE9-11+ + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0-4.3, Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + + "screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "