diff --git a/.gitignore b/.gitignore index e2764155..ccc6d15f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,6 @@ logs/server.log .goreleaser.yml config.toml.backup /public/static/js/kickwebsocket.js.backup +/public/static/js/kickwebsocket-generated.js +clientAuth.txt dist \ No newline at end of file diff --git a/README.md b/README.md index a82e6459..1a67b46c 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,12 @@ Image of the frontend UI - [X] Global Rate Limiting for Upload/Download Speed - [X] Add torrents from watch folder (cron job every 5 minutes) + + - [X] Authentication from client to server (done via JWT, will add functionality for 3rd party clients later) + + - [X] Reverse Proxy Support with SSL upgrade added (with provided config for nginx) + + - [X] Mostly generated client config from toml.config on first run - [ ] Unit testing completed for a large portion of the package @@ -49,7 +55,6 @@ Image of the frontend UI - [ ] Ability to view TOML settings from WebUI (and perhaps change a few as well) - - [ ] Authentication from client to server - Late 2018 diff --git a/config.toml b/config.toml index 72bcdb96..3fc5d9d0 100644 --- a/config.toml +++ b/config.toml @@ -1,12 +1,12 @@ - [serverConfig] ServerPort = ":8000" #leave format as is it expects a string with colon ServerAddr = "" #blank will bind to default IP address, usually fine to leave be - LogLevel = "Warn" # Options = Debug, Info, Warn, Error, Fatal, Panic - LogOutput = "file" #Options = file, stdout #file will print it to logs/server.log + LogLevel = "Debug" # Options = Debug, Info, Warn, Error, Fatal, Panic + LogOutput = "stdout" #Options = file, stdout #file will print it to logs/server.log SeedRatioStop = 1.50 #automatically stops the torrent after it reaches this seeding ratio + #Relative or absolute path accepted, the server will convert any relative path to an absolute path. DefaultMoveFolder = 'downloaded' #default path that a finished torrent is symlinked to after completion. Torrents added via RSS will default here TorrentWatchFolder = 'torrentUpload' #folder path that is watched for .torrent files and adds them automatically every 5 minutes @@ -17,18 +17,30 @@ DownloadRateLimit = "Unlimited" + [notifications] PushBulletToken = "" #add your pushbullet api token here to notify of torrent completion to pushbullet +[goTorrentWebUI] + #Here you can set a basic HTTP login set of credentials + WebUIAuth = true # bool, if false no authentication is required for the webUI + WebUIUser = "admin" + WebUIPassword = "Password" + + +[reverseProxy] + #This is for setting up goTorrent behind a reverse Proxy (with SSL, reverse proxy with no SSL will require editing the WSS connection to a WS connection manually) + ProxyEnabled = false #bool, either false or true + BaseURL = "yoursubdomain.domain.org/subroute/" # MUST be in the format (if you have a subdomain, and must have trailing slash) "yoursubdomain.domain.org/subroute/" + [EncryptionPolicy] DisableEncryption = false ForceEncryption = false PreferNoEncryption = true - [torrentClientConfig] DownloadDir = 'downloading' #the full OR relative path where the torrent server stores in-progress torrents @@ -37,6 +49,9 @@ # Never send chunks to peers. NoUpload = false #boolean + #User-provided Client peer ID. If not present, one is generated automatically. + PeerID = "" #string + #The address to listen for new uTP and TCP bittorrent protocol connections. DHT shares a UDP socket with uTP unless configured otherwise. ListenAddr = "" #Leave Blank for default, syntax "HOST:PORT" @@ -48,9 +63,6 @@ # Don't create a DHT. NoDHT = false #boolean - #User-provided Client peer ID. If not present, one is generated automatically. - PeerID = "" #string - #For the bittorrent protocol. DisableUTP = false #bool diff --git a/dist-specific-files/Linux-systemd/ReverseProxy/nginx.conf b/dist-specific-files/Linux-systemd/ReverseProxy/nginx.conf new file mode 100644 index 00000000..fc83cf38 --- /dev/null +++ b/dist-specific-files/Linux-systemd/ReverseProxy/nginx.conf @@ -0,0 +1,12 @@ +location ^~ /gotorrent/ { + proxy_pass http://192.168.1.100:8000/; + proxy_redirect http:// https://; + proxy_pass_header Server; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $http_address; + proxy_set_header X-Scheme $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + +} diff --git a/engine/authentication_helper.go b/engine/authentication_helper.go new file mode 100644 index 00000000..a39b1889 --- /dev/null +++ b/engine/authentication_helper.go @@ -0,0 +1,60 @@ +package engine + +import ( + "crypto/rand" + "math/big" + + "github.com/dgrijalva/jwt-go" + "github.com/sirupsen/logrus" +) + +type AuthRequest struct { + MessageType string `json:"MessageType"` + AuthString string `json:"AuthString"` +} + +//GoTorrentClaims stores the name of the client (usually user entered) and any standard jwt claims we want to define +type GoTorrentClaims struct { + ClientName string `json:"clientName"` + jwt.StandardClaims +} + +//GenerateToken creates a signed token for a client to use to communicate with the server +func GenerateToken(claims GoTorrentClaims, signingKey []byte) string { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + signedString, err := token.SignedString(signingKey) + if err != nil { + Logger.WithFields(logrus.Fields{"error": err}).Fatal("Error signing authentication Token!") + } + return signedString + +} + +//GenerateSigningKey creates a random key that will be used for JSON Web Token authentication +func GenerateSigningKey() []byte { + keyString, err := generateRandomASCIIString(24) + key := []byte(keyString) + if err != nil { + Logger.WithFields(logrus.Fields{"error": err}).Fatal("Error generating signing key!") + } + return key +} + +func generateRandomASCIIString(length int) (string, error) { + result := "" + for { + if len(result) >= length { + return result, nil + } + num, err := rand.Int(rand.Reader, big.NewInt(int64(127))) + if err != nil { + return "", err + } + n := num.Int64() + // Make sure that the number/byte/letter is inside + // the range of printable ASCII characters (excluding space and DEL) + if n > 32 && n < 127 { + result += string(n) + } + } +} diff --git a/engine/clientConnectGenerate.go b/engine/clientConnectGenerate.go new file mode 100644 index 00000000..db7870fa --- /dev/null +++ b/engine/clientConnectGenerate.go @@ -0,0 +1,50 @@ +package engine + +import ( + "io/ioutil" + "os" +) + +var ( + baseFile = ` + var authMessage = { + MessageType: "authRequest", + Payload: [ClientAuthString] + } + + var kickStart = { + MessageType: "torrentListRequest" + } + + ws.onopen = function() + { + ws.send(JSON.stringify(authMessage)); + console.log("Sending authentication message...", JSON.stringify(authMessage)) + ws.send(JSON.stringify(kickStart)); //sending out the first ping + console.log("Kicking off websocket to server.....", JSON.stringify(kickStart)) + };` +) + +//GenerateClientConfigFile runs at first run (no db client detected) to generate a js file for connecting +func GenerateClientConfigFile(config FullClientSettings, authString string) { + os.Remove("public/static/js/kickwebsocket-generated.js") + var clientFile string + if config.UseProxy { + clientFile = ` + ClientAuthString = "` + authString + `" + + var ws = new WebSocket("wss://` + config.BaseURL + `websocket") + ` + baseFile + } else { + clientFile = ` + IP = "` + config.HTTPAddrIP + `" + Port = "` + config.WebsocketClientPort + `" + ClientAuthString = "` + authString + `" + + var ws = new WebSocket(` + "`" + `ws://${IP}:${Port}/websocket` + "`" + `); //creating websocket + ` + baseFile + + } + clientFileBytes := []byte(clientFile) + ioutil.WriteFile("public/static/js/kickwebsocket-generated.js", clientFileBytes, 0755) +} diff --git a/engine/clientStructs.go b/engine/clientStructs.go index 60c3b2e0..1c87a0df 100644 --- a/engine/clientStructs.go +++ b/engine/clientStructs.go @@ -41,7 +41,7 @@ type RSSFeedsNames struct { } //TorrentList struct contains the torrent list that is sent to the client -type TorrentList struct { //helps create the JSON structure that react expects to recieve +type TorrentList struct { //helps create the JSON structure that react expects to receive MessageType string `json:"MessageType"` Totaltorrents int `json:"total"` ClientDBstruct []ClientDB `json:"data"` diff --git a/engine/settings.go b/engine/settings.go index f87b8c85..38371c6b 100644 --- a/engine/settings.go +++ b/engine/settings.go @@ -3,6 +3,7 @@ package engine import ( "fmt" "path/filepath" + "strings" "golang.org/x/time/rate" @@ -14,16 +15,20 @@ import ( //FullClientSettings contains all of the settings for our entire application type FullClientSettings struct { - LoggingLevel logrus.Level - LoggingOutput string - HTTPAddr string - Version int - TorrentConfig torrent.Config - TFileUploadFolder string - SeedRatioStop float64 - PushBulletToken string - DefaultMoveFolder string - TorrentWatchFolder string + LoggingLevel logrus.Level + LoggingOutput string + HTTPAddr string + HTTPAddrIP string + UseProxy bool + WebsocketClientPort string + BaseURL string + Version int + TorrentConfig torrent.Config + TFileUploadFolder string + SeedRatioStop float64 + PushBulletToken string + DefaultMoveFolder string + TorrentWatchFolder string } //default is called if there is a parsing error @@ -98,9 +103,17 @@ func FullClientSettingsNew() FullClientSettings { } var httpAddr string + var baseURL string + var websocketClientPort string httpAddrIP := viper.GetString("serverConfig.ServerAddr") httpAddrPort := viper.GetString("serverConfig.ServerPort") + proxySet := viper.GetBool("reverseProxy.ProxyEnabled") + websocketClientPort = strings.TrimLeft(viper.GetString("serverConfig.ServerPort"), ":") //Trimming off the colon in front of the port + if proxySet { + baseURL = viper.GetString("reverseProxy.BaseURL") + fmt.Println("WebsocketClientPort", viper.GetString("serverConfig.ServerPort")) + } seedRatioStop := viper.GetFloat64("serverConfig.SeedRatioStop") httpAddr = httpAddrIP + httpAddrPort pushBulletToken := viper.GetString("notifications.PushBulletToken") @@ -192,15 +205,19 @@ func FullClientSettingsNew() FullClientSettings { } Config := FullClientSettings{ - LoggingLevel: logLevel, - LoggingOutput: logOutput, - SeedRatioStop: seedRatioStop, - HTTPAddr: httpAddr, - TorrentConfig: tConfig, - TFileUploadFolder: "uploadedTorrents", - PushBulletToken: pushBulletToken, - DefaultMoveFolder: defaultMoveFolderAbs, - TorrentWatchFolder: torrentWatchFolderAbs, + LoggingLevel: logLevel, + LoggingOutput: logOutput, + SeedRatioStop: seedRatioStop, + HTTPAddr: httpAddr, + HTTPAddrIP: httpAddrIP, + UseProxy: proxySet, + WebsocketClientPort: websocketClientPort, + TorrentConfig: tConfig, + BaseURL: baseURL, + TFileUploadFolder: "uploadedTorrents", + PushBulletToken: pushBulletToken, + DefaultMoveFolder: defaultMoveFolderAbs, + TorrentWatchFolder: torrentWatchFolderAbs, } return Config diff --git a/goTorrentWebUI/src/app.jsx b/goTorrentWebUI/src/app.jsx index e87885a9..fc6b9b9a 100644 --- a/goTorrentWebUI/src/app.jsx +++ b/goTorrentWebUI/src/app.jsx @@ -18,6 +18,8 @@ import LeftMenu from './leftMenu/leftMenu'; import TorrentList from './torrentlist'; //Notification Element import Notifications from './notifications'; +//Login Box +import Login from './login'; @@ -65,6 +67,7 @@ class BasicLayout extends React.PureComponent { render() { return [ + , , diff --git a/goTorrentWebUI/src/login.js b/goTorrentWebUI/src/login.js new file mode 100644 index 00000000..a28ad67a --- /dev/null +++ b/goTorrentWebUI/src/login.js @@ -0,0 +1,113 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import Button from 'material-ui/Button'; +import TextField from 'material-ui/TextField'; +import { withStyles } from 'material-ui/styles'; +import PropTypes from 'prop-types'; +import Dialog, { + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, +} from 'material-ui/Dialog'; +import InsertLinkIcon from 'material-ui-icons/Link'; +import ReactTooltip from 'react-tooltip' +import Icon from 'material-ui/Icon'; +import IconButton from 'material-ui/IconButton'; + + +let Loggedin = false + +const button = { + fontSize: '60px', + marginRight: '20px', +} + +const inlineStyle = { + display: 'inline-block', + backdrop: 'static', +} + +const errorStyle = { + color: 'red', +} + +export default class Login extends React.Component { + + state = { + open: false, + username: "", + password: "", + wrongPasswordMessage: "", + + }; + + + componentWillMount = () => { + if ((LoginRequired) && (Loggedin == false)) { + this.setState({open: true}) + Loggedin = true + } + } + + handleSubmit = () => { + //this.setState({ open: false }); + //let magnetLinkSubmit = this.state.textValue; + console.log("Attempting authentication") + if ((this.state.username == ClientUsername) && (this.state.password == ClientPassword)) { + this.setState({ open: false, username: "", password: "" }); + } else { + this.setState({wrongPasswordMessage: "Wrong Username/Password!", username: "", password: "" }) + } + //this.setState({magnetLinkValue: ""}, {torrentLabel: ""}, {storageValue: ``}) + } + + handleRequestClose = () => { + ws.close() + } + + setUserNameValue = (event) => { + this.setState({username: event.target.value}); + } + + setPasswordValue = (event) => { + this.setState({password: event.target.value}) + } + + render() { + const { classes, onRequestClose, handleRequestClose, handleSubmit } = this.props; + return ( + + Login Here + + + Enter a username and password to connect + +
+ + {this.state.wrongPasswordMessage} + + + +
+ + + + +
+ ); + } +}; diff --git a/main.go b/main.go index c8c88800..ac68ae74 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,6 @@ import ( "fmt" "html/template" "io/ioutil" - "net/http" "os" "path/filepath" @@ -18,6 +17,8 @@ import ( "github.com/asdine/storm" Engine "github.com/deranjer/goTorrent/engine" Storage "github.com/deranjer/goTorrent/storage" + jwt "github.com/dgrijalva/jwt-go" + "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/gorilla/websocket" "github.com/mmcdole/gofeed" @@ -35,8 +36,9 @@ type SingleRSSFeedMessage struct { //TODO had issues with getting this to work w var ( //Logger does logging for the entire project - Logger = logrus.New() - APP_ID = os.Getenv("APP_ID") + Logger = logrus.New() + Authenticated = false //to verify if user is authenticated, this is stored here + APP_ID = os.Getenv("APP_ID") ) var upgrader = websocket.Upgrader{ @@ -49,6 +51,34 @@ func serveHome(w http.ResponseWriter, r *http.Request) { s1.ExecuteTemplate(w, "base", map[string]string{"APP_ID": APP_ID}) } +func handleAuthentication(conn *websocket.Conn, db *storm.DB) { + msg := Engine.Message{} + err := conn.ReadJSON(&msg) + if err != nil { + Logger.WithFields(logrus.Fields{"error": err, "SuppliedToken": msg.Payload[0]}).Error("Unable to read authentication message") + } + authString := msg.Payload[0] //First element will be the auth request + fmt.Println("Authstring", authString) + signingKeyStruct := Storage.FetchJWTTokens(db) + singingKey := signingKeyStruct.SigningKey + token, err := jwt.Parse(authString, func(token *jwt.Token) (interface{}, error) { + if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { + return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) + } + return singingKey, nil + }) + if err != nil { + Logger.WithFields(logrus.Fields{"error": err, "SuppliedToken": token}).Error("Unable to parse token!") + conn.Close() + } + if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { + fmt.Println("Claims", claims["ClientName"], claims["Issuer"]) + Authenticated = true + } else { + Logger.WithFields(logrus.Fields{"error": err}).Error("Authentication Error occured, cannot complete!") + } +} + func main() { Engine.Logger = Logger //Injecting the logger into all the packages Storage.Logger = Logger @@ -92,6 +122,34 @@ func main() { } defer db.Close() //defering closing the database until the program closes + tokens := Storage.IssuedTokensList{} //if first run setting up the authentication tokens + err = db.One("ID", 3, &tokens) + if err != nil { + Logger.WithFields(logrus.Fields{"RSSFeedStore": tokens, "error": err}).Info("No Tokens database found, assuming first run, generating token...") + fmt.Println("Error", err) + fmt.Println("MAIN TOKEN: %+v\n", tokens) + tokens.ID = 3 //creating the initial store + claims := Engine.GoTorrentClaims{ + "goTorrentWebUI", + jwt.StandardClaims{ + Issuer: "goTorrentServer", + }, + } + signingkey := Engine.GenerateSigningKey() //Running this will invalidate any certs you already issued!! + fmt.Println("SigningKey", signingkey) + authString := Engine.GenerateToken(claims, signingkey) + tokens.SigningKey = signingkey + fmt.Println("ClientToken: ", authString) + Engine.GenerateClientConfigFile(Config, authString) //if first run generate the client config file + + tokens.TokenNames = append(tokens.TokenNames, Storage.SingleToken{"firstClient"}) + err := ioutil.WriteFile("clientAuth.txt", []byte(authString), 0755) + if err != nil { + Logger.WithFields(logrus.Fields{"error": err}).Warn("Unable to write client auth to file..") + } + db.Save(&tokens) //Writing all of that to the database + } + cronEngine := Engine.InitializeCronEngine() //Starting the cron engine for tasks Logger.Debug("Cron Engine Initialized...") @@ -112,11 +170,13 @@ func main() { Engine.CheckTorrentWatchFolder(cronEngine, db, tclient, torrentLocalStorage, Config) Engine.RefreshRSSCron(cronEngine, db, tclient, torrentLocalStorage, Config) // Refresing the RSS feeds on an hourly basis to add torrents that show up in the RSS feed - router := mux.NewRouter() //setting up the handler for the web backend + router := mux.NewRouter() //setting up the handler for the web backend + //reverseProxy := handlers.ProxyHeaders(router) //handlers.ProxyHeaders(router) //TODO pull this from the config file router.HandleFunc("/", serveHome) //Serving the main page for our SPA - http.Handle("/static/", http.FileServer(http.Dir("public"))) + //http.Handle("/static/", http.FileServer(http.Dir("public"))) + router.PathPrefix("/static/").Handler(http.FileServer(http.Dir("public"))) http.Handle("/", router) - http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { //exposing the data to the + router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { //exposing the data to the TorrentLocalArray = Storage.FetchAllStoredTorrents(db) RunningTorrentArray = Engine.CreateRunningTorrentArray(tclient, TorrentLocalArray, PreviousTorrentArray, Config, db) //Updates the RunningTorrentArray with the current client data as well var torrentlistArray = new(Engine.TorrentList) @@ -127,15 +187,21 @@ func main() { w.Header().Set("Content-Type", "application/json") w.Write(torrentlistArrayJSON) }) - http.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) { //websocket is the main data pipe to the frontend + + router.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) { //websocket is the main data pipe to the frontend conn, err := upgrader.Upgrade(w, r, nil) defer conn.Close() //defer closing the websocket until done. if err != nil { Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to create websocket!") return } - Engine.Conn = conn //Injecting the conn variable into the other packages - Storage.Conn = conn + if Authenticated != true { + handleAuthentication(conn, db) + } else { //If we are authenticated inject the connection into the other packages + fmt.Println("Authenticated... continue") + Engine.Conn = conn + Storage.Conn = conn + } MessageLoop: //Tagging this so we can continue out of it with any errors we encounter that are failing for { runningTorrents := tclient.Torrents() //getting running torrents here since multiple cases ask for the running torrents @@ -148,6 +214,13 @@ func main() { } Logger.WithFields(logrus.Fields{"message": msg}).Debug("Message From Client") switch msg.MessageType { //first handling data requests + case "authRequest": + if Authenticated { + Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client already authenticated... skipping authentication method") + } else { + handleAuthentication(conn, db) + } + case "torrentListRequest": Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client Requested TorrentList Update") TorrentLocalArray = Storage.FetchAllStoredTorrents(db) //Required to re-read th database since we write to the DB and this will pull the changes from it @@ -491,9 +564,15 @@ func main() { } }) - if err := http.ListenAndServe(httpAddr, nil); err != nil { - Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server!") + if Config.UseProxy { + err := http.ListenAndServe(httpAddr, handlers.ProxyHeaders(router)) + if err != nil { + Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server!") + } } else { - fmt.Println("Server started on:", httpAddr) + err := http.ListenAndServe(httpAddr, nil) //Can't send proxy headers if not used since that can be a security issue + if err != nil { + Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server with no proxy headers!") + } } } diff --git a/public/static/js/bundle.js b/public/static/js/bundle.js index 10538700..8ea8a00e 100644 --- a/public/static/js/bundle.js +++ b/public/static/js/bundle.js @@ -365,7 +365,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.sheetsManager = undefined; -var _keys = __webpack_require__(32); +var _keys = __webpack_require__(34); var _keys2 = _interopRequireDefault(_keys); @@ -433,7 +433,7 @@ var _contextTypes = __webpack_require__(486); var _contextTypes2 = _interopRequireDefault(_contextTypes); -var _jss = __webpack_require__(131); +var _jss = __webpack_require__(132); var _jssPresetDefault = __webpack_require__(250); @@ -443,11 +443,11 @@ var _ns = __webpack_require__(251); var ns = _interopRequireWildcard(_ns); -var _createMuiTheme = __webpack_require__(137); +var _createMuiTheme = __webpack_require__(138); var _createMuiTheme2 = _interopRequireDefault(_createMuiTheme); -var _themeListener = __webpack_require__(130); +var _themeListener = __webpack_require__(131); var _themeListener2 = _interopRequireDefault(_themeListener); @@ -792,7 +792,7 @@ exports.default = withStyles; exports.__esModule = true; -var _defineProperty = __webpack_require__(120); +var _defineProperty = __webpack_require__(121); var _defineProperty2 = _interopRequireDefault(_defineProperty); @@ -944,7 +944,7 @@ exports.default = function (instance, Constructor) { exports.__esModule = true; -var _defineProperty = __webpack_require__(120); +var _defineProperty = __webpack_require__(121); var _defineProperty2 = _interopRequireDefault(_defineProperty); @@ -1377,6 +1377,55 @@ var WEBSOCKET_STATE = exports.WEBSOCKET_STATE = 'WEBSOCKET_STATE'; /***/ }), /* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MuiThemeProvider = __webpack_require__(426); + +Object.defineProperty(exports, 'MuiThemeProvider', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_MuiThemeProvider).default; + } +}); + +var _withStyles = __webpack_require__(5); + +Object.defineProperty(exports, 'withStyles', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_withStyles).default; + } +}); + +var _withTheme = __webpack_require__(68); + +Object.defineProperty(exports, 'withTheme', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_withTheme).default; + } +}); + +var _createMuiTheme = __webpack_require__(138); + +Object.defineProperty(exports, 'createMuiTheme', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_createMuiTheme).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 23 */ /***/ (function(module, exports) { var core = module.exports = { version: '2.5.1' }; @@ -1384,7 +1433,7 @@ if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef /***/ }), -/* 23 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1398,7 +1447,7 @@ var _typeof2 = __webpack_require__(80); var _typeof3 = _interopRequireDefault(_typeof2); -var _keys = __webpack_require__(32); +var _keys = __webpack_require__(34); var _keys2 = _interopRequireDefault(_keys); @@ -1479,7 +1528,7 @@ function createChainedFunction() { /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }), -/* 24 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1501,63 +1550,49 @@ var babelPluginFlowReactPropTypes_proptype_TransitionClasses = { exitActive: __webpack_require__(0).string }; -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _MuiThemeProvider = __webpack_require__(426); - -Object.defineProperty(exports, 'MuiThemeProvider', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_MuiThemeProvider).default; - } -}); - -var _withStyles = __webpack_require__(5); - -Object.defineProperty(exports, 'withStyles', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_withStyles).default; - } -}); - -var _withTheme = __webpack_require__(68); - -Object.defineProperty(exports, 'withTheme', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_withTheme).default; - } -}); - -var _createMuiTheme = __webpack_require__(137); - -Object.defineProperty(exports, 'createMuiTheme', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_createMuiTheme).default; - } -}); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { +/* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +if (process.env.NODE_ENV !== 'production') { + var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' && + Symbol.for && + Symbol.for('react.element')) || + 0xeac7; + + var isValidElement = function(object) { + return typeof object === 'object' && + object !== null && + object.$$typeof === REACT_ELEMENT_TYPE; + }; + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = __webpack_require__(357)(isValidElement, throwOnDirectAccess); +} else { + // By explicitly using `prop-types` you are opting into new production behavior. + // http://fb.me/prop-types-in-prod + module.exports = __webpack_require__(360)(); +} + +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + var global = __webpack_require__(36); -var core = __webpack_require__(22); +var core = __webpack_require__(23); var ctx = __webpack_require__(49); -var hide = __webpack_require__(45); +var hide = __webpack_require__(46); var PROTOTYPE = 'prototype'; var $export = function (type, name, source) { @@ -1618,7 +1653,7 @@ module.exports = $export; /***/ }), -/* 27 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -1672,62 +1707,10 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! }()); -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(process) {/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -if (process.env.NODE_ENV !== 'production') { - var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' && - Symbol.for && - Symbol.for('react.element')) || - 0xeac7; - - var isValidElement = function(object) { - return typeof object === 'object' && - object !== null && - object.$$typeof === REACT_ELEMENT_TYPE; - }; - - // By explicitly using `prop-types` you are opting into new development behavior. - // http://fb.me/prop-types-in-prod - var throwOnDirectAccess = true; - module.exports = __webpack_require__(357)(isValidElement, throwOnDirectAccess); -} else { - // By explicitly using `prop-types` you are opting into new production behavior. - // http://fb.me/prop-types-in-prod - module.exports = __webpack_require__(360)(); -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) - /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { -var store = __webpack_require__(117)('wks'); -var uid = __webpack_require__(78); -var Symbol = __webpack_require__(36).Symbol; -var USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function (name) { - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; @@ -1747,35 +1730,24 @@ Object.defineProperty(exports, 'default', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 31 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { -var anObject = __webpack_require__(50); -var IE8_DOM_DEFINE = __webpack_require__(217); -var toPrimitive = __webpack_require__(111); -var dP = Object.defineProperty; +var store = __webpack_require__(118)('wks'); +var uid = __webpack_require__(78); +var Symbol = __webpack_require__(36).Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; -exports.f = __webpack_require__(37) ? Object.defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return dP(O, P, Attributes); - } catch (e) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); }; +$exports.store = store; + /***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(464), __esModule: true }; - -/***/ }), -/* 33 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1797,7 +1769,7 @@ Object.defineProperty(exports, 'default', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 34 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1818,6 +1790,34 @@ Object.defineProperty(exports, 'default', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(50); +var IE8_DOM_DEFINE = __webpack_require__(217); +var toPrimitive = __webpack_require__(112); +var dP = Object.defineProperty; + +exports.f = __webpack_require__(37) ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = { "default": __webpack_require__(464), __esModule: true }; + /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { @@ -1837,7 +1837,7 @@ var _Const = __webpack_require__(18); var _Const2 = _interopRequireDefault(_Const); -var _classnames = __webpack_require__(27); +var _classnames = __webpack_require__(28); var _classnames2 = _interopRequireDefault(_classnames); @@ -2003,6 +2003,28 @@ module.exports = !__webpack_require__(51)(function () { /* 38 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _TextField = __webpack_require__(540); + +Object.defineProperty(exports, 'default', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_TextField).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /* WEBPACK VAR INJECTION */(function(process) { @@ -2041,98 +2063,6 @@ var pure = function pure(BaseComponent) { exports.default = pure; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.keys = undefined; - -var _extends2 = __webpack_require__(3); - -var _extends3 = _interopRequireDefault(_extends2); - -var _objectWithoutProperties2 = __webpack_require__(4); - -var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); - -exports.default = createBreakpoints; - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var babelPluginFlowReactPropTypes_proptype_Breakpoint = __webpack_require__(0).oneOf(['xs', 'sm', 'md', 'lg', 'xl']); - -// Sorted ASC by size. That's important. -// It can't be configured as it's used statically for propTypes. -var keys = exports.keys = ['xs', 'sm', 'md', 'lg', 'xl']; - -// Keep in mind that @media is inclusive by the CSS specification. -function createBreakpoints(breakpoints) { - var _breakpoints$values = breakpoints.values, - values = _breakpoints$values === undefined ? { - xs: 360, - sm: 600, - md: 960, - lg: 1280, - xl: 1920 - } : _breakpoints$values, - _breakpoints$unit = breakpoints.unit, - unit = _breakpoints$unit === undefined ? 'px' : _breakpoints$unit, - _breakpoints$step = breakpoints.step, - step = _breakpoints$step === undefined ? 5 : _breakpoints$step, - other = (0, _objectWithoutProperties3.default)(breakpoints, ['values', 'unit', 'step']); - - - function up(key) { - var value = void 0; - // min-width of xs starts at 0 - if (key === 'xs') { - value = 0; - } else { - value = values[key] || key; - } - return '@media (min-width:' + value + unit + ')'; - } - - function down(key) { - var value = values[key] || key; - return '@media (max-width:' + (value - step / 100) + unit + ')'; - } - - function between(start, end) { - var startIndex = keys.indexOf(start); - var endIndex = keys.indexOf(end); - return '@media (min-width:' + values[keys[startIndex]] + unit + ') and ' + ('(max-width:' + (values[keys[endIndex + 1]] - step / 100) + unit + ')'); - } - - function only(key) { - var keyIndex = keys.indexOf(key); - if (keyIndex === keys.length - 1) { - return up(key); - } - return between(key, key); - } - - function width(key) { - return values[key]; - } - - return (0, _extends3.default)({ - keys: keys, - values: values, - up: up, - down: down, - between: between, - only: only, - width: width - }, other); -} - /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { @@ -2140,301 +2070,6 @@ function createBreakpoints(breakpoints) { "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _TextField = __webpack_require__(540); - -Object.defineProperty(exports, 'default', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_TextField).default; - } -}); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _getPrototypeOf = __webpack_require__(9); - -var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); - -var _classCallCheck2 = __webpack_require__(10); - -var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); - -var _createClass2 = __webpack_require__(11); - -var _createClass3 = _interopRequireDefault(_createClass2); - -var _possibleConstructorReturn2 = __webpack_require__(12); - -var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); - -var _inherits2 = __webpack_require__(13); - -var _inherits3 = _interopRequireDefault(_inherits2); - -var _typeof2 = __webpack_require__(80); - -var _typeof3 = _interopRequireDefault(_typeof2); - -var _keys = __webpack_require__(32); - -var _keys2 = _interopRequireDefault(_keys); - -var _objectWithoutProperties2 = __webpack_require__(4); - -var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); - -var _assign = __webpack_require__(215); - -var _assign2 = _interopRequireDefault(_assign); - -exports.withOptions = withOptions; - -var _react = __webpack_require__(1); - -var _propTypes = __webpack_require__(0); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _shallowEqual = __webpack_require__(261); - -var _shallowEqual2 = _interopRequireDefault(_shallowEqual); - -var _warning = __webpack_require__(16); - -var _warning2 = _interopRequireDefault(_warning); - -var _supports = __webpack_require__(550); - -var supports = _interopRequireWildcard(_supports); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var defaultEventOptions = { - capture: false, - passive: false -}; -/* eslint-disable prefer-spread */ - -function mergeDefaultEventOptions(options) { - return (0, _assign2.default)({}, defaultEventOptions, options); -} - -function getEventListenerArgs(eventName, callback, options) { - var args = [eventName, callback]; - args.push(supports.passiveOption ? options : options.capture); - return args; -} - -function on(target, eventName, callback, options) { - if (supports.addEventListener) { - target.addEventListener.apply(target, getEventListenerArgs(eventName, callback, options)); - } else if (supports.attachEvent) { - // IE8+ Support - target.attachEvent('on' + eventName, function () { - callback.call(target); - }); - } -} - -function off(target, eventName, callback, options) { - if (supports.removeEventListener) { - target.removeEventListener.apply(target, getEventListenerArgs(eventName, callback, options)); - } else if (supports.detachEvent) { - // IE8+ Support - target.detachEvent('on' + eventName, callback); - } -} - -function forEachListener(props, iteratee) { - var children = props.children, - target = props.target, - eventProps = (0, _objectWithoutProperties3.default)(props, ['children', 'target']); - - - (0, _keys2.default)(eventProps).forEach(function (name) { - if (name.substring(0, 2) !== 'on') { - return; - } - - var prop = eventProps[name]; - var type = typeof prop === 'undefined' ? 'undefined' : (0, _typeof3.default)(prop); - var isObject = type === 'object'; - var isFunction = type === 'function'; - - if (!isObject && !isFunction) { - return; - } - - var capture = name.substr(-7).toLowerCase() === 'capture'; - var eventName = name.substring(2).toLowerCase(); - eventName = capture ? eventName.substring(0, eventName.length - 7) : eventName; - - if (isObject) { - iteratee(eventName, prop.handler, prop.options); - } else { - iteratee(eventName, prop, mergeDefaultEventOptions({ capture: capture })); - } - }); -} - -function withOptions(handler, options) { - process.env.NODE_ENV !== "production" ? (0, _warning2.default)(options, 'react-event-listener: Should be specified options in withOptions.') : void 0; - - return { - handler: handler, - options: mergeDefaultEventOptions(options) - }; -} - -var EventListener = function (_Component) { - (0, _inherits3.default)(EventListener, _Component); - - function EventListener() { - (0, _classCallCheck3.default)(this, EventListener); - return (0, _possibleConstructorReturn3.default)(this, (EventListener.__proto__ || (0, _getPrototypeOf2.default)(EventListener)).apply(this, arguments)); - } - - (0, _createClass3.default)(EventListener, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.addListeners(); - } - }, { - key: 'shouldComponentUpdate', - value: function shouldComponentUpdate(nextProps) { - return !(0, _shallowEqual2.default)(this.props, nextProps); - } - }, { - key: 'componentWillUpdate', - value: function componentWillUpdate() { - this.removeListeners(); - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate() { - this.addListeners(); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.removeListeners(); - } - }, { - key: 'addListeners', - value: function addListeners() { - this.applyListeners(on); - } - }, { - key: 'removeListeners', - value: function removeListeners() { - this.applyListeners(off); - } - }, { - key: 'applyListeners', - value: function applyListeners(onOrOff) { - var target = this.props.target; - - - if (target) { - var element = target; - - if (typeof target === 'string') { - element = window[target]; - } - - forEachListener(this.props, onOrOff.bind(null, element)); - } - } - }, { - key: 'render', - value: function render() { - return this.props.children || null; - } - }]); - return EventListener; -}(_react.Component); - -EventListener.propTypes = process.env.NODE_ENV !== "production" ? { - /** - * You can provide a single child too. - */ - children: _propTypes2.default.element, - /** - * The DOM target to listen to. - */ - target: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.string]).isRequired -} : {}; -exports.default = EventListener; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _Typography = __webpack_require__(553); - -Object.defineProperty(exports, 'default', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_Typography).default; - } -}); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _Paper = __webpack_require__(569); - -Object.defineProperty(exports, 'default', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_Paper).default; - } -}); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - var _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; }; 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; }; }(); @@ -3029,30 +2664,328 @@ var ReactTooltip = (0, _staticMethods2.default)(_class = (0, _windowListener2.de module.exports = ReactTooltip; /***/ }), -/* 45 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { -var dP = __webpack_require__(31); -var createDesc = __webpack_require__(65); -module.exports = __webpack_require__(37) ? function (object, key, value) { - return dP.f(object, key, createDesc(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.keys = undefined; + +var _extends2 = __webpack_require__(3); + +var _extends3 = _interopRequireDefault(_extends2); + +var _objectWithoutProperties2 = __webpack_require__(4); + +var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); + +exports.default = createBreakpoints; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var babelPluginFlowReactPropTypes_proptype_Breakpoint = __webpack_require__(0).oneOf(['xs', 'sm', 'md', 'lg', 'xl']); + +// Sorted ASC by size. That's important. +// It can't be configured as it's used statically for propTypes. +var keys = exports.keys = ['xs', 'sm', 'md', 'lg', 'xl']; + +// Keep in mind that @media is inclusive by the CSS specification. +function createBreakpoints(breakpoints) { + var _breakpoints$values = breakpoints.values, + values = _breakpoints$values === undefined ? { + xs: 360, + sm: 600, + md: 960, + lg: 1280, + xl: 1920 + } : _breakpoints$values, + _breakpoints$unit = breakpoints.unit, + unit = _breakpoints$unit === undefined ? 'px' : _breakpoints$unit, + _breakpoints$step = breakpoints.step, + step = _breakpoints$step === undefined ? 5 : _breakpoints$step, + other = (0, _objectWithoutProperties3.default)(breakpoints, ['values', 'unit', 'step']); + + + function up(key) { + var value = void 0; + // min-width of xs starts at 0 + if (key === 'xs') { + value = 0; + } else { + value = values[key] || key; + } + return '@media (min-width:' + value + unit + ')'; + } + + function down(key) { + var value = values[key] || key; + return '@media (max-width:' + (value - step / 100) + unit + ')'; + } + + function between(start, end) { + var startIndex = keys.indexOf(start); + var endIndex = keys.indexOf(end); + return '@media (min-width:' + values[keys[startIndex]] + unit + ') and ' + ('(max-width:' + (values[keys[endIndex + 1]] - step / 100) + unit + ')'); + } + + function only(key) { + var keyIndex = keys.indexOf(key); + if (keyIndex === keys.length - 1) { + return up(key); + } + return between(key, key); + } + + function width(key) { + return values[key]; + } + + return (0, _extends3.default)({ + keys: keys, + values: values, + up: up, + down: down, + between: between, + only: only, + width: width + }, other); +} + /***/ }), -/* 46 */ -/***/ (function(module, exports) { +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _getPrototypeOf = __webpack_require__(9); + +var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); + +var _classCallCheck2 = __webpack_require__(10); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _createClass2 = __webpack_require__(11); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _possibleConstructorReturn2 = __webpack_require__(12); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _inherits2 = __webpack_require__(13); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _typeof2 = __webpack_require__(80); + +var _typeof3 = _interopRequireDefault(_typeof2); + +var _keys = __webpack_require__(34); + +var _keys2 = _interopRequireDefault(_keys); + +var _objectWithoutProperties2 = __webpack_require__(4); + +var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); + +var _assign = __webpack_require__(215); + +var _assign2 = _interopRequireDefault(_assign); + +exports.withOptions = withOptions; + +var _react = __webpack_require__(1); + +var _propTypes = __webpack_require__(0); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _shallowEqual = __webpack_require__(261); + +var _shallowEqual2 = _interopRequireDefault(_shallowEqual); + +var _warning = __webpack_require__(16); + +var _warning2 = _interopRequireDefault(_warning); + +var _supports = __webpack_require__(550); + +var supports = _interopRequireWildcard(_supports); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultEventOptions = { + capture: false, + passive: false }; +/* eslint-disable prefer-spread */ +function mergeDefaultEventOptions(options) { + return (0, _assign2.default)({}, defaultEventOptions, options); +} + +function getEventListenerArgs(eventName, callback, options) { + var args = [eventName, callback]; + args.push(supports.passiveOption ? options : options.capture); + return args; +} + +function on(target, eventName, callback, options) { + if (supports.addEventListener) { + target.addEventListener.apply(target, getEventListenerArgs(eventName, callback, options)); + } else if (supports.attachEvent) { + // IE8+ Support + target.attachEvent('on' + eventName, function () { + callback.call(target); + }); + } +} + +function off(target, eventName, callback, options) { + if (supports.removeEventListener) { + target.removeEventListener.apply(target, getEventListenerArgs(eventName, callback, options)); + } else if (supports.detachEvent) { + // IE8+ Support + target.detachEvent('on' + eventName, callback); + } +} + +function forEachListener(props, iteratee) { + var children = props.children, + target = props.target, + eventProps = (0, _objectWithoutProperties3.default)(props, ['children', 'target']); + + + (0, _keys2.default)(eventProps).forEach(function (name) { + if (name.substring(0, 2) !== 'on') { + return; + } + + var prop = eventProps[name]; + var type = typeof prop === 'undefined' ? 'undefined' : (0, _typeof3.default)(prop); + var isObject = type === 'object'; + var isFunction = type === 'function'; + + if (!isObject && !isFunction) { + return; + } + + var capture = name.substr(-7).toLowerCase() === 'capture'; + var eventName = name.substring(2).toLowerCase(); + eventName = capture ? eventName.substring(0, eventName.length - 7) : eventName; + + if (isObject) { + iteratee(eventName, prop.handler, prop.options); + } else { + iteratee(eventName, prop, mergeDefaultEventOptions({ capture: capture })); + } + }); +} + +function withOptions(handler, options) { + process.env.NODE_ENV !== "production" ? (0, _warning2.default)(options, 'react-event-listener: Should be specified options in withOptions.') : void 0; + + return { + handler: handler, + options: mergeDefaultEventOptions(options) + }; +} + +var EventListener = function (_Component) { + (0, _inherits3.default)(EventListener, _Component); + + function EventListener() { + (0, _classCallCheck3.default)(this, EventListener); + return (0, _possibleConstructorReturn3.default)(this, (EventListener.__proto__ || (0, _getPrototypeOf2.default)(EventListener)).apply(this, arguments)); + } + + (0, _createClass3.default)(EventListener, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.addListeners(); + } + }, { + key: 'shouldComponentUpdate', + value: function shouldComponentUpdate(nextProps) { + return !(0, _shallowEqual2.default)(this.props, nextProps); + } + }, { + key: 'componentWillUpdate', + value: function componentWillUpdate() { + this.removeListeners(); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + this.addListeners(); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this.removeListeners(); + } + }, { + key: 'addListeners', + value: function addListeners() { + this.applyListeners(on); + } + }, { + key: 'removeListeners', + value: function removeListeners() { + this.applyListeners(off); + } + }, { + key: 'applyListeners', + value: function applyListeners(onOrOff) { + var target = this.props.target; + + + if (target) { + var element = target; + + if (typeof target === 'string') { + element = window[target]; + } + + forEachListener(this.props, onOrOff.bind(null, element)); + } + } + }, { + key: 'render', + value: function render() { + return this.props.children || null; + } + }]); + return EventListener; +}(_react.Component); + +EventListener.propTypes = process.env.NODE_ENV !== "production" ? { + /** + * You can provide a single child too. + */ + children: _propTypes2.default.element, + /** + * The DOM target to listen to. + */ + target: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.string]).isRequired +} : {}; +exports.default = EventListener; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }), -/* 47 */ +/* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3062,19 +2995,41 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _ButtonBase = __webpack_require__(523); +var _Typography = __webpack_require__(553); Object.defineProperty(exports, 'default', { enumerable: true, get: function get() { - return _interopRequireDefault(_ButtonBase).default; + return _interopRequireDefault(_Typography).default; } }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 48 */ +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Paper = __webpack_require__(569); + +Object.defineProperty(exports, 'default', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_Paper).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3140,6 +3095,51 @@ Object.defineProperty(exports, 'withMobileDialog', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(33); +var createDesc = __webpack_require__(65); +module.exports = __webpack_require__(37) ? function (object, key, value) { + return dP.f(object, key, createDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), +/* 47 */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _ButtonBase = __webpack_require__(523); + +Object.defineProperty(exports, 'default', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_ButtonBase).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { @@ -3170,7 +3170,7 @@ module.exports = function (fn, that, length) { /* 50 */ /***/ (function(module, exports, __webpack_require__) { -var isObject = __webpack_require__(46); +var isObject = __webpack_require__(47); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; @@ -3217,7 +3217,7 @@ module.exports = exports['default']; /* 54 */ /***/ (function(module, exports, __webpack_require__) { -var isObject = __webpack_require__(142), +var isObject = __webpack_require__(143), now = __webpack_require__(542), toNumber = __webpack_require__(544); @@ -3482,8 +3482,8 @@ if (process.env.NODE_ENV !== 'production') { /***/ (function(module, exports, __webpack_require__) { // to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(112); -var defined = __webpack_require__(114); +var IObject = __webpack_require__(113); +var defined = __webpack_require__(115); module.exports = function (it) { return IObject(defined(it)); }; @@ -3494,7 +3494,7 @@ module.exports = function (it) { /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) -var defined = __webpack_require__(114); +var defined = __webpack_require__(115); module.exports = function (it) { return Object(defined(it)); }; @@ -3533,7 +3533,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.isNumber = exports.isString = exports.formatMs = exports.duration = exports.easing = undefined; -var _keys = __webpack_require__(32); +var _keys = __webpack_require__(34); var _keys2 = _interopRequireDefault(_keys); @@ -3938,7 +3938,7 @@ exports.synchronizeLayoutWithChildren = synchronizeLayoutWithChildren; exports.validateLayout = validateLayout; exports.autoBindHandlers = autoBindHandlers; -var _lodash = __webpack_require__(101); +var _lodash = __webpack_require__(102); var _lodash2 = _interopRequireDefault(_lodash); @@ -4441,7 +4441,7 @@ module.exports = function (bitmap, value) { // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = __webpack_require__(219); -var enumBugKeys = __webpack_require__(118); +var enumBugKeys = __webpack_require__(119); module.exports = Object.keys || function keys(O) { return $keys(O, enumBugKeys); @@ -4498,11 +4498,11 @@ var _wrapDisplayName = __webpack_require__(59); var _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName); -var _createMuiTheme = __webpack_require__(137); +var _createMuiTheme = __webpack_require__(138); var _createMuiTheme2 = _interopRequireDefault(_createMuiTheme); -var _themeListener = __webpack_require__(130); +var _themeListener = __webpack_require__(131); var _themeListener2 = _interopRequireDefault(_themeListener); @@ -4600,7 +4600,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _Input = __webpack_require__(141); +var _Input = __webpack_require__(142); Object.defineProperty(exports, 'default', { enumerable: true, @@ -9346,7 +9346,7 @@ exports.placeholder = placeholder; exports.cssFor = cssFor; exports.attribsFor = attribsFor; -var _objectAssign = __webpack_require__(95); +var _objectAssign = __webpack_require__(96); var _objectAssign2 = _interopRequireDefault(_objectAssign); @@ -10842,7 +10842,7 @@ function updateLink (link, options, obj) { /***/ (function(module, exports, __webpack_require__) { // 7.1.15 ToLength -var toInteger = __webpack_require__(115); +var toInteger = __webpack_require__(116); var min = Math.min; module.exports = function (it) { return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 @@ -10901,8 +10901,8 @@ exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.d // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = __webpack_require__(50); var dPs = __webpack_require__(440); -var enumBugKeys = __webpack_require__(118); -var IE_PROTO = __webpack_require__(116)('IE_PROTO'); +var enumBugKeys = __webpack_require__(119); +var IE_PROTO = __webpack_require__(117)('IE_PROTO'); var Empty = function () { /* empty */ }; var PROTOTYPE = 'prototype'; @@ -10945,9 +10945,9 @@ module.exports = Object.create || function create(O, Properties) { /* 82 */ /***/ (function(module, exports, __webpack_require__) { -var def = __webpack_require__(31).f; +var def = __webpack_require__(33).f; var has = __webpack_require__(52); -var TAG = __webpack_require__(29)('toStringTag'); +var TAG = __webpack_require__(30)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); @@ -11012,7 +11012,7 @@ var _linkRule = __webpack_require__(243); var _linkRule2 = _interopRequireDefault(_linkRule); -var _StyleRule = __webpack_require__(132); +var _StyleRule = __webpack_require__(133); var _StyleRule2 = _interopRequireDefault(_StyleRule); @@ -12223,6 +12223,49 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var SvgIconCustom = global.__MUI_SvgIcon__ || _SvgIcon2.default; +var _ref = _react2.default.createElement('path', { d: 'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z' }); + +var Link = function Link(props) { + return _react2.default.createElement( + SvgIconCustom, + props, + _ref + ); +}; + +Link = (0, _pure2.default)(Link); +Link.muiName = 'SvgIcon'; + +exports.default = Link; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) + +/***/ }), +/* 93 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = __webpack_require__(1); + +var _react2 = _interopRequireDefault(_react); + +var _pure = __webpack_require__(19); + +var _pure2 = _interopRequireDefault(_pure); + +var _SvgIcon = __webpack_require__(15); + +var _SvgIcon2 = _interopRequireDefault(_SvgIcon); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var SvgIconCustom = global.__MUI_SvgIcon__ || _SvgIcon2.default; + var _ref = _react2.default.createElement('circle', { cx: '6.18', cy: '17.82', r: '2.18' }); var _ref2 = _react2.default.createElement('path', { d: 'M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z' }); @@ -12243,7 +12286,7 @@ exports.default = RssFeed; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17))) /***/ }), -/* 93 */ +/* 94 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -12270,7 +12313,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(634); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__devexpress_dx_react_grid__ = __webpack_require__(70); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_material_ui_styles__ = __webpack_require__(25); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_material_ui_styles__ = __webpack_require__(22); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_material_ui_styles___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_material_ui_styles__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_material_ui__ = __webpack_require__(285); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_material_ui_List__ = __webpack_require__(63); @@ -12295,13 +12338,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15_material_ui_icons_List___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_15_material_ui_icons_List__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16_material_ui_icons_ExpandMore__ = __webpack_require__(728); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16_material_ui_icons_ExpandMore___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_16_material_ui_icons_ExpandMore__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton__ = __webpack_require__(30); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton__ = __webpack_require__(29); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18_material_ui_Table__ = __webpack_require__(297); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18_material_ui_Table___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_18_material_ui_Table__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19_material_ui_Toolbar__ = __webpack_require__(168); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19_material_ui_Toolbar___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_19_material_ui_Toolbar__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20_material_ui_Typography__ = __webpack_require__(42); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20_material_ui_Typography__ = __webpack_require__(43); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20_material_ui_Typography___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_20_material_ui_Typography__); /** * Bundle of @devexpress/dx-react-grid-material-ui @@ -15538,7 +15581,7 @@ var TableColumnResizing$1 = function (_React$PureComponent) { /***/ }), -/* 94 */ +/* 95 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15607,7 +15650,7 @@ module.exports = warning; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }), -/* 95 */ +/* 96 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15704,7 +15747,7 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) { /***/ }), -/* 96 */ +/* 97 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15759,48 +15802,6 @@ function defineStyle(props) { exports.default = style; -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - -function makeEmptyFunction(arg) { - return function () { - return arg; - }; -} - -/** - * This function accepts and discards inputs; it has no side effects. This is - * primarily useful idiomatically for overridable function endpoints which - * always need to be callable, since JS lacks a null-call idiom ala Cocoa. - */ -var emptyFunction = function emptyFunction() {}; - -emptyFunction.thatReturns = makeEmptyFunction; -emptyFunction.thatReturnsFalse = makeEmptyFunction(false); -emptyFunction.thatReturnsTrue = makeEmptyFunction(true); -emptyFunction.thatReturnsNull = makeEmptyFunction(null); -emptyFunction.thatReturnsThis = function () { - return this; -}; -emptyFunction.thatReturnsArgument = function (arg) { - return arg; -}; - -module.exports = emptyFunction; - /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { @@ -15847,6 +15848,48 @@ module.exports = emptyFunction; /* 99 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + */ + +function makeEmptyFunction(arg) { + return function () { + return arg; + }; +} + +/** + * This function accepts and discards inputs; it has no side effects. This is + * primarily useful idiomatically for overridable function endpoints which + * always need to be callable, since JS lacks a null-call idiom ala Cocoa. + */ +var emptyFunction = function emptyFunction() {}; + +emptyFunction.thatReturns = makeEmptyFunction; +emptyFunction.thatReturnsFalse = makeEmptyFunction(false); +emptyFunction.thatReturnsTrue = makeEmptyFunction(true); +emptyFunction.thatReturnsNull = makeEmptyFunction(null); +emptyFunction.thatReturnsThis = function () { + return this; +}; +emptyFunction.thatReturnsArgument = function (arg) { + return arg; +}; + +module.exports = emptyFunction; + +/***/ }), +/* 100 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /* WEBPACK VAR INJECTION */(function(process) {/** * Copyright (c) 2013-present, Facebook, Inc. @@ -15904,7 +15947,7 @@ module.exports = invariant; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }), -/* 100 */ +/* 101 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15923,7 +15966,7 @@ module.exports = ReactPropTypesSecret; /***/ }), -/* 101 */ +/* 102 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global, module) {/** @@ -17775,10 +17818,10 @@ function stubFalse() { module.exports = isEqual; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17), __webpack_require__(102)(module))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17), __webpack_require__(103)(module))) /***/ }), -/* 102 */ +/* 103 */ /***/ (function(module, exports) { module.exports = function(module) { @@ -17806,7 +17849,7 @@ module.exports = function(module) { /***/ }), -/* 103 */ +/* 104 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17847,70 +17890,70 @@ emptyFunction.thatReturnsArgument = function (arg) { module.exports = emptyFunction; -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) {/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * 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 validateFormat = function validateFormat(format) {}; - -if (process.env.NODE_ENV !== 'production') { - validateFormat = function validateFormat(format) { - if (format === undefined) { - throw new Error('invariant requires an error message argument'); - } - }; -} - -function invariant(condition, format, a, b, c, d, e, f) { - validateFormat(format); - - 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; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) - /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + + + +/** + * 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 validateFormat = function validateFormat(format) {}; + +if (process.env.NODE_ENV !== 'production') { + validateFormat = function validateFormat(format) { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + }; +} + +function invariant(condition, format, a, b, c, d, e, f) { + validateFormat(format); + + 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; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) + +/***/ }), +/* 106 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /** * Copyright (c) 2013-present, Facebook, Inc. @@ -17927,7 +17970,7 @@ module.exports = ReactPropTypesSecret; /***/ }), -/* 106 */ +/* 107 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -17969,7 +18012,7 @@ emptyFunction.thatReturnsArgument = function (arg) { module.exports = emptyFunction; /***/ }), -/* 107 */ +/* 108 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18029,7 +18072,7 @@ module.exports = invariant; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }), -/* 108 */ +/* 109 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -18048,7 +18091,7 @@ module.exports = ReactPropTypesSecret; /***/ }), -/* 109 */ +/* 110 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -18076,7 +18119,7 @@ function warning(message) { } /***/ }), -/* 110 */ +/* 111 */ /***/ (function(module, exports, __webpack_require__) { // style-loader: Adds some css to the DOM by adding a