Repository: zhangxin840/tomato5 Branch: master Commit: 8dfba19fb619 Files: 56 Total size: 267.0 KB Directory structure: gitextract_6_u3udeh/ ├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .firebaserc ├── .gitignore ├── LICENSE ├── README.md ├── build/ │ ├── build.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config/ │ ├── dev.env.js │ ├── index.js │ ├── prod.env.js │ └── test.env.js ├── dashboard.html ├── deploy.sh ├── firebase.json ├── index.html ├── package.json ├── src/ │ ├── App.vue │ ├── auth.js │ ├── base.scss │ ├── common.scss │ ├── components/ │ │ ├── Account.vue │ │ ├── ActiveTask.vue │ │ ├── Emotion.vue │ │ ├── Member.vue │ │ ├── Panel.vue │ │ ├── Task.vue │ │ ├── TeamPanel.vue │ │ └── Usage.vue │ ├── configs.js │ ├── dashboard.js │ ├── dataBase.js │ ├── database.js │ ├── index.js │ ├── index.scss │ ├── model.js │ ├── timer.js │ └── utils.js ├── static/ │ └── .gitkeep ├── test/ │ ├── e2e/ │ │ ├── custom-assertions/ │ │ │ └── elementCount.js │ │ ├── nightwatch.conf.js │ │ ├── runner.js │ │ └── specs/ │ │ └── test.js │ └── unit/ │ ├── .eslintrc │ ├── index.js │ ├── karma.conf.js │ └── specs/ │ └── Hello.spec.js └── vendors/ ├── firebase-ui-auth.css └── firebase-ui-auth.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .babelrc ================================================ { "presets": ["es2015", "stage-2"], "plugins": ["transform-runtime"], "comments": false } ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true ================================================ FILE: .eslintignore ================================================ build/*.js config/*.js vendors/*.js ================================================ FILE: .eslintrc.js ================================================ module.exports = { root: true, parserOptions: { sourceType: 'module' }, extends: 'airbnb-base', // required to lint *.vue files plugins: [ 'html' ], // add your custom rules here 'rules': { 'import/no-unresolved': 0, // allow debugger during development 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 } } ================================================ FILE: .firebaserc ================================================ { "projects": { "default": "tomato5-685bf" } } ================================================ FILE: .gitignore ================================================ .DS_Store node_modules/ dist/ npm-debug.log selenium-debug.log test/unit/coverage test/e2e/reports firebase-debug.log ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2016 Zhang Xin 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. ================================================ FILE: README.md ================================================ ![logo](http://tomato5.io/static/icons/logo.png) Tomato5 is a real-time collaboration tool. It combines Pomodoro Technique with a team status share board. Homepage: [http://tomato5.io](http://tomato5.io) ## Updates ### 1.3.0 - New feature: Show speech bubble in team board. ### 1.2.0 - New feature: Give thumbs up to team members. - New feature: Headline for team board. ## Features - Adapt to all kinds of screen sizes. - Real-time data sync. - Serverless architecture, powered by GCP and AWS. ## Responsive web design ![responsive](http://tomato5.io/static/promotions/responsive.gif) ## Serverless We build Tomato5 as the 'Serverless' architecture. All services run on the cloud, without any server of its own.   Front-end part of this system is just static files hosted on Google's CDN. The web app talks directly to the Realtime Database of Firebase. The whole account system, including login UI, is also provided by Firebase. With the full support of cloud services, we can build real-world products at lowest development costs, and get free from most of the maintaining works. ## Tech Stack - Responsive web design - ES6 - Vue - Webpack - Firebase - AWS Lambda ## The name Tomato5 - 5 minutes break after 25 minutes concentration - 5 tomatoes a day - 5 team members ## Real-time collaboration We believe that it is important for the team to share everyone's status. Traditional collaboration tools only tell the team what to achieve, without concern about individual's actual status. By showing what we are doing and thinking in real-time, we can express ourselves more adequately, be more connected to the team, and get more feedbacks on time. Real-time collaboration means to share the team status in real-time. Key points: - Concern about individuals - Expressional - Instant Feedbacks ## Develop ``` bash # Install dependencies npm install # Serve with hot reload at localhost:8080 npm run dev # Build for production npm run build # Deploy to Firebase bash deploy.sh ``` ================================================ FILE: build/build.js ================================================ // https://github.com/shelljs/shelljs require('shelljs/global') env.NODE_ENV = 'production' var path = require('path') var config = require('../config') var ora = require('ora') var webpack = require('webpack') var webpackConfig = require('./webpack.prod.conf') console.log( ' Tip:\n' + ' Built files are meant to be served over an HTTP server.\n' + ' Opening index.html over file:// won\'t work.\n' ) var spinner = ora('building for production...') spinner.start() var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory) rm('-rf', config.build.assetsRoot) // https://github.com/vuejs-templates/webpack/issues/362 mkdir('-p', assetsPath) cp('-R', 'static/', assetsPath) webpack(webpackConfig, function (err, stats) { spinner.stop() if (err) throw err process.stdout.write(stats.toString({ colors: true, modules: false, children: false, chunks: false, chunkModules: false }) + '\n') }) ================================================ FILE: build/dev-client.js ================================================ /* eslint-disable */ require('eventsource-polyfill') var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') hotClient.subscribe(function (event) { if (event.action === 'reload') { window.location.reload() } }) ================================================ FILE: build/dev-server.js ================================================ var path = require('path') var express = require('express') var webpack = require('webpack') var config = require('../config') var proxyMiddleware = require('http-proxy-middleware') var webpackConfig = process.env.NODE_ENV === 'testing' ? require('./webpack.prod.conf') : require('./webpack.dev.conf') // default port where dev server listens for incoming traffic var port = process.env.PORT || config.dev.port // Define HTTP proxies to your custom API backend // https://github.com/chimurai/http-proxy-middleware var proxyTable = config.dev.proxyTable var app = express() var compiler = webpack(webpackConfig) var devMiddleware = require('webpack-dev-middleware')(compiler, { publicPath: webpackConfig.output.publicPath, stats: { colors: true, chunks: false } }) var hotMiddleware = require('webpack-hot-middleware')(compiler) // force page reload when html-webpack-plugin template changes compiler.plugin('compilation', function (compilation) { compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { hotMiddleware.publish({ action: 'reload' }) cb() }) }) // proxy api requests Object.keys(proxyTable).forEach(function (context) { var options = proxyTable[context] if (typeof options === 'string') { options = { target: options } } app.use(proxyMiddleware(context, options)) }) // handle fallback for HTML5 history API app.use(require('connect-history-api-fallback')()) // serve webpack bundle output app.use(devMiddleware) // enable hot-reload and state-preserving // compilation error display app.use(hotMiddleware) // serve pure static assets var staticPath = path.posix.join(config.build.assetsPublicPath, config.build.assetsSubDirectory) app.use(staticPath, express.static('./static')) module.exports = app.listen(port, function (err) { if (err) { console.log(err) return } console.log('Listening at http://localhost:' + port + '\n') }) ================================================ FILE: build/utils.js ================================================ var path = require('path') var config = require('../config') var ExtractTextPlugin = require('extract-text-webpack-plugin') exports.assetsPath = function (_path) { return path.posix.join(config.build.assetsSubDirectory, _path) } exports.cssLoaders = function (options) { options = options || {} // generate loader string to be used with extract text plugin function generateLoaders (loaders) { var sourceLoader = loaders.map(function (loader) { var extraParamChar if (/\?/.test(loader)) { loader = loader.replace(/\?/, '-loader?') extraParamChar = '&' } else { loader = loader + '-loader' extraParamChar = '?' } return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : '') }).join('!') if (options.extract) { return ExtractTextPlugin.extract('vue-style-loader', sourceLoader) } else { return ['vue-style-loader', sourceLoader].join('!') } } // http://vuejs.github.io/vue-loader/configurations/extract-css.html return { css: generateLoaders(['css']), postcss: generateLoaders(['css']), less: generateLoaders(['css', 'less']), sass: generateLoaders(['css', 'sass?indentedSyntax']), scss: generateLoaders(['css', 'sass']), stylus: generateLoaders(['css', 'stylus']), styl: generateLoaders(['css', 'stylus']) } } // Generate loaders for standalone style files (outside of .vue) exports.styleLoaders = function (options) { var output = [] var loaders = exports.cssLoaders(options) for (var extension in loaders) { var loader = loaders[extension] output.push({ test: new RegExp('\\.' + extension + '$'), loader: loader }) } return output } ================================================ FILE: build/webpack.base.conf.js ================================================ var path = require('path') var config = require('../config') var utils = require('./utils') var projectRoot = path.resolve(__dirname, '../') module.exports = { entry: { dashboard: './src/dashboard.js', index: './src/index.js' }, output: { path: config.build.assetsRoot, publicPath: config.build.assetsPublicPath, filename: '[name].js' }, resolve: { extensions: ['', '.js', '.vue'], fallback: [path.join(__dirname, '../node_modules')], alias: { 'src': path.resolve(__dirname, '../src'), 'assets': path.resolve(__dirname, '../src/assets'), 'components': path.resolve(__dirname, '../src/components') } }, resolveLoader: { fallback: [path.join(__dirname, '../node_modules')] }, module: { preLoaders: [ { test: /\.vue$/, loader: 'eslint', include: projectRoot, exclude: /node_modules/ }, { test: /\.js$/, loader: 'eslint', include: projectRoot, exclude: /node_modules/ } ], loaders: [ { test: /\.vue$/, loader: 'vue' }, { test: /\.js$/, loader: 'babel', include: projectRoot, exclude: /node_modules/ }, { test: /\.json$/, loader: 'json' }, { test: /\.html$/, loader: 'vue-html' }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url', query: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url', query: { limit: 10000, name: utils.assetsPath('fonts/[name].[hash:7].[ext]') } } ] }, eslint: { formatter: require('eslint-friendly-formatter') }, vue: { loaders: utils.cssLoaders() } } ================================================ FILE: build/webpack.dev.conf.js ================================================ var config = require('../config') var webpack = require('webpack') var merge = require('webpack-merge') var utils = require('./utils') var baseWebpackConfig = require('./webpack.base.conf') var HtmlWebpackPlugin = require('html-webpack-plugin') // add hot-reload related code to entry chunks Object.keys(baseWebpackConfig.entry).forEach(function (name) { baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) }) module.exports = merge(baseWebpackConfig, { module: { loaders: utils.styleLoaders() }, // eval-source-map is faster for development devtool: '#eval-source-map', plugins: [ new webpack.DefinePlugin({ 'process.env': config.dev.env }), // https://github.com/glenjamin/webpack-hot-middleware#installation--usage new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), // https://github.com/ampedandwired/html-webpack-plugin new HtmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: true }), new HtmlWebpackPlugin({ filename: 'dashboard.html', template: 'dashboard.html', inject: true }) ] }) ================================================ FILE: build/webpack.prod.conf.js ================================================ var path = require('path') var config = require('../config') var utils = require('./utils') var webpack = require('webpack') var merge = require('webpack-merge') var baseWebpackConfig = require('./webpack.base.conf') var ExtractTextPlugin = require('extract-text-webpack-plugin') var HtmlWebpackPlugin = require('html-webpack-plugin') var env = process.env.NODE_ENV === 'testing' ? require('../config/test.env') : config.build.env var webpackConfig = merge(baseWebpackConfig, { module: { loaders: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true }) }, devtool: config.build.productionSourceMap ? '#source-map' : false, output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].[chunkhash].js'), chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') }, vue: { loaders: utils.cssLoaders({ sourceMap: config.build.productionSourceMap, extract: true }) }, plugins: [ // http://vuejs.github.io/vue-loader/workflow/production.html new webpack.DefinePlugin({ 'process.env': env }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), new webpack.optimize.OccurenceOrderPlugin(), // generate dist index.html with correct asset hash for caching. // you can customize output by editing /index.html // see https://github.com/ampedandwired/html-webpack-plugin new HtmlWebpackPlugin({ filename: process.env.NODE_ENV === 'testing' ? 'index.html' : config.build.index, template: 'index.html', inject: true, // The index chunk is self contained to speed up the first visit chunks: ['index'], // This will cause error if using img in teamplate // Html will still be minified by html loader // https://github.com/vuejs-templates/webpack/issues/361 // minify: { // removeComments: true, // collapseWhitespace: true, // removeAttributeQuotes: true // // more options: // // https://github.com/kangax/html-minifier#options-quick-reference // }, // necessary to consistently work with multiple chunks via CommonsChunkPlugin chunksSortMode: 'dependency' }), new HtmlWebpackPlugin({ filename: process.env.NODE_ENV === 'testing' ? 'dashboard.html' : config.build.dashboard, template: 'dashboard.html', inject: true, chunks: ['manifest', 'vendor', 'dashboard'], chunksSortMode: 'dependency' }), // split vendor js into its own file new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', // Only extract vendors for the main app // The index chunk will keep its own vendors, // otherwise you will have to load a large vendor chunk for first visit chunks: ['dashboard'], minChunks: function (module, count) { // any required modules inside node_modules are extracted to vendor return ( module.resource && // Should not only extract common js files // https://github.com/vuejs-templates/webpack/issues/363 // /\.js$/.test(module.resource) && module.resource.indexOf( path.join(__dirname, '../node_modules') ) === 0 ) } }), // extract webpack runtime and module manifest to its own file in order to // prevent vendor hash from being updated whenever app bundle is updated new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', chunks: ['vendor'] }), // extract css into its own file new ExtractTextPlugin(utils.assetsPath('css/[name].[contenthash].css')), ] }) if (config.build.productionGzip) { var CompressionWebpackPlugin = require('compression-webpack-plugin') webpackConfig.plugins.push( new CompressionWebpackPlugin({ asset: '[path].gz[query]', algorithm: 'gzip', test: new RegExp( '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' ), threshold: 10240, minRatio: 0.8 }) ) } module.exports = webpackConfig ================================================ FILE: config/dev.env.js ================================================ var merge = require('webpack-merge') var prodEnv = require('./prod.env') module.exports = merge(prodEnv, { NODE_ENV: '"development"' }) ================================================ FILE: config/index.js ================================================ // see http://vuejs-templates.github.io/webpack for documentation. var path = require('path') module.exports = { build: { env: require('./prod.env'), index: path.resolve(__dirname, '../dist/index.html'), dashboard: path.resolve(__dirname, '../dist/dashboard.html'), assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '', // Default set to '/' productionSourceMap: true, // Gzip off by default as many popular static hosts such as // Surge or Netlify already gzip all static assets for you. // Before setting to `true`, make sure to: // npm install --save-dev compression-webpack-plugin productionGzip: false, productionGzipExtensions: ['js', 'css'] }, dev: { env: require('./dev.env'), port: 8080, proxyTable: {} } } ================================================ FILE: config/prod.env.js ================================================ module.exports = { NODE_ENV: '"production"' } ================================================ FILE: config/test.env.js ================================================ var merge = require('webpack-merge') var devEnv = require('./dev.env') module.exports = merge(devEnv, { NODE_ENV: '"testing"' }) ================================================ FILE: dashboard.html ================================================ Tomato5 ================================================ FILE: deploy.sh ================================================ git checkout master npm run build firebase deploy ================================================ FILE: firebase.json ================================================ { "hosting": { "public": "dist" } } ================================================ FILE: index.html ================================================ Tomato5

Tomato5

Concentrate with your team

Start now

What is Tomato5

Tomato5 is a real-time collaboration tool

It combines Pomodoro Technique with a team status share board

Features

Set Pomodoro Timer
timer
Track energy level
emotions
Share task status
team
Give thumbs up
flowers
Show speech bubble
bubble
Analyze key metrics
metric

Why Tomato5?

Traditional collaboration tools only tell the team what to achieve, without concern about individual's actual status.

By sharing what we are doing、thinking、and feeling in real-time, we can express ourselves more adequately, feel more connected to the team, and get more feedbacks on time.

Add Tomato5 to your productivity toolkit

tools
Star me on Github
================================================ FILE: package.json ================================================ { "name": "tomato5", "version": "1.3.1", "description": "A real-time collaboration tool. Built with Vue and Google Firebase.", "author": "XinZhang ", "private": true, "scripts": { "dev": "node build/dev-server.js", "build": "node build/build.js", "unit": "karma start test/unit/karma.conf.js --single-run", "e2e": "node test/e2e/runner.js", "test": "npm run unit && npm run e2e", "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs" }, "dependencies": {}, "devDependencies": { "animate.css": "^3.5.1", "babel-core": "^6.0.0", "babel-loader": "^6.0.0", "babel-plugin-transform-runtime": "^6.0.0", "babel-preset-es2015": "^6.0.0", "babel-preset-stage-2": "^6.0.0", "babel-runtime": "^6.0.0", "chai": "^3.5.0", "chart.js": "^2.2.1", "chromedriver": "^2.21.2", "connect-history-api-fallback": "^1.1.0", "cross-spawn": "^2.1.5", "css-loader": "^0.23.0", "eslint": "^2.10.2", "eslint-config-airbnb-base": "^3.0.1", "eslint-friendly-formatter": "^2.0.5", "eslint-loader": "^1.3.0", "eslint-plugin-html": "^1.3.0", "eslint-plugin-import": "^1.8.1", "eventsource-polyfill": "^0.9.6", "express": "^4.13.3", "extract-text-webpack-plugin": "^1.0.1", "fastclick": "^1.0.6", "file-loader": "^0.8.4", "firebase": "^3.1.0", "function-bind": "^1.0.2", "html-webpack-plugin": "^2.8.1", "http-proxy-middleware": "^0.12.0", "inject-loader": "^2.0.1", "isparta-loader": "^2.0.0", "json-loader": "^0.5.4", "karma": "^0.13.15", "karma-coverage": "^0.5.5", "karma-mocha": "^0.2.2", "karma-phantomjs-launcher": "^1.0.0", "karma-sinon-chai": "^1.2.0", "karma-sourcemap-loader": "^0.3.7", "karma-spec-reporter": "0.0.24", "karma-webpack": "^1.7.0", "lolex": "^1.4.0", "mocha": "^2.4.5", "moment": "^2.14.1", "nightwatch": "^0.8.18", "node-sass": "^3.8.0", "normalize.css": "^4.2.0", "ora": "^0.2.0", "phantomjs-prebuilt": "^2.1.3", "sass-loader": "^4.0.0", "selenium-server": "2.53.0", "shelljs": "^0.6.0", "sinon": "^1.17.3", "sinon-chai": "^2.8.0", "url-loader": "^0.5.7", "vue": "^1.0.21", "vue-hot-reload-api": "^1.2.0", "vue-html-loader": "^1.0.0", "vue-loader": "^8.3.0", "vue-style-loader": "^1.0.0", "vue-validator": "^2.1.6", "webpack": "^1.12.2", "webpack-dev-middleware": "^1.4.0", "webpack-hot-middleware": "^2.6.0", "webpack-merge": "^0.8.3" } } ================================================ FILE: src/App.vue ================================================ ================================================ FILE: src/auth.js ================================================ // import firebaseUi from '../vendors/firebase-ui-auth.js'; import firebase from 'firebase'; import firebaseUiAuthCss from '../vendors/firebase-ui-auth.css'; /* eslint no-unused-vars: 0 */ const user = { displayName: '', email: '', emailVerified: false, photoURL: '', uid: '', }; const initAuthUI = function initAuthUI() { // firebaseui is imported by script tag const firebaseui = window.firebaseui; // FirebaseUI config. const uiConfig = { signInSuccessUrl: '', signInOptions: [ // Leave the lines as is for the providers you want to offer your users. firebase.auth.GoogleAuthProvider.PROVIDER_ID, firebase.auth.EmailAuthProvider.PROVIDER_ID, ], // Terms of service url. tosUrl: '/', }; // Initialize the FirebaseUI Widget using Firebase. const ui = new firebaseui.auth.AuthUI(firebase.auth()); // The start method will wait until the DOM is loaded. ui.start('#firebaseui-auth-container', uiConfig); }; const init = function init() { firebase.auth().onAuthStateChanged((theUser) => { if (theUser) { user.displayName = theUser.displayName; user.email = theUser.email; user.emailVerified = theUser.emailVerified; user.photoURL = theUser.photoURL; user.uid = theUser.uid; // Object.assign(user, theUser); // console.log(user.uid); } else { // User is signed out. // console.log('signed out'); user.displayName = ''; user.email = ''; user.emailVerified = false; user.photoURL = ''; user.uid = ''; initAuthUI(); } }, (error) => { // console.log(error); }); }; const getUser = function getUser() { return user; }; const logout = function logout() { firebase.auth().signOut().then(() => { // Sign-out successful. window.location.reload(); }, (error) => { // An error happened. window.location.reload(); }); }; export default { init, getUser, logout }; ================================================ FILE: src/base.scss ================================================ $red: #ff5959; $green: #42b983; $ink: #2c3e50; $blue: #5fd2db; $yellow: #fff082; $gray: #8d97a1; $light-gray: #f0f0f0; $font-size-s: 15px; $font-size-m: 18px; $font-size-l: 20px; $font-size-xl: 30px; .clearfix { &:after, &:before { content: ""; display: table; clear: both; } } ================================================ FILE: src/common.scss ================================================ @import 'base'; html { height: 100%; } body { // font-family: 'Architects Daughter', cursive; // font-family: 'Patrick Hand', cursive; font-family: 'Short Stack', sans-serif; font-size: $font-size-s; color: $ink; height: 100%; a { color: $blue; text-decoration: none; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-tap-highlight-color: transparent; /* For some Androids */ cursor: pointer; &:active{ transform: scale3d(1.1, 1.1, 1); } } h2 { font-size: $font-size-m; font-weight: normal; } input[type=text], input[type=text]:focus { color: $ink; border: none; margin: 0; padding: 0; box-shadow: none; outline: initial; border-bottom: 1px solid $light-gray; } } .title{ text-align: left; margin: 40px -10px 40px -10px; text-align: center; h1 { color: $green; font-size: 44px; line-height: 80px; text-align: center; display: inline-block; margin: 0; position: relative; top: 5px; font-weight: bold; } .logo { width: 80px; height: 80px; display: inline-block; vertical-align: top; &:active{ transform: scale3d(1.05, 1.05, 1); } } @media (min-width: 400px) { h1 { font-size: 55px; line-height: 100px; } .logo { width: 100px; height: 100px; } } } .icon { display: inline-block; text-indent: -9999px; background-repeat: no-repeat; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-tap-highlight-color: transparent; /* For some Androids */ &:active{ transform: scale(1.15, 1.15); } opacity: 1; } .tomato{ width: 30px; height: 30px; background-image: url('assets/tomato.svg'); } ================================================ FILE: src/components/Account.vue ================================================ ================================================ FILE: src/components/ActiveTask.vue ================================================ ================================================ FILE: src/components/Emotion.vue ================================================ ================================================ FILE: src/components/Member.vue ================================================ ================================================ FILE: src/components/Panel.vue ================================================ ================================================ FILE: src/components/Task.vue ================================================ ================================================ FILE: src/components/TeamPanel.vue ================================================ ================================================ FILE: src/components/Usage.vue ================================================ ================================================ FILE: src/configs.js ================================================ /* eslint import/no-mutable-exports: 0 */ let taskDurations = { standard: 1500, resting: 300, }; let offLineThreshold = 60; // minutes let checkMemberInterval = 1000; // ms let firebaseConfig = { apiKey: 'AIzaSyCbB0yB-qabmzQ_STyAngEd5-D0MypBbBE', // This is not a private key authDomain: 'tomato5-pro.firebaseapp.com', databaseURL: 'https://tomato5-pro.firebaseio.com', storageBucket: 'tomato5-pro.appspot.com', }; if (window.location.hostname === 'localhost' || window.location.hostname === 'tomato5-dev.firebaseapp.com') { taskDurations = { standard: 5, resting: 3, }; offLineThreshold = 1; checkMemberInterval = 1000; firebaseConfig = { apiKey: 'AIzaSyBanxSDWrWUKStXGi8lSQtA1AeMmGDNmks', authDomain: 'tomato5-dev.firebaseapp.com', databaseURL: 'https://tomato5-dev.firebaseio.com', storageBucket: 'tomato5-dev.appspot.com', }; } export { taskDurations, offLineThreshold, checkMemberInterval, firebaseConfig }; ================================================ FILE: src/dashboard.js ================================================ import Vue from 'vue'; import VueValidator from 'vue-validator'; import App from './App'; Vue.use(VueValidator); /* eslint-disable no-new */ new Vue({ el: 'body', components: { App }, }); ================================================ FILE: src/dataBase.js ================================================ import firebase from 'firebase'; let database = null; const init = function init() { database = firebase.database(); }; const watch = function watch(path, callback) { const ref = database.ref(path); ref.on('value', callback); return ref; }; const get = function get(path, defaultData, validator) { const promise = new Promise((resolve, reject) => { // console.log("Checking remote"); database.ref(path).once('value', (snapshot) => { const data = snapshot.val(); // console.log('Reveived Data'); if ((validator && validator(data)) || (!validator && data)) { // console.log('Valid Data'); resolve(data); } else { // console.log('No valid Data'); // ref.set(defaultData).then(function(){ // console.log("Default setted"); // resolve(defaultData); // }); resolve(defaultData); } }, () => { reject(); }); }); return promise; }; const save = function save(path, data) { const parsedData = JSON.parse(JSON.stringify(data)); return database.ref(path).set(parsedData).then(() => { // console.log('Saved'); }); }; export default { init, get, save, watch }; ================================================ FILE: src/database.js ================================================ import firebase from 'firebase'; let database = null; const init = function init() { database = firebase.database(); }; const watch = function watch(path, callback) { const ref = database.ref(path); ref.on('value', callback); return ref; }; const get = function get(path, defaultData, validator) { const promise = new Promise((resolve, reject) => { // console.log("Checking remote"); database.ref(path).once('value', (snapshot) => { const data = snapshot.val(); // console.log('Reveived Data'); if ((validator && validator(data)) || (!validator && data)) { // console.log('Valid Data'); resolve(data); } else { // console.log('No valid Data'); // ref.set(defaultData).then(function(){ // console.log("Default setted"); // resolve(defaultData); // }); resolve(defaultData); } }, () => { reject(); }); }); return promise; }; const save = function save(path, data) { const parsedData = JSON.parse(JSON.stringify(data)); return database.ref(path).set(parsedData).then(() => { // console.log('Saved'); }); }; export default { init, get, save, watch }; ================================================ FILE: src/index.js ================================================ import normalizeCss from 'normalize.css'; /* eslint no-unused-vars: 0 */ import animateCss from 'animate.css'; /* eslint no-unused-vars: 0 */ import FastClick from 'fastclick'; import commonCss from './common.scss'; /* eslint no-unused-vars: 0 */ import indexCss from './index.scss'; /* eslint no-unused-vars: 0 */ import utils from './utils'; const init = function initApp() { if ('addEventListener' in document) { document.addEventListener('DOMContentLoaded', () => { FastClick.attach(document.body); }, false); } const initAnimation = function initAnimation() { setTimeout(() => { const btn = document.getElementById('startNow'); btn.className += ' animated tada ready'; }, 2000); setTimeout(() => { const welcome = document.getElementById('welcome'); const instruction = document.getElementById('instruction'); if (window.scrollY === 0) { instruction.className += ' noScroll'; } welcome.className += ' ready'; instruction.className += ' pop'; }, 1500); }; initAnimation(); utils.report('workflow', 'initIndex'); }; init(); ================================================ FILE: src/index.scss ================================================ @import 'base'; $longScreenHeight: 600px; $wideScreenWidth: 600px; .welcome { height: 900px; min-height: 450px; box-sizing: border-box; transition: padding 0.5s; padding-top: 50px; @media (min-height: $longScreenHeight) { padding-top: 100px; } &.ready { height: 100%; } .brand { text-align: center; .title { margin: auto; } .slogan { margin-top: 50px; text-align: center; } } .indexStart { text-align: center; margin: 100px 0 100px 0; a { display: block; background-color: $red; width: 150px; margin: auto; color: white; line-height: 55px; font-size: $font-size-l; border-radius: 15px; } a.ready { transition: all 0.5s; } a:hover { opacity: 0.8; } a:active { position: relative; top: 2px; } } } .introduction { // font-family: proxima-nova,Helvetica Neue,Helvetica,sans-serif; section { padding: 50px 10%; clear: both; } h2 { font-size: $font-size-xl; } &.noScroll.pop .what { transition: all 0.5s ease-out; } &.pop { .what { top: -20px; } .features h2 { margin-top: 10px; } } @media (min-height: $longScreenHeight) { &.pop { .what { top: -120px; } .features h2 { margin-top: -90px; } } } .what { position: relative; top: 0px; color: white; text-align: center; background-color: $red; padding-left: 0; padding-right: 0; font-size: $font-size-m; h2 { margin: 20px 0 25px 10px; } } .features { background-color: white; max-width: 800px; margin: auto; h2 { color: $green; margin: 30px 0 20px 0; } @media (min-width: $wideScreenWidth) { h2 { margin-bottom: 60px; } } .feature { margin-bottom: 50px; .detail { font-size: $font-size-l; color: $green; margin: 40px 0; } img { display: block; width: 100%; } } @media (min-width: $wideScreenWidth) { .feature { .detail { float: left; width: 50%; line-height: 250px; text-align: center; } &.flowers { margin: 100px 0; .detail { line-height: 150px; } } &.bubble { margin: 70px 0; .detail { line-height: 150px; } } img { float: right; width: 50%; } &.right { img { float: left; } .detail { float: right; // text-align: left; } } } } } .why { background-color: $green; color: white; font-size: $font-size-s; line-height: 1.5; strong { font-size: $font-size-l; } h2 { margin-top: 10px; } } .tools { img { display: block; width: 100%; max-width: 400px; margin: 70px auto; } h2 { font-size: $font-size-l; } } } .indexFooter { margin: 50px 0 0 0;; font-size: $font-size-l; text-align: center; line-height: 120px; // background-color: $blue; a { // color: white; } } ================================================ FILE: src/model.js ================================================ import moment from 'moment'; const taskStatus = { dropped: -1, idle: 0, ongoing: 1, paused: 2, active: 3, done: 4, }; const availabilities = { unknown: -1, idle: 0, active: 1, resting: 2, busy: 3, }; const taskTips = [ '✎ Write about what you are doing', 'Click tomato to start', 'After finishing, take a rest', 'Restart if you are disturbed', 'Share status with your team', ]; const getDefaultTasks = function getDefaultTasks() { const tasks = []; for (let i = 0; i < 5; i++) { // Avoid same object ref const defaultTask = { note: '', status: taskStatus.idle, startTime: null, createTime: moment(), emotion: 2, }; tasks.push(defaultTask); } return tasks; }; const userStatus = { availability: availabilities.idle, emotion: '2', }; const team = { info: { inviteCode: 'HFE-Train', name: 'HFE-Train', }, common: { messages: { DATE: { headline: '', speeches: { UID: { content: '', isShowSpeech: false, }, }, }, }, flowers: { DATE: { UID: { count: 0, }, }, }, }, members: { UID: { rule: 'member', userInfo: {}, userStatus: {}, tasks: [], updateTime: '', // moment }, }, }; const userData = { teamData: { currentTeam: '', }, systemData: { rule: 'normal', }, }; export { taskStatus, taskTips, availabilities, getDefaultTasks, team, userData, userStatus }; ================================================ FILE: src/timer.js ================================================ import moment from 'moment'; import { taskDurations } from './configs'; const getRemaning = function getRemaning(startTime, type) { const duration = moment.duration(taskDurations[type], 'seconds'); const elapsed = moment().diff(startTime, 'seconds'); const remaning = duration.subtract(elapsed, 'seconds'); return remaning; }; const getContdown = function getContdown(startTime, type, level) { const remaning = getRemaning(startTime, type); let minutes = remaning.minutes() > 0 ? remaning.minutes() : 0; let seconds = remaning.seconds() > 0 ? remaning.seconds() : 0; let result = ''; if (level === 'minute') { result = `${minutes + (seconds > 0 ? 1 : 0)}m`; } else { minutes = minutes > 9 ? `${minutes}` : `0${minutes}`; seconds = seconds > 9 ? `${seconds}` : `0${seconds}`; result = `${minutes}:${seconds}`; } return result; }; export default { getRemaning, getContdown }; ================================================ FILE: src/utils.js ================================================ const report = function report(eventCategory, eventAction, eventLabel, eventValue, fieldsObject) { if (window.ga) { window.ga('send', 'event', eventCategory, eventAction, eventLabel, eventValue, fieldsObject); } }; const utils = { report, }; export default utils; ================================================ FILE: static/.gitkeep ================================================ ================================================ FILE: test/e2e/custom-assertions/elementCount.js ================================================ // A custom Nightwatch assertion. // the name of the method is the filename. // can be used in tests like this: // // browser.assert.elementCount(selector, count) // // for how to write custom assertions see // http://nightwatchjs.org/guide#writing-custom-assertions exports.assertion = function (selector, count) { this.message = 'Testing if element <' + selector + '> has count: ' + count this.expected = count this.pass = function (val) { return val === this.expected } this.value = function (res) { return res.value } this.command = function (cb) { var self = this return this.api.execute(function (selector) { return document.querySelectorAll(selector).length }, [selector], function (res) { cb.call(self, res) }) } } ================================================ FILE: test/e2e/nightwatch.conf.js ================================================ // http://nightwatchjs.org/guide#settings-file module.exports = { "src_folders": ["test/e2e/specs"], "output_folder": "test/e2e/reports", "custom_assertions_path": ["test/e2e/custom-assertions"], "selenium": { "start_process": true, "server_path": "node_modules/selenium-server/lib/runner/selenium-server-standalone-2.53.0.jar", "host": "127.0.0.1", "port": 4444, "cli_args": { "webdriver.chrome.driver": require('chromedriver').path } }, "test_settings": { "default": { "selenium_port": 4444, "selenium_host": "localhost", "silent": true }, "chrome": { "desiredCapabilities": { "browserName": "chrome", "javascriptEnabled": true, "acceptSslCerts": true } }, "firefox": { "desiredCapabilities": { "browserName": "firefox", "javascriptEnabled": true, "acceptSslCerts": true } } } } ================================================ FILE: test/e2e/runner.js ================================================ // 1. start the dev server using production config process.env.NODE_ENV = 'testing' var server = require('../../build/dev-server.js') // 2. run the nightwatch test suite against it // to run in additional browsers: // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" // 2. add it to the --env flag below // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` // For more information on Nightwatch's config file, see // http://nightwatchjs.org/guide#settings-file var opts = process.argv.slice(2) if (opts.indexOf('--config') === -1) { opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) } if (opts.indexOf('--env') === -1) { opts = opts.concat(['--env', 'chrome']) } var spawn = require('cross-spawn') var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) runner.on('exit', function (code) { server.close() process.exit(code) }) runner.on('error', function (err) { server.close() throw err }) ================================================ FILE: test/e2e/specs/test.js ================================================ // For authoring Nightwatch tests, see // http://nightwatchjs.org/guide#usage module.exports = { 'default e2e tests': function (browser) { browser .url('http://localhost:8080') .waitForElementVisible('#app', 5000) .assert.elementPresent('.logo') .assert.containsText('h1', 'Hello World!') .assert.elementCount('p', 3) .end() } } ================================================ FILE: test/unit/.eslintrc ================================================ { "env": { "mocha": true }, "globals": { "expect": true, "sinon": true } } ================================================ FILE: test/unit/index.js ================================================ // Polyfill fn.bind() for PhantomJS /* eslint-disable no-extend-native */ Function.prototype.bind = require('function-bind') // require all test files (files that ends with .spec.js) var testsContext = require.context('./specs', true, /\.spec$/) testsContext.keys().forEach(testsContext) // require all src files except main.js for coverage. // you can also change this to match only the subset of files that // you want coverage for. var srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) srcContext.keys().forEach(srcContext) ================================================ FILE: test/unit/karma.conf.js ================================================ // This is a karma config file. For more details see // http://karma-runner.github.io/0.13/config/configuration-file.html // we are also using it with karma-webpack // https://github.com/webpack/karma-webpack var path = require('path') var merge = require('webpack-merge') var baseConfig = require('../../build/webpack.base.conf') var utils = require('../../build/utils') var webpack = require('webpack') var projectRoot = path.resolve(__dirname, '../../') var webpackConfig = merge(baseConfig, { // use inline sourcemap for karma-sourcemap-loader module: { loaders: utils.styleLoaders() }, devtool: '#inline-source-map', vue: { loaders: { js: 'isparta' } }, plugins: [ new webpack.DefinePlugin({ 'process.env': require('../../config/test.env') }) ] }) // no need for app entry during tests delete webpackConfig.entry // make sure isparta loader is applied before eslint webpackConfig.module.preLoaders = webpackConfig.module.preLoaders || [] webpackConfig.module.preLoaders.unshift({ test: /\.js$/, loader: 'isparta', include: path.resolve(projectRoot, 'src') }) // only apply babel for test files when using isparta webpackConfig.module.loaders.some(function (loader, i) { if (loader.loader === 'babel') { loader.include = path.resolve(projectRoot, 'test/unit') return true } }) module.exports = function (config) { config.set({ // to run in additional browsers: // 1. install corresponding karma launcher // http://karma-runner.github.io/0.13/config/browsers.html // 2. add it to the `browsers` array below. browsers: ['PhantomJS'], frameworks: ['mocha', 'sinon-chai'], reporters: ['spec', 'coverage'], files: ['./index.js'], preprocessors: { './index.js': ['webpack', 'sourcemap'] }, webpack: webpackConfig, webpackMiddleware: { noInfo: true }, coverageReporter: { dir: './coverage', reporters: [ { type: 'lcov', subdir: '.' }, { type: 'text-summary' } ] } }) } ================================================ FILE: test/unit/specs/Hello.spec.js ================================================ import Vue from 'vue' import Hello from 'src/components/Hello' describe('Hello.vue', () => { it('should render correct contents', () => { const vm = new Vue({ template: '
', components: { Hello } }).$mount() expect(vm.$el.querySelector('.hello h1').textContent).to.contain('Hello World!') }) }) ================================================ FILE: vendors/firebase-ui-auth.css ================================================ /*! Terms: https://developers.google.com/terms */ @import url(https://fonts.googleapis.com/css?family=Roboto:400,500,700);.mdl-button{background:transparent;border:none;border-radius:2px;color:rgb(0,0,0);position:relative;height:36px;margin:0;min-width:64px;padding:0 16px;display:inline-block;font-family:"Roboto","Helvetica","Arial",sans-serif;font-size:14px;font-weight:500;text-transform:uppercase;line-height:1;letter-spacing:0;overflow:hidden;will-change:box-shadow;transition:box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1),background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),color 0.2s cubic-bezier(0.4, 0, 0.2, 1);outline:none;cursor:pointer;text-decoration:none;text-align:center;line-height:36px;vertical-align:middle}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:rgba(158,158,158, 0.20)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0, 0.12)}.mdl-button:active{background-color:rgba(158,158,158, 0.40)}.mdl-button.mdl-button--colored{color:rgb(63,81,181)}.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0, 0.12)}input.mdl-button[type="submit"]{-webkit-appearance:none}.mdl-button--raised{background:rgba(158,158,158, 0.20);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.2);background-color:rgba(158,158,158, 0.40)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,0.18),0 8px 16px rgba(0,0,0,0.36);background-color:rgba(158,158,158, 0.40)}.mdl-button--raised.mdl-button--colored{background:rgb(63,81,181);color:rgb(255,255,255)}.mdl-button--raised.mdl-button--colored:hover{background-color:rgb(63,81,181)}.mdl-button--raised.mdl-button--colored:active{background-color:rgb(63,81,181)}.mdl-button--raised.mdl-button--colored:focus:not(:active){background-color:rgb(63,81,181)}.mdl-button--raised.mdl-button--colored .mdl-ripple{background:rgb(255,255,255)}.mdl-button--fab{border-radius:50%;font-size:24px;height:56px;margin:auto;min-width:56px;width:56px;padding:0;overflow:hidden;background:rgba(158,158,158, 0.20);box-shadow:0 1px 1.5px 0 rgba(0,0,0,0.12),0 1px 1px 0 rgba(0,0,0,0.24);position:relative;line-height:normal}.mdl-button--fab .material-icons{position:absolute;top:50%;left:50%;transform:translate(-12px, -12px);line-height:24px;width:24px}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle, #fff, #000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.2);background-color:rgba(158,158,158, 0.40)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,0.18),0 8px 16px rgba(0,0,0,0.36);background-color:rgba(158,158,158, 0.40)}.mdl-button--fab.mdl-button--colored{background:rgb(255,64,129);color:rgb(255,255,255)}.mdl-button--fab.mdl-button--colored:hover{background-color:rgb(255,64,129)}.mdl-button--fab.mdl-button--colored:focus:not(:active){background-color:rgb(255,64,129)}.mdl-button--fab.mdl-button--colored:active{background-color:rgb(255,64,129)}.mdl-button--fab.mdl-button--colored .mdl-ripple{background:rgb(255,255,255)}.mdl-button--icon{border-radius:50%;font-size:24px;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;padding:0;overflow:hidden;color:inherit;line-height:normal}.mdl-button--icon .material-icons{position:absolute;top:50%;left:50%;transform:translate(-12px, -12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon .material-icons{top:0px;left:0px}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle, #fff, #000)}.mdl-button__ripple-container{display:block;height:100%;left:0px;position:absolute;top:0px;width:100%;z-index:0;overflow:hidden}.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple,.mdl-button.mdl-button--disabled .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:rgb(63,81,181)}.mdl-button--primary.mdl-button--primary .mdl-ripple{background:rgb(255,255,255)}.mdl-button--primary.mdl-button--primary.mdl-button--raised,.mdl-button--primary.mdl-button--primary.mdl-button--fab{color:rgb(255,255,255);background-color:rgb(63,81,181)}.mdl-button--accent.mdl-button--accent{color:rgb(255,64,129)}.mdl-button--accent.mdl-button--accent .mdl-ripple{background:rgb(255,255,255)}.mdl-button--accent.mdl-button--accent.mdl-button--raised,.mdl-button--accent.mdl-button--accent.mdl-button--fab{color:rgb(255,255,255);background-color:rgb(255,64,129)}.mdl-button[disabled][disabled],.mdl-button.mdl-button--disabled.mdl-button--disabled{color:rgba(0,0,0, 0.26);cursor:default;background-color:transparent}.mdl-button--fab[disabled][disabled],.mdl-button--fab.mdl-button--disabled.mdl-button--disabled{background-color:rgba(0,0,0, 0.12);color:rgba(0,0,0, 0.26)}.mdl-button--raised[disabled][disabled],.mdl-button--raised.mdl-button--disabled.mdl-button--disabled{background-color:rgba(0,0,0, 0.12);color:rgba(0,0,0, 0.26);box-shadow:none}.mdl-button--colored[disabled][disabled],.mdl-button--colored.mdl-button--disabled.mdl-button--disabled{color:rgba(0,0,0, 0.26)}.mdl-button .material-icons{vertical-align:middle} .mdl-card{display:flex;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:rgb(255,255,255);border-radius:2px;box-sizing:border-box}.mdl-card__media{background-color:rgb(255,64,129);background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll;box-sizing:border-box}.mdl-card__title{align-items:center;color:rgb(0,0,0);display:block;display:flex;justify-content:stretch;line-height:normal;padding:16px 16px;perspective-origin:165px 56px;transform-origin:165px 56px;box-sizing:border-box}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,0.1)}.mdl-card__title-text{align-self:flex-end;color:inherit;display:block;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:rgba(0,0,0, 0.54);margin:0}.mdl-card__supporting-text{color:rgba(0,0,0, 0.54);font-size:1rem;line-height:18px;overflow:hidden;padding:16px 16px;width:90%}.mdl-card__actions{font-size:16px;line-height:normal;width:100%;background-color:transparent;padding:8px;box-sizing:border-box}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,0.1)}.mdl-card--expand{flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px} .mdl-progress{display:block;position:relative;height:4px;width:500px;max-width:100%}.mdl-progress>.bar{display:block;position:absolute;top:0;bottom:0;width:0%;transition:width 0.2s cubic-bezier(0.4, 0, 0.2, 1)}.mdl-progress>.progressbar{background-color:rgb(63,81,181);z-index:1;left:0}.mdl-progress>.bufferbar{background-image:linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)),linear-gradient(to right, rgb(63,81,181), rgb(63,81,181));z-index:0;left:0}.mdl-progress>.auxbar{right:0}@supports (-webkit-appearance: none){.mdl-progress:not(.mdl-progress--indeterminate):not(.mdl-progress--indeterminate)>.auxbar,.mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate)>.auxbar{background-image:linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)),linear-gradient(to right, rgb(63,81,181), rgb(63,81,181));mask:url("/images/buffer.svg?embed")}}.mdl-progress:not(.mdl-progress--indeterminate)>.auxbar,.mdl-progress:not(.mdl-progress__indeterminate)>.auxbar{background-image:linear-gradient(to right, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)),linear-gradient(to right, rgb(63,81,181), rgb(63,81,181))}.mdl-progress.mdl-progress--indeterminate>.bar1,.mdl-progress.mdl-progress__indeterminate>.bar1{background-color:rgb(63,81,181);animation-name:indeterminate1;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}.mdl-progress.mdl-progress--indeterminate>.bar3,.mdl-progress.mdl-progress__indeterminate>.bar3{background-image:none;background-color:rgb(63,81,181);animation-name:indeterminate2;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}@keyframes indeterminate1{0%{left:0%;width:0%}50%{left:25%;width:75%}75%{left:100%;width:0%}}@keyframes indeterminate2{0%{left:0%;width:0%}50%{left:0%;width:0%}75%{left:0%;width:25%}100%{left:100%;width:0%}} .mdl-shadow--2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,0.14),0 3px 3px -2px rgba(0,0,0,0.2),0 1px 8px 0 rgba(0,0,0,0.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,0.14),0 1px 18px 0 rgba(0,0,0,0.12),0 3px 5px -1px rgba(0,0,0,0.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -5px rgba(0,0,0,0.2)}.mdl-shadow--24dp{box-shadow:0 9px 46px 8px rgba(0,0,0,0.14),0 11px 15px -7px rgba(0,0,0,0.12),0 24px 38px 3px rgba(0,0,0,0.2)} .mdl-textfield{position:relative;font-size:16px;display:inline-block;box-sizing:border-box;width:300px;max-width:100%;margin:0;padding:20px 0}.mdl-textfield .mdl-button{position:absolute;bottom:20px}.mdl-textfield--align-right{text-align:right}.mdl-textfield--full-width{width:100%}.mdl-textfield--expandable{min-width:32px;width:auto;min-height:32px}.mdl-textfield__input{border:none;border-bottom:1px solid rgba(0,0,0, 0.12);display:block;font-size:16px;font-family:"Helvetica","Arial",sans-serif;margin:0;padding:4px 0;width:100%;background:none;text-align:left;color:inherit}.mdl-textfield__input[type="number"]{-moz-appearance:textfield}.mdl-textfield__input[type="number"]::-webkit-inner-spin-button,.mdl-textfield__input[type="number"]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.mdl-textfield.is-focused .mdl-textfield__input{outline:none}.mdl-textfield.is-invalid .mdl-textfield__input{border-color:rgb(213,0,0);box-shadow:none}fieldset[disabled] .mdl-textfield .mdl-textfield__input,.mdl-textfield.is-disabled .mdl-textfield__input{background-color:transparent;border-bottom:1px dotted rgba(0,0,0, 0.12);color:rgba(0,0,0, 0.26)}.mdl-textfield textarea.mdl-textfield__input{display:block}.mdl-textfield__label{bottom:0;color:rgba(0,0,0, 0.26);font-size:16px;left:0;right:0;pointer-events:none;position:absolute;display:block;top:24px;width:100%;overflow:hidden;white-space:nowrap;text-align:left}.mdl-textfield.is-dirty .mdl-textfield__label,.mdl-textfield.has-placeholder .mdl-textfield__label{visibility:hidden}.mdl-textfield--floating-label .mdl-textfield__label{transition-duration:0.2s;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1)}.mdl-textfield--floating-label.has-placeholder .mdl-textfield__label{transition:none}fieldset[disabled] .mdl-textfield .mdl-textfield__label,.mdl-textfield.is-disabled.is-disabled .mdl-textfield__label{color:rgba(0,0,0, 0.26)}.mdl-textfield--floating-label.is-focused .mdl-textfield__label,.mdl-textfield--floating-label.is-dirty .mdl-textfield__label,.mdl-textfield--floating-label.has-placeholder .mdl-textfield__label{color:rgb(63,81,181);font-size:12px;top:4px;visibility:visible}.mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label,.mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label,.mdl-textfield--floating-label.has-placeholder .mdl-textfield__expandable-holder .mdl-textfield__label{top:-16px}.mdl-textfield--floating-label.is-invalid .mdl-textfield__label{color:rgb(213,0,0);font-size:12px}.mdl-textfield__label:after{background-color:rgb(63,81,181);bottom:20px;content:'';height:2px;left:45%;position:absolute;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);visibility:hidden;width:10px}.mdl-textfield.is-focused .mdl-textfield__label:after{left:0;visibility:visible;width:100%}.mdl-textfield.is-invalid .mdl-textfield__label:after{background-color:rgb(213,0,0)}.mdl-textfield__error{color:rgb(213,0,0);position:absolute;font-size:12px;margin-top:3px;visibility:hidden;display:block}.mdl-textfield.is-invalid .mdl-textfield__error{visibility:visible}.mdl-textfield__expandable-holder{display:inline-block;position:relative;margin-left:32px;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);display:inline-block;max-width:0.1px}.mdl-textfield.is-focused .mdl-textfield__expandable-holder,.mdl-textfield.is-dirty .mdl-textfield__expandable-holder{max-width:600px}.mdl-textfield__expandable-holder .mdl-textfield__label:after{bottom:0} .firebaseui-container{background-color:#fff;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;color:rgba(0,0,0,0.87);direction:ltr;font:16px Roboto,arial,sans-serif;margin:0 auto;max-width:360px;overflow:hidden;position:relative;width:100%}.firebaseui-card-header{padding:24px 24px 0 24px}.firebaseui-card-content{padding:0 24px}.firebaseui-card-footer{font-size:14px;line-height:36px;padding:8px 24px 24px 24px}.firebaseui-card-footer::after{clear:both;content:"";display:table}.firebaseui-title,.firebaseui-subtitle{color:rgba(0,0,0,0.87);direction:ltr;font-size:20px;font-weight:500;line-height:24px;margin:0;padding:0;text-align:left}.firebaseui-title{padding-bottom:20px}.firebaseui-subtitle{margin:16px 0}.firebaseui-text{color:rgba(0,0,0,0.87);direction:ltr;font-size:16px;line-height:24px;text-align:left}.firebaseui-text-emphasis{font-weight:700}.firebaseui-error{color:#dd2c00;direction:ltr;font-size:12px;line-height:16px;margin:-16px 0 16px;text-align:left}.firebaseui-error-wrapper{min-height:16px}.firebaseui-list-item{direction:ltr;margin:0;padding:0;text-align:left}.firebaseui-hidden{display:none}.firebaseui-relative-wrapper{position:relative}.firebaseui-label{color:rgba(0,0,0,0.54);direction:ltr;font-size:16px}.mdl-textfield--floating-label.is-focused .mdl-textfield__label,.mdl-textfield--floating-label.is-dirty .mdl-textfield__label{color:#757575}.firebaseui-input,.firebaseui-input-invalid{border-radius:0;color:rgba(0,0,0,0.87);direction:ltr;font-size:16px;width:100%}.firebaseui-input-invalid{border-color:#dd2c00}.firebaseui-textfield{width:100%}.firebaseui-textfield.mdl-textfield .firebaseui-input{border-color:rgba(0,0,0,0.12)}.firebaseui-textfield.mdl-textfield .firebaseui-label::after{background-color:#3f51b5}.firebaseui-textfield-invalid.mdl-textfield .firebaseui-input{border-color:#dd2c00}.firebaseui-textfield-invalid.mdl-textfield .firebaseui-label::after{background-color:#dd2c00}.firebaseui-button{display:inline-block;height:36px;margin-left:8px;min-width:88px}.firebaseui-link{color:#4285f4;font-variant:normal;font-weight:normal;text-decoration:none}.firebaseui-link:hover{text-decoration:underline}.firebaseui-form-actions{direction:ltr;float:right}.firebaseui-edit-action{background:url(https://www.gstatic.com/authtoolkit/image/edit.png) top left no-repeat;display:inline-block;line-height:25px;padding-left:30px}.firebaseui-remove-action{background:url(https://www.gstatic.com/authtoolkit/image/trash.png) top left no-repeat;display:inline-block;height:24px;margin-left:22px;width:24px}.firebaseui-indent{margin-left:1em}.firebaseui-tos{color:#757575;direction:ltr;font-size:12px;line-height:16px;margin-bottom:24px;text-align:left}.firebaseui-recommend-option{margin-bottom:24px;margin-top:-24px}.firebaseui-page-provider-sign-in{background:inherit}.firebaseui-idp-list{list-style:none;margin:1em 0;padding:0}.firebaseui-idp-button{direction:ltr;font-weight:500;height:40px;max-width:220px;padding-left:16px;text-align:left;width:100%}.firebaseui-idp-list>.firebaseui-list-item{margin-bottom:15px;text-align:center}.firebaseui-idp-icon{border:none;display:inline-block;height:18px;vertical-align:middle;width:18px}.firebaseui-idp-favicon{border:none;display:inline-block;height:14px;margin-right:5px;vertical-align:middle;width:14px}.firebaseui-idp-text{color:#fff;font-size:14px;padding-left:16px;text-transform:none;vertical-align:middle}.firebaseui-idp-text.firebaseui-idp-text-long{display:inline-block}.firebaseui-idp-text.firebaseui-idp-text-short{display:none}@media (max-width:268px){.firebaseui-idp-text.firebaseui-idp-text-long{display:none}.firebaseui-idp-text.firebaseui-idp-text-short{display:inline-block}}.firebaseui-idp-password,.firebaseui-idp-password:hover{background-color:#db4437}.firebaseui-idp-google,.firebaseui-idp-google:hover{background-color:#ffffff}.firebaseui-idp-google>.firebaseui-idp-text{color:#757575}.firebaseui-idp-github,.firebaseui-idp-github:hover{background-color:#333333}.firebaseui-idp-facebook,.firebaseui-idp-facebook:hover{background-color:#3b5998}.firebaseui-idp-twitter,.firebaseui-idp-twitter:hover{background-color:#55acee}.firebaseui-account-photo{display:inline-block;height:48px;margin-left:15px;vertical-align:middle;width:48px}.firebaseui-avatar-with-idp{direction:ltr;margin:10px 16px;text-align:left}.firebaseui-info-bar{background-color:#f9edbe;border:1px solid #f0c36d;box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);left:10%;padding:8px 16px;position:absolute;right:10%;text-align:center;top:0}.firebaseui-info-bar-message{font-size:12px;margin:0}.firebaseui-busy-indicator{height:2px;left:0;position:absolute;top:55px;width:100%}.firebaseui-callback-indicator-container .firebaseui-busy-indicator{top:0px}.firebaseui-callback-indicator-container{height:120px}.firebaseui-account-chip{background:#fff;border:1px solid #dcdcdc;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;display:inline-block;height:62px;padding:8px;position:relative;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;width:254px}.firebaseui-account-chip-photo{border:1px solid rgba(0,0,0,0.1);height:42px;left:8px;position:absolute;top:8px;width:42px}.firebaseui-account-chip-name,.firebaseui-account-chip-email,.firebaseui-account-chip-email-only{direction:ltr;display:block;line-height:18px;margin-left:52px;overflow:hidden;text-align:left;text-overflow:ellipsis}.firebaseui-account-chip-name{font-weight:bold;margin-top:2px;white-space:nowrap}.firebaseui-account-chip-email{color:#666}.firebaseui-account-chip-email-only{color:#111;font-weight:bold;margin-top:12px}.firebaseui-account-chip-email-label{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;width:165px}.firebaseui-manage-account-list{list-style:none;padding:0}.firebaseui-manage-account-list>.firebaseui-list-item{padding:1px}.firebaseui-manage-account-list>.firebaseui-list-item:last-of-type{border-bottom:none}.firebaseui-account-chip-list{list-style:none;margin:1em 0;padding:0}.firebaseui-account-chip-list>.firebaseui-list-item{margin-bottom:24px}.firebaseui-new-password-component{display:inline-block;position:relative;width:100%}.firebaseui-input-floating-button{background-position:center;background-repeat:no-repeat;display:block;height:24px;position:absolute;right:0;top:20px;width:24px}.firebaseui-input-toggle-on{background-image:url("//www.gstatic.com/images/icons/material/system/1x/visibility_black_24dp.png")}.firebaseui-input-toggle-off{background-image:url("//www.gstatic.com/images/icons/material/system/1x/visibility_off_black_24dp.png")}.firebaseui-input-toggle-focus{opacity:0.87}.firebaseui-input-toggle-blur{opacity:0.38}@media (max-width:480px){.firebaseui-container{box-shadow:none;max-width:none;width:100%}.firebaseui-card-header{border-bottom:1px solid #e0e0e0;margin-bottom:16px;padding:16px 24px 0 24px}.firebaseui-title{padding-bottom:16px}.firebaseui-card-footer{padding-right:24px}.firebaseui-busy-indicator{top:0px}}.mdl-textfield__label{font-weight:normal;margin-bottom:0} ================================================ FILE: vendors/firebase-ui-auth.js ================================================ /*! Terms: https://developers.google.com/terms */ (function(){var h,l=this,aa=function(a){return void 0!==a},ba=function(){},ca=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!= typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==b&&"undefined"==typeof a.call)return"object";return b},da=function(a){return null!=a},fa=function(a){return"array"==ca(a)},ga=function(a){var b=ca(a);return"array"==b||"object"==b&&"number"==typeof a.length},m=function(a){return"string"==typeof a},n=function(a){return"boolean"==typeof a},p=function(a){return"function"==ca(a)},ha=function(a){var b=typeof a;return"object"==b&&null!= a||"function"==b},ia=function(a,b,c){return a.call.apply(a.bind,arguments)},ja=function(a,b,c){if(!a)throw Error();if(2")&&(a=a.replace(ta,">"));-1!=a.indexOf('"')&&(a=a.replace(ua,"""));-1!=a.indexOf("'")&& (a=a.replace(va,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(wa,"�"));return a},ra=/&/g,sa=//g,ua=/"/g,va=/'/g,wa=/\x00/g,qa=/[\x00&<>"']/,ya=function(a,b){return ab?1:0};var za=function(a,b){b.unshift(a);u.call(this,oa.apply(null,b));b.shift()};t(za,u);za.prototype.name="AssertionError"; var Aa=function(a,b,c,d){var e="Assertion failed";if(c)var e=e+(": "+c),f=d;else a&&(e+=": "+a,f=b);throw new za(""+e,f||[]);},v=function(a,b,c){a||Aa("",null,b,Array.prototype.slice.call(arguments,2));return a},Ba=function(a,b){throw new za("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1));},Ca=function(a,b,c){"number"==typeof a||Aa("Expected number but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2));return a},Da=function(a,b,c){m(a)||Aa("Expected string but got %s: %s.", [ca(a),a],b,Array.prototype.slice.call(arguments,2));return a},Ea=function(a,b,c){p(a)||Aa("Expected function but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2))},Fa=function(a,b,c){ha(a)||Aa("Expected object but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2));return a},Ga=function(a,b,c){fa(a)||Aa("Expected array but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2));return a};var Ha=Array.prototype.indexOf?function(a,b,c){v(null!=a.length);return Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(m(a))return m(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var Ua=function(a){if(a.classList)return a.classList;a=a.className;return m(a)&&a.match(/\S+/g)||[]},Va=function(a,b){return a.classList?a.classList.contains(b):Na(Ua(a),b)},Wa=function(a,b){a.classList?a.classList.add(b):Va(a,b)||(a.className+=0parseFloat(Ab)){zb=String(Cb);break a}}zb=Ab} var Db=zb,Eb={},B=function(a){var b;if(!(b=Eb[a])){b=0;for(var c=pa(String(Db)).split("."),d=pa(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f");f=f.join("")}f=d.createElement(f);g&&(m(g)?f.className=g:fa(g)?f.className=g.join(" "):Pb(f,g));22*this.count_&&Zb(this),!0):!1};var Zb=function(a){if(a.count_!=a.keys_.length){for(var b=0,c=0;b=d.keys_.length)throw Wb;var e=d.keys_[b++];return a?e:d.map_[e]};return e};var $b=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)};var C=function(a){var b=a.type;if(!aa(b))return null;switch(b.toLowerCase()){case "checkbox":case "radio":return a.checked?a.value:null;case "select-one":return b=a.selectedIndex,0<=b?a.options[b].value:null;case "select-multiple":for(var b=[],c,d=0;c=a.options[d];d++)c.selected&&b.push(c.value);return b.length?b:null;default:return aa(a.value)?a.value:null}};var ac=function(a){ac[" "](a);return a};ac[" "]=ba;var bc=!z||9<=Number(Gb),cc=z&&!B("9");!A||B("528");vb&&B("1.9b")||z&&B("8")||sb&&B("9.5")||A&&B("528");vb&&!B("8")||z&&B("9");var dc=function(){this.disposed_=this.disposed_;this.onDisposeCallbacks_=this.onDisposeCallbacks_};dc.prototype.disposed_=!1;dc.prototype.isDisposed=function(){return this.disposed_};dc.prototype.dispose=function(){this.disposed_||(this.disposed_=!0,this.disposeInternal())};var ec=function(a,b){a.disposed_?b.call(void 0):(a.onDisposeCallbacks_||(a.onDisposeCallbacks_=[]),a.onDisposeCallbacks_.push(aa(void 0)?q(b,void 0):b))};dc.prototype.disposeInternal=function(){if(this.onDisposeCallbacks_)for(;this.onDisposeCallbacks_.length;)this.onDisposeCallbacks_.shift()()}; var fc=function(a){a&&"function"==typeof a.dispose&&a.dispose()};var gc=function(a,b){this.type=a;this.currentTarget=this.target=b;this.defaultPrevented=this.propagationStopped_=!1;this.returnValue_=!0};gc.prototype.stopPropagation=function(){this.propagationStopped_=!0};gc.prototype.preventDefault=function(){this.defaultPrevented=!0;this.returnValue_=!1};var E=function(a,b){gc.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.charCode=this.keyCode=this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.event_=this.state=null;a&&this.init(a,b)};t(E,gc); E.prototype.init=function(a,b){var c=this.type=a.type,d=a.changedTouches?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.currentTarget=b;var e=a.relatedTarget;if(e){if(vb){var f;a:{try{ac(e.nodeName);f=!0;break a}catch(g){}f=!1}f||(e=null)}}else"mouseover"==c?e=a.fromElement:"mouseout"==c&&(e=a.toElement);this.relatedTarget=e;null===d?(this.offsetX=A||void 0!==a.offsetX?a.offsetX:a.layerX,this.offsetY=A||void 0!==a.offsetY?a.offsetY:a.layerY,this.clientX=void 0!==a.clientX?a.clientX: a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0):(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0);this.button=a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||("keypress"==c?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.state=a.state;this.event_=a;a.defaultPrevented&& this.preventDefault()};E.prototype.stopPropagation=function(){E.superClass_.stopPropagation.call(this);this.event_.stopPropagation?this.event_.stopPropagation():this.event_.cancelBubble=!0};E.prototype.preventDefault=function(){E.superClass_.preventDefault.call(this);var a=this.event_;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,cc)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var hc="closure_listenable_"+(1E6*Math.random()|0),ic=function(a){return!(!a||!a[hc])},jc=0;var kc=function(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.handler=e;this.key=++jc;this.removed=this.callOnce=!1},lc=function(a){a.removed=!0;a.listener=null;a.proxy=null;a.src=null;a.handler=null};var mc=function(a){this.src=a;this.listeners={};this.typeCount_=0};mc.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.listeners[f];a||(a=this.listeners[f]=[],this.typeCount_++);var g=nc(a,b,d,e);-1e.keyCode||void 0!=e.returnValue)){a:{var f=!1;if(0==e.keyCode)try{e.keyCode=-1;break a}catch(w){f=!0}if(f||void 0==e.returnValue)e.returnValue=!0}e=[];for(f=c.currentTarget;f;f=f.parentNode)e.push(f);for(var f=a.type,g= e.length-1;!c.propagationStopped_&&0<=g;g--){c.currentTarget=e[g];var k=Dc(e[g],f,!0,c),d=d&&k}for(g=0;!c.propagationStopped_&&g>>0),tc=function(a){v(a,"Listener can not be null.");if(p(a))return a;v(a.handleEvent,"An object listener must have handleEvent method.");a[Ec]||(a[Ec]=function(b){return a.handleEvent(b)}); return a[Ec]};var F=function(){dc.call(this);this.eventTargetListeners_=new mc(this);this.actualEventTarget_=this;this.parentEventTarget_=null};t(F,dc);F.prototype[hc]=!0;h=F.prototype;h.setParentEventTarget=function(a){this.parentEventTarget_=a};h.addEventListener=function(a,b,c,d){sc(this,a,b,c,d)};h.removeEventListener=function(a,b,c,d){Ac(this,a,b,c,d)}; h.dispatchEvent=function(a){Fc(this);var b,c=this.parentEventTarget_;if(c){b=[];for(var d=1;c;c=c.parentEventTarget_)b.push(c),v(1E3>++d,"infinite loop")}c=this.actualEventTarget_;d=a.type||a;if(m(a))a=new gc(a,c);else if(a instanceof gc)a.target=a.target||c;else{var e=a;a=new gc(d,c);ab(a,e)}var e=!0,f;if(b)for(var g=b.length-1;!a.propagationStopped_&&0<=g;g--)f=a.currentTarget=b[g],e=Gc(f,d,!0,a)&&e;a.propagationStopped_||(f=a.currentTarget=c,e=Gc(f,d,!0,a)&&e,a.propagationStopped_||(e=Gc(f,d,!1, a)&&e));if(b)for(g=0;!a.propagationStopped_&&g=a.keyCode)return!1;switch(a.keyCode){case 18:case 20:case 93:case 17:case 40:case 35:case 27:case 36:case 45:case 37:case 224:case 91:case 144:case 12:case 34:case 33:case 19:case 255:case 44:case 39:case 145:case 16:case 38:case 252:case 224:case 92:return!1;case 0:return!vb;default:return 166>a.keyCode||183=a||96<=a&&106>=a||65<=a&&90>=a||(A||tb)&&0==a)return!0;switch(a){case 32:case 43:case 63:case 64:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0; default:return!1}},Jc=function(a){if(vb)a=Lc(a);else if(xb&&A)a:switch(a){case 93:a=91;break a}return a},Lc=function(a){switch(a){case 61:return 187;case 59:return 186;case 173:return 189;case 224:return 91;case 0:return 224;default:return a}};var Nc=function(a){F.call(this);this.element_=a;sc(a,Mc,this.handleKeyDown_,!1,this);sc(a,"click",this.handleClick_,!1,this)};t(Nc,F);var Mc=vb?"keypress":"keydown";Nc.prototype.handleKeyDown_=function(a){(13==a.keyCode||A&&3==a.keyCode)&&Oc(this,a)};Nc.prototype.handleClick_=function(a){Oc(this,a)};var Oc=function(a,b){var c=new Pc(b);if(a.dispatchEvent(c)){c=new Qc(b);try{a.dispatchEvent(c)}finally{b.stopPropagation()}}}; Nc.prototype.disposeInternal=function(){Nc.superClass_.disposeInternal.call(this);Ac(this.element_,Mc,this.handleKeyDown_,!1,this);Ac(this.element_,"click",this.handleClick_,!1,this);delete this.element_};var Qc=function(a){E.call(this,a.event_);this.type="action"};t(Qc,E);var Pc=function(a){E.call(this,a.event_);this.type="beforeaction"};t(Pc,E);var Rc=function(a){F.call(this);this.element_=a;a=z?"focusout":"blur";this.listenKeyIn_=sc(this.element_,z?"focusin":"focus",this,!z);this.listenKeyOut_=sc(this.element_,a,this,!z)};t(Rc,F);Rc.prototype.handleEvent=function(a){var b=new E(a.event_);b.type="focusin"==a.type||"focus"==a.type?"focusin":"focusout";this.dispatchEvent(b)};Rc.prototype.disposeInternal=function(){Rc.superClass_.disposeInternal.call(this);Bc(this.listenKeyIn_);Bc(this.listenKeyOut_);delete this.element_};var Sc=function(a,b,c){this.limit_=c;this.create_=a;this.reset_=b;this.occupants_=0;this.head_=null};Sc.prototype.get=function(){var a;0b.charCode&&Ic(c)?b.charCode:0):sb&&!A?(c=this.keyCode_,d=Ic(c)?b.keyCode:0):(c=b.keyCode||this.keyCode_,d=b.charCode||0,Hd&&(e=this.altKey_),xb&&63==d&&224==c&&(c=191));var f=c=Jc(c),g=b.keyIdentifier;c?63232<=c&&c in Ed?f=Ed[c]:25==c&&a.shiftKey&&(f=9):g&&g in Fd&&(f=Fd[g]);a=f==this.lastKey_;this.lastKey_= f;b=new Id(f,d,a,b);b.altKey=e;this.dispatchEvent(b)};h.getElement=function(){return this.element_};h.detach=function(){this.keyPressKey_&&(Bc(this.keyPressKey_),Bc(this.keyDownKey_),Bc(this.keyUpKey_),this.keyUpKey_=this.keyDownKey_=this.keyPressKey_=null);this.element_=null;this.keyCode_=this.lastKey_=-1};h.disposeInternal=function(){Dd.superClass_.disposeInternal.call(this);this.detach()};var Id=function(a,b,c,d){E.call(this,d);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=c}; t(Id,E);var Jd=function(){};Jd.getInstance=function(){return Jd.instance_?Jd.instance_:Jd.instance_=new Jd};Jd.prototype.nextId_=0;var G=function(a){F.call(this);this.dom_=a||Lb();this.id_=null;this.inDocument_=!1;this.element_=null;this.googUiComponentHandler_=void 0;this.childIndex_=this.children_=this.parent_=null;this.wasDecorated_=!1};t(G,F);G.prototype.idGenerator_=Jd.getInstance();G.prototype.getId=function(){return this.id_||(this.id_=":"+(this.idGenerator_.nextId_++).toString(36))}; var Kd=function(a,b){if(a.parent_&&a.parent_.childIndex_){var c=a.parent_.childIndex_,d=a.id_;d in c&&delete c[d];Za(a.parent_.childIndex_,b,a)}a.id_=b};G.prototype.getElement=function(){return this.element_};G.prototype.getElementsByClass=function(a){return this.element_?this.dom_.getElementsByClass(a,this.element_):[]};G.prototype.getElementByClass=function(a){return this.element_?this.dom_.getElementByClass(a,this.element_):null}; var Ld=function(a){a.googUiComponentHandler_||(a.googUiComponentHandler_=new xd(a));return a.googUiComponentHandler_},Nd=function(a,b){if(a==b)throw Error("Unable to set parent component");if(b&&a.parent_&&a.id_&&Md(a.parent_,a.id_)&&a.parent_!=b)throw Error("Unable to set parent component");a.parent_=b;G.superClass_.setParentEventTarget.call(a,b)};h=G.prototype;h.getParent=function(){return this.parent_}; h.setParentEventTarget=function(a){if(this.parent_&&this.parent_!=a)throw Error("Method not supported");G.superClass_.setParentEventTarget.call(this,a)};h.getDomHelper=function(){return this.dom_};h.createDom=function(){this.element_=this.dom_.createElement("DIV")}; h.render=function(a){if(this.inDocument_)throw Error("Component already rendered");this.element_||this.createDom();a?a.insertBefore(this.element_,null):this.dom_.document_.body.appendChild(this.element_);this.parent_&&!this.parent_.inDocument_||this.enterDocument()};h.enterDocument=function(){this.inDocument_=!0;Od(this,function(a){!a.inDocument_&&a.getElement()&&a.enterDocument()})}; h.exitDocument=function(){Od(this,function(a){a.inDocument_&&a.exitDocument()});this.googUiComponentHandler_&&this.googUiComponentHandler_.removeAll();this.inDocument_=!1};h.disposeInternal=function(){this.inDocument_&&this.exitDocument();this.googUiComponentHandler_&&(this.googUiComponentHandler_.dispose(),delete this.googUiComponentHandler_);Od(this,function(a){a.dispose()});!this.wasDecorated_&&this.element_&&Sb(this.element_);this.parent_=this.element_=this.childIndex_=this.children_=null;G.superClass_.disposeInternal.call(this)}; var Md=function(a,b){var c;a.childIndex_&&b?(c=a.childIndex_,c=(null!==c&&b in c?c[b]:void 0)||null):c=null;return c},Od=function(a,b){a.children_&&Ia(a.children_,b,void 0)};G.prototype.removeChild=function(a,b){if(a){var c=m(a)?a:a.getId();a=Md(this,c);if(c&&a){var d=this.childIndex_;c in d&&delete d[c];Pa(this.children_,a);b&&(a.exitDocument(),a.element_&&Sb(a.element_));Nd(a,null)}}if(!a)throw Error("Child is not in parent component");return a};var H=function(a,b){var c;c=Ub(a);b?(Xa(a,"firebaseui-input-invalid"),Wa(a,"firebaseui-input"),c&&Xa(c,"firebaseui-textfield-invalid")):(Xa(a,"firebaseui-input"),Wa(a,"firebaseui-input-invalid"),c&&Wa(c,"firebaseui-textfield-invalid"))},Pd=function(a,b,c){b=new Ad(b);ec(a,ka(fc,b));Ld(a).listen(b,"input",c)},Qd=function(a,b,c){b=new Dd(b);ec(a,ka(fc,b));Ld(a).listen(b,"key",function(a){13==a.keyCode&&(a.stopPropagation(),a.preventDefault(),c(a))})},Rd=function(a,b,c){b=new Rc(b);ec(a,ka(fc,b));Ld(a).listen(b, "focusin",c)},Sd=function(a,b,c){b=new Rc(b);ec(a,ka(fc,b));Ld(a).listen(b,"focusout",c)},Td=function(a,b,c){b=new Nc(b);ec(a,ka(fc,b));Ld(a).listen(b,"action",function(a){a.stopPropagation();a.preventDefault();c(a)})},Ud=function(a){Wa(a,"firebaseui-hidden")},Vd=function(a,b){if(b)if(v(null!=a,"goog.dom.setTextContent expects a non-null value for node"),"textContent"in a)a.textContent=b;else if(3==a.nodeType)a.data=b;else if(a.firstChild&&3==a.firstChild.nodeType){for(;a.lastChild!=a.firstChild;)a.removeChild(a.lastChild); a.firstChild.data=b}else{for(var c;c=a.firstChild;)a.removeChild(c);c=Kb(a);a.appendChild(c.createTextNode(String(b)))}Xa(a,"firebaseui-hidden")},Wd=function(a){return!Va(a,"firebaseui-hidden")&&"none"!=a.style.display};z&&B(8);var Xd={sanitizedContentKindHtml:!0},Yd={sanitizedContentUri:!0},Zd={sanitizedContentTrustedResourceUri:!0},$d={sanitizedContentKindText:!0},I=function(){throw Error("Do not instantiate directly");};I.prototype.contentDir=null;I.prototype.toString=function(){return this.content};var ae=function(){I.call(this)};t(ae,I);var be=function(){I.call(this)};t(be,I);var fe=function(a,b,c,d){v(a,"Soy template may not be null.");a:if(a=a(b||ce,void 0,c),d=(d||Lb()).createElement("DIV"),a=de(a),b=a.match(ee),v(!b,"This template starts with a %s, which cannot be a child of a
, as required by soy internals. Consider using goog.soy.renderElement instead.\nTemplate output: %s",b&&b[0],a),d.innerHTML=a,1==d.childNodes.length&&(a=d.firstChild,1==a.nodeType)){d=a;break a}return d},de=function(a){if(!ha(a))return String(a);if(a instanceof I){if(a.contentKind===Xd)return Da(a.content); if(a.contentKind===$d)return xa(a.content)}Ba("Soy template output is unsafe for use as HTML: "+a);return"zSoyz"},ee=/^<(body|caption|col|colgroup|head|html|tr|td|th|tbody|thead|tfoot)>/i,ce={};var ge=function(a){if(null!=a)switch(a.contentDir){case 1:return 1;case -1:return-1;case 0:return 0}return null},he=function(){I.call(this)};t(he,I);he.prototype.contentKind=Xd;var K=function(a){return null!=a&&a.contentKind===Xd?(v(a.constructor===he),a):a instanceof qb?J(rb(a),a.getDirection()):J(xa(String(String(a))),ge(a))},ie=function(){I.call(this)};t(ie,I);ie.prototype.contentKind={sanitizedContentJsChars:!0};ie.prototype.contentDir=1;var je=function(){I.call(this)};t(je,I); je.prototype.contentKind=Yd;je.prototype.contentDir=1;var ke=function(){I.call(this)};t(ke,I);ke.prototype.contentKind=Zd;ke.prototype.contentDir=1;var le=function(){I.call(this)};t(le,I);le.prototype.contentKind={sanitizedContentHtmlAttribute:!0};le.prototype.contentDir=1;var me=function(){I.call(this)};t(me,be);me.prototype.contentKind={sanitizedContentCss:!0};me.prototype.contentDir=1;var ne=function(a,b){this.content=String(a);this.contentDir=null!=b?b:null};t(ne,ae); ne.prototype.contentKind=$d;var oe=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return new b(String(a))}},pe=function(a){return new ne(a,void 0)},J=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=new b(String(a));void 0!==d&&(e.contentDir=d);return e}}(he);oe(ie);var qe=oe(je);oe(ke);oe(le);oe(me);var re=function(a){return(a=String(a))?new ne(a,void 0):""}; (function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=String(a);if(!e)return"";e=new b(e);void 0!==d&&(e.contentDir=d);return e}})(he); var L=function(a){return null!=a&&a.contentKind===Xd?(v(a.constructor===he),String(String(a.content).replace(se,"").replace(te,"<")).replace(ue,ve)):xa(String(a))},Ae=function(a){if(null!=a&&a.contentKind===Yd)return v(a.constructor===je),we(a);if(null!=a&&a.contentKind===Zd)return v(a.constructor===ke),we(a);a instanceof y?a=we(ib(a)):a instanceof nb?a=we(ob(a)):(a=String(a),xe.test(a)?a=a.replace(ye,ze):(Ba("Bad value `%s` for |filterNormalizeUri",[a]),a="#zSoyz"));return a},Ce=function(a){if(null!= a&&a.contentKind===Yd)return v(a.constructor===je),we(a);if(null!=a&&a.contentKind===Zd)return v(a.constructor===ke),we(a);a instanceof y?a=we(ib(a)):a instanceof nb?a=we(ob(a)):(a=String(a),Be.test(a)?a=a.replace(ye,ze):(Ba("Bad value `%s` for |filterNormalizeMediaUri",[a]),a="about:invalid#zSoyz"));return a},M=function(a,b,c,d){c=c instanceof Function?c.displayName||c.name||"unknown type name":c instanceof Object?c.constructor.displayName||c.constructor.name||Object.prototype.toString.call(c):null=== c?"null":typeof c;v(a,"expected param "+b+" of type "+d+(", but got "+c)+".",void 0)},De={"\x00":"�","\t":" ","\n":" ","\x0B":" ","\f":" ","\r":" "," ":" ",'"':""","&":"&","'":"'","-":"-","/":"/","<":"<","=":"=",">":">","`":"`","\u0085":"…","\u00a0":" ","\u2028":"
","\u2029":"
"},ve=function(a){return De[a]},Ee={"\x00":"\\x00","\b":"\\x08","\t":"\\t","\n":"\\n","\x0B":"\\x0b","\f":"\\f","\r":"\\r",'"':"\\x22",$:"\\x24", "&":"\\x26","'":"\\x27","(":"\\x28",")":"\\x29","*":"\\x2a","+":"\\x2b",",":"\\x2c","-":"\\x2d",".":"\\x2e","/":"\\/",":":"\\x3a","<":"\\x3c","=":"\\x3d",">":"\\x3e","?":"\\x3f","[":"\\x5b","\\":"\\\\","]":"\\x5d","^":"\\x5e","{":"\\x7b","|":"\\x7c","}":"\\x7d","\u0085":"\\x85","\u2028":"\\u2028","\u2029":"\\u2029"},Fe=function(a){return Ee[a]},Ge={"\x00":"%00","\u0001":"%01","\u0002":"%02","\u0003":"%03","\u0004":"%04","\u0005":"%05","\u0006":"%06","\u0007":"%07","\b":"%08","\t":"%09","\n":"%0A", "\x0B":"%0B","\f":"%0C","\r":"%0D","\u000e":"%0E","\u000f":"%0F","\u0010":"%10","\u0011":"%11","\u0012":"%12","\u0013":"%13","\u0014":"%14","\u0015":"%15","\u0016":"%16","\u0017":"%17","\u0018":"%18","\u0019":"%19","\u001a":"%1A","\u001b":"%1B","\u001c":"%1C","\u001d":"%1D","\u001e":"%1E","\u001f":"%1F"," ":"%20",'"':"%22","'":"%27","(":"%28",")":"%29","<":"%3C",">":"%3E","\\":"%5C","{":"%7B","}":"%7D","\u007f":"%7F","\u0085":"%C2%85","\u00a0":"%C2%A0","\u2028":"%E2%80%A8","\u2029":"%E2%80%A9","\uff01":"%EF%BC%81", "\uff03":"%EF%BC%83","\uff04":"%EF%BC%84","\uff06":"%EF%BC%86","\uff07":"%EF%BC%87","\uff08":"%EF%BC%88","\uff09":"%EF%BC%89","\uff0a":"%EF%BC%8A","\uff0b":"%EF%BC%8B","\uff0c":"%EF%BC%8C","\uff0f":"%EF%BC%8F","\uff1a":"%EF%BC%9A","\uff1b":"%EF%BC%9B","\uff1d":"%EF%BC%9D","\uff1f":"%EF%BC%9F","\uff20":"%EF%BC%A0","\uff3b":"%EF%BC%BB","\uff3d":"%EF%BC%BD"},ze=function(a){return Ge[a]},ue=/[\x00\x22\x27\x3c\x3e]/g,He=/[\x00\x08-\x0d\x22\x26\x27\/\x3c-\x3e\\\x85\u2028\u2029]/g,ye=/[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g, xe=/^(?![^#?]*\/(?:\.|%2E){2}(?:[\/?#]|$))(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i,Be=/^[^&:\/?#]*(?:[\/?#]|$)|^https?:|^data:image\/[a-z0-9+]+;base64,[a-z0-9+\/]+=*$|^blob:/i,we=function(a){return String(a).replace(ye,ze)},se=/<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g,te=/

');return J(d)},P=function(a){a=a||{};M(null==a.label||a.label instanceof I||m(a.label),"label",a.label,"null|string|undefined");a=a.label; var b='")},We=function(){var a;a=""+P({label:re("Sign In")});return J(a)},Xe=function(){var a;a=""+P({label:re("Save")});return J(a)},Ye=function(a){a=a||{};M(null==a.label||a.label instanceof I||m(a.label),"label",a.label,"null|string|undefined");a=a.label;var b='

')},Ze=function(){var a; a={};M(null==a.current||n(a.current)||1===a.current||0===a.current,"current",a.current,"boolean|null|undefined");var b='

')}, $e=function(){return J('Trouble signing in?')},af=function(){return J('')},bf=function(a){M(m(a.message)||a.message instanceof I,"message",a.message,"string|goog.soy.data.SanitizedContent");a=""+('

'+ K(a.message)+'  Dismiss

');return J(a)};bf.soyTemplateName="firebaseui.auth.soy2.element.infoBar";var cf=function(){return J('
')};cf.soyTemplateName="firebaseui.auth.soy2.element.busyIndicator"; var df=function(a){var b;a=a||{};M(null==a.providerId||a.providerId instanceof I||m(a.providerId),"providerId",a.providerId,"null|string|undefined");var c="";switch(ha(b=a.providerId)?b.toString():b){case "google.com":c+="Google";break;case "github.com":c+="Github";break;case "facebook.com":c+="Facebook";break;case "twitter.com":c+="Twitter";break;default:c+="Password"}return pe(c)},ef=function(a){var b;a=a||{};M(null==a.providerId||a.providerId instanceof I||m(a.providerId),"providerId",a.providerId, "null|string|undefined");var c="";switch(ha(b=a.providerId)?b.toString():b){case "google.com":c+="firebaseui-idp-google";break;case "github.com":c+="firebaseui-idp-github";break;case "facebook.com":c+="firebaseui-idp-facebook";break;case "twitter.com":c+="firebaseui-idp-twitter";break;default:c+="firebaseui-idp-password"}return pe(c)},ff=function(a,b){var c;a=a||{};M(null==a.providerId||a.providerId instanceof I||m(a.providerId),"providerId",a.providerId,"null|string|undefined");var d="";switch(ha(c= a.providerId)?c.toString():c){case "google.com":d+=Ae(b.googleLogo);break;case "github.com":d+=Ae(b.githubLogo);break;case "facebook.com":d+=Ae(b.facebookLogo);break;case "twitter.com":d+=Ae(b.twitterLogo);break;default:d+=Ae(b.passwordLogo)}return qe(d)};var hf=function(){Sb(gf.call(this))},gf=function(){return this.getElementByClass("firebaseui-id-info-bar")},jf=function(){return this.getElementByClass("firebaseui-id-dismiss-info-bar")};var kf=function(){return this.getElementByClass("firebaseui-id-name")},lf=function(){return this.getElementByClass("firebaseui-id-name-error")};var mf=function(){return this.getElementByClass("firebaseui-id-new-password")},nf=function(){return this.getElementByClass("firebaseui-id-password-toggle")},of=function(){this.isPasswordVisible_=!this.isPasswordVisible_;var a=nf.call(this),b=mf.call(this);this.isPasswordVisible_?(b.type="text",Wa(a,"firebaseui-input-toggle-off"),Xa(a,"firebaseui-input-toggle-on")):(b.type="password",Wa(a,"firebaseui-input-toggle-on"),Xa(a,"firebaseui-input-toggle-off"));b.focus()},pf=function(){return this.getElementByClass("firebaseui-id-new-password-error")}, qf=function(){this.isPasswordVisible_=!1;var a=mf.call(this);a.type="password";var b=pf.call(this);Pd(this,a,function(){Wd(b)&&(H(a,!0),Ud(b))});var c=nf.call(this);Wa(c,"firebaseui-input-toggle-on");Xa(c,"firebaseui-input-toggle-off");Rd(this,a,function(){Wa(c,"firebaseui-input-toggle-focus");Xa(c,"firebaseui-input-toggle-blur")});Sd(this,a,function(){Wa(c,"firebaseui-input-toggle-blur");Xa(c,"firebaseui-input-toggle-focus")});Td(this,c,q(of,this))},rf=function(){var a=mf.call(this),b;b=pf.call(this); C(a)?(H(a,!0),Ud(b),b=!0):(H(a,!1),Vd(b,pe("Enter your password").toString()),b=!1);return b?C(a):null};var sf=function(){return this.getElementByClass("firebaseui-id-password")},tf=function(){return this.getElementByClass("firebaseui-id-password-error")},uf=function(){var a=sf.call(this),b=tf.call(this);Pd(this,a,function(){Wd(b)&&(H(a,!0),Ud(b))})},vf=function(){var a=sf.call(this),b;b=tf.call(this);C(a)?(H(a,!0),Ud(b),b=!0):(H(a,!1),Vd(b,pe("Enter your password").toString()),b=!1);return b?C(a):null};var wf=function(a,b,c){a=a||{};c=c||{};M(null==a.email||a.email instanceof I||m(a.email),"email",a.email,"null|string|undefined");a=""+('");return J(a)};wf.soyTemplateName="firebaseui.auth.soy2.page.signIn"; var xf=function(a,b,c){a=a||{};c=c||{};M(null==a.email||a.email instanceof I||m(a.email),"email",a.email,"null|string|undefined");a=""+('");return J(a)};xf.soyTemplateName="firebaseui.auth.soy2.page.passwordSignIn"; var yf=function(a,b,c){a=a||{};c=c||{};M(null==a.email||a.email instanceof I||m(a.email),"email",a.email,"null|string|undefined");M(null==a.name||a.name instanceof I||m(a.name),"name",a.name,"null|string|undefined");M(null==a.tosUrl||a.tosUrl instanceof I||m(a.tosUrl),"tosUrl",a.tosUrl,"null|string|undefined");var d=a.tosUrl;M(null==a.allowCancel||n(a.allowCancel)||1===a.allowCancel||0===a.allowCancel,"allowCancel",a.allowCancel,"boolean|null|undefined");b=a.allowCancel;c='");return J(b)};yf.soyTemplateName="firebaseui.auth.soy2.page.passwordSignUp"; var zf=function(a,b,c){a=a||{};c=c||{};M(null==a.email||a.email instanceof I||m(a.email),"email",a.email,"null|string|undefined");M(null==a.allowCancel||n(a.allowCancel)||1===a.allowCancel||0===a.allowCancel,"allowCancel",a.allowCancel,"boolean|null|undefined");b=a.allowCancel;a=""+('

Recover password

Get instructions sent to this email that explain how to reset your password

'+ K(Ve(a))+'
");return J(a)};zf.soyTemplateName="firebaseui.auth.soy2.page.passwordRecovery"; var Af=function(a){M(m(a.email)||a.email instanceof I,"email",a.email,"string|goog.soy.data.SanitizedContent");var b=a.email;M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=a.allowContinue;var c="",b="Follow the instructions sent to "+(K(b)+" to recover your password"),c=c+('

Check your email

'+ b+'

")};Af.soyTemplateName="firebaseui.auth.soy2.page.passwordRecoveryEmailSent";var Bf=function(){return J('
'+K(cf())+"
")};Bf.soyTemplateName="firebaseui.auth.soy2.page.callback"; var Cf=function(a,b,c){c=c||{};M(m(a.email)||a.email instanceof I,"email",a.email,"string|goog.soy.data.SanitizedContent");b="";a="You\u2019ve already used "+(K(a.email)+" to sign in. Enter your password for that account.");b+='

Sign in

You already have an account

'+ a+"

"+K(Ze())+'
";return J(b)};Cf.soyTemplateName="firebaseui.auth.soy2.page.passwordLinking"; var Df=function(a,b,c){c=c||{};M(m(a.email)||a.email instanceof I,"email",a.email,"string|goog.soy.data.SanitizedContent");var d=a.email;M(m(a.providerId)||a.providerId instanceof I,"providerId",a.providerId,"string|goog.soy.data.SanitizedContent");b="";var e=""+df(a),e=re(e);a="Sign in with "+e;d="You\u2019ve already used "+(K(d)+(". Sign in with "+(K(e)+" to continue.")));b+='

Sign in

You already have an account

'+d+'

";return J(b)};Df.soyTemplateName="firebaseui.auth.soy2.page.federatedLinking"; var Ef=function(a,b,c){c=c||{};M(m(a.email)||a.email instanceof I,"email",a.email,"string|goog.soy.data.SanitizedContent");b="";var d='

for '+(K(a.email)+"

");c='

Reset your password

'+ d;var d={label:re("New password")},e;for(e in a)e in d||(d[e]=a[e]);b+=c+K(Ye(d))+'
";return J(b)};Ef.soyTemplateName="firebaseui.auth.soy2.page.passwordReset"; var Ff=function(a){a=a||{};M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=""+('

Password changed

You can now sign in with your new password

");return J(a)};Ff.soyTemplateName="firebaseui.auth.soy2.page.passwordResetSuccess"; var Gf=function(a){a=a||{};M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=""+('

Try resetting your password again

Your request to reset your password has expired or the link has already been used

");return J(a)};Gf.soyTemplateName="firebaseui.auth.soy2.page.passwordResetFailure"; var Hf=function(a,b,c){c=c||{};M(m(a.email)||a.email instanceof I,"email",a.email,"string|goog.soy.data.SanitizedContent");b=a.email;M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=a.allowContinue;var d="";b="Your sign-in email address has been changed back to "+(K(b)+".");d+='

Updated email address

'+b+'

If you didn\u2019t ask to change your sign-in email, it\u2019s possible someone is trying to access your account and you should change your password right away.

";return J(d)};Hf.soyTemplateName="firebaseui.auth.soy2.page.emailChangeRevokeSuccess"; var If=function(a){a=a||{};M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=""+('

Unable to update your email address

There was a problem changing your sign-in email back.

If you try again and still can\u2019t reset your email, try asking your administrator for help.

");return J(a)};If.soyTemplateName="firebaseui.auth.soy2.page.emailChangeRevokeFailure"; var Jf=function(a){a=a||{};M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=""+('

Your email has been verified

You can now sign in with your new account

");return J(a)};Jf.soyTemplateName="firebaseui.auth.soy2.page.emailVerificationSuccess"; var Kf=function(a){a=a||{};M(null==a.allowContinue||n(a.allowContinue)||1===a.allowContinue||0===a.allowContinue,"allowContinue",a.allowContinue,"boolean|null|undefined");a=""+('

Try verifying your email again

Your request to verify your email has expired or the link has already been used

");return J(a)};Kf.soyTemplateName="firebaseui.auth.soy2.page.emailVerificationFailure"; var Lf=function(a){a=a||{};M(null==a.email||a.email instanceof I||m(a.email),"email",a.email,"null|string|undefined");a=a.email;var b;b='

Email address

';b=a?b+("Your current email address on file is:
"+K(a)+""):b+"You don't have any email address associated with your account."; return J(b+'

Update email address

')};Lf.soyTemplateName="firebaseui.auth.soy2.page.emailInfo"; var Mf=function(a,b,c){a=a||{};c=c||{};M(null==a.email||a.email instanceof I||m(a.email),"email",a.email,"null|string|undefined");a=a.email;c=""+('

Update email address

');c=a?c+("Your current email address on file is:
"+ K(a)+""):c+"You don't have any email address for your account.";c+="

"+K(Ve({changeEmail:!0}))+'
";return J(c)};Mf.soyTemplateName="firebaseui.auth.soy2.page.emailChange";var Nf=function(){return J('')}; Nf.soyTemplateName="firebaseui.auth.soy2.page.passwordInfo"; var Of=function(a,b,c){c=c||{};a=""+('

Change password

Set a new password for your account. We highly recommend you create a unique password, one that you don\'t use on any other website.

'+K(Ye(null))+ '
");return J(a)};Of.soyTemplateName="firebaseui.auth.soy2.page.passwordChange"; var Pf=function(){var a;a=""+('

Password Updated

You have successfully changed your password.

");return J(a)};Pf.soyTemplateName="firebaseui.auth.soy2.page.passwordChangeSuccess"; var Qf=function(a){M(m(a.errorMessage)||a.errorMessage instanceof I,"errorMessage",a.errorMessage,"string|goog.soy.data.SanitizedContent");a=""+('

Error encountered

'+K(a.errorMessage)+"

");return J(a)};Qf.soyTemplateName="firebaseui.auth.soy2.page.unrecoverableError"; var Rf=function(a,b,c){b=Ga(a.accounts,"expected parameter 'accounts' of type list<[displayName: null|string, email: null|string, photoURL: null|string, providerId: null|string]>.");var d=Ga(a.providerIds,"expected parameter 'providerIds' of type list.");M(null==a.siteName||a.siteName instanceof I||m(a.siteName),"siteName",a.siteName,"null|string|undefined");a=a.siteName;var e;e='

Linked accounts

'; if(0';a?(a="Below are one or more ways you sign in to "+(K(a)+"."),e+=a):e+="Below are one or more ways you sign in to this site.";e+='

");k='
  • '+K(k)+'
  • '}e+=""}else e+='

    ',a?(c="You have not signed in to "+(K(a)+" with any other ways."),e+=c):e+="You have not signed in to this site with any other ways.",e+="

    ";return J(e+"
    ")};Rf.soyTemplateName="firebaseui.auth.soy2.page.linkedAccounts"; var Sf=function(a){a=a||{};M(null==a.showTitle||n(a.showTitle)||1===a.showTitle||0===a.showTitle,"showTitle",a.showTitle,"boolean|null|undefined");var b='')}; Sf.soyTemplateName="firebaseui.auth.soy2.page.accountManage"; var Tf=function(a,b,c){c=c||{};M(m(a.userEmail)||a.userEmail instanceof I,"userEmail",a.userEmail,"string|goog.soy.data.SanitizedContent");var d=a.userEmail;M(m(a.pendingEmail)||a.pendingEmail instanceof I,"pendingEmail",a.pendingEmail,"string|goog.soy.data.SanitizedContent");b="";a="You originally wanted to sign in with "+K(a.pendingEmail);d="Continue with "+(K(d)+"?");b+='

    Sign in

    '+d+'

    '+a+'

    ";return J(b)};Tf.soyTemplateName="firebaseui.auth.soy2.page.emailMismatch"; var Uf=function(a,b,c){c=c||{};M(m(a.email)||a.email instanceof I,"email",a.email,"string|goog.soy.data.SanitizedContent");a=""+('

    Verify account password

    Please verify the account password to complete the requested account email change.

    '+ K(Ve({email:a.email,disabled:!0,changeEmail:!1}))+K(Ze())+'
    ");return J(a)};Uf.soyTemplateName="firebaseui.auth.soy2.page.emailChangeVerify"; var Vf=function(a,b,c){c=c||{};a=Ga(a.providerIds,"expected parameter 'providerIds' of type list.");var d='")};Vf.soyTemplateName="firebaseui.auth.soy2.page.providerSignIn";var Wf={},Xf=0,Zf=function(a,b){if(!a)throw Error("Event target element must be provided!");var c=Yf(a);if(Wf[c]&&Wf[c].length)for(var d=0;dd||d>(a.children_?a.children_.length:0))throw Error("Child component index out of bounds");a.childIndex_&&a.children_||(a.childIndex_={},a.children_=[]);if(c.getParent()==a){var e=c.getId();a.childIndex_[e]=c;Pa(a.children_,c)}else Za(a.childIndex_,c.getId(),c);Nd(c, a);Ta(a.children_,d,0,c);c.inDocument_&&a.inDocument_&&c.getParent()==a?(a=a.element_,d=a.childNodes[d]||null,d!=c.getElement()&&a.insertBefore(c.getElement(),d)):a.inDocument_&&!c.inDocument_&&c.element_&&c.element_.parentNode&&1==c.element_.parentNode.nodeType&&c.enterDocument();c.render(b)},og=function(a,b){Kd(b,"emailInfo");ng(a,a.getElementByClass("firebaseui-id-email-info-container"),b)},pg=function(a,b){Kd(b,"passwordInfo");ng(a,a.getElementByClass("firebaseui-id-password-info-container"), b)},qg=function(a,b){Kd(b,"linkedAccounts");ng(a,a.getElementByClass("firebaseui-id-linked-accounts-container"),b)};var rg=function(a){Q.call(this,Bf,void 0,a,"callback")};t(rg,Q);var sg=function(a,b,c,d){Q.call(this,Mf,{email:c},d,"emailChange");this.onSubmitClick_=a;this.onCancelClick_=b};t(sg,Q);sg.prototype.enterDocument=function(){this.initEmailElement();this.initFormElement(this.onSubmitClick_,this.onCancelClick_);ig(this,this.getEmailElement(),this.onSubmitClick_);this.getEmailElement().focus();sg.superClass_.enterDocument.call(this)};sg.prototype.disposeInternal=function(){this.onCancelClick_=this.onSubmitClick_=null;sg.superClass_.disposeInternal.call(this)}; r(sg.prototype,{getEmailElement:Ke,getEmailErrorElement:Oe,initEmailElement:Pe,getEmail:Qe,checkAndGetEmail:Re,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var tg=function(a,b,c,d){Q.call(this,Hf,{email:a,allowContinue:!!c},d,"emailChangeRevoke");this.onResetPasswordClick_=b;this.onContinueClick_=c||null};t(tg,Q);tg.prototype.enterDocument=function(){var a=this;Td(this,this.getElementByClass("firebaseui-id-reset-password-link"),function(){a.onResetPasswordClick_()});this.onContinueClick_&&(this.initFormElement(this.onContinueClick_),this.getSubmitElement().focus());tg.superClass_.enterDocument.call(this)}; tg.prototype.disposeInternal=function(){this.onResetPasswordClick_=this.onContinueClick_=null;tg.superClass_.disposeInternal.call(this)};r(tg.prototype,{getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var ug=function(a,b,c){Q.call(this,Uf,{email:a},c,"emailChangeVerify");this.onSubmitClick_=b};t(ug,Q);ug.prototype.enterDocument=function(){this.initEmailElement();this.initPasswordElement();this.initFormElement(this.onSubmitClick_);ig(this,this.getPasswordElement(),this.onSubmitClick_);this.getPasswordElement().focus();ug.superClass_.enterDocument.call(this)};ug.prototype.disposeInternal=function(){this.onSubmitClick_=null;ug.superClass_.disposeInternal.call(this)}; r(ug.prototype,{getEmailElement:Ke,getEmailErrorElement:Oe,initEmailElement:Pe,getEmail:Qe,checkAndGetEmail:Re,getPasswordElement:sf,getPasswordErrorElement:tf,initPasswordElement:uf,checkAndGetPassword:vf,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var vg=function(a,b,c,d,e){Q.call(this,Tf,{userEmail:a,pendingEmail:b},e,"emailMismatch");this.onContinueClick_=c;this.onCancelClick_=d};t(vg,Q);vg.prototype.enterDocument=function(){this.initFormElement(this.onContinueClick_,this.onCancelClick_);this.getSubmitElement().focus();vg.superClass_.enterDocument.call(this)};vg.prototype.disposeInternal=function(){this.onCancelClick_=this.onSubmitClick_=null;vg.superClass_.disposeInternal.call(this)}; r(vg.prototype,{getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var wg=function(a,b,c,d){Q.call(this,Df,{email:a,providerId:b},d,"federatedLinking");this.onSubmitClick_=c};t(wg,Q);wg.prototype.enterDocument=function(){this.initFormElement(this.onSubmitClick_);this.getSubmitElement().focus();wg.superClass_.enterDocument.call(this)};wg.prototype.disposeInternal=function(){this.onSubmitClick_=null;wg.superClass_.disposeInternal.call(this)};r(wg.prototype,{getSubmitElement:N,initFormElement:O});var R=function(a,b,c,d,e){Q.call(this,a,b,d,e||"notice");this.onContinueClick_=c||null};t(R,Q);R.prototype.enterDocument=function(){this.onContinueClick_&&(this.initFormElement(this.onContinueClick_),this.getSubmitElement().focus());R.superClass_.enterDocument.call(this)};R.prototype.disposeInternal=function(){this.onContinueClick_=null;R.superClass_.disposeInternal.call(this)};r(R.prototype,{getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O}); var xg=function(a,b,c){R.call(this,Af,{email:a,allowContinue:!!b},b,c,"passwordRecoveryEmailSent")};t(xg,R);var yg=function(a,b){R.call(this,Jf,{allowContinue:!!a},a,b,"emailVerificationSuccess")};t(yg,R);var zg=function(a,b){R.call(this,Kf,{allowContinue:!!a},a,b,"emailVerificationFailure")};t(zg,R);var Ag=function(a,b){R.call(this,Ff,{allowContinue:!!a},a,b,"passwordResetSuccess")};t(Ag,R);var Bg=function(a,b){R.call(this,Gf,{allowContinue:!!a},a,b,"passwordResetFailure")};t(Bg,R); var Cg=function(a,b){R.call(this,Pf,null,a,b,"passwordChangeSuccess")};t(Cg,R);var Dg=function(a,b){R.call(this,If,{allowContinue:!!a},a,b,"emailChangeRevokeFailure")};t(Dg,R);var Eg=function(a,b){R.call(this,Qf,{errorMessage:a},void 0,b,"unrecoverableError")};t(Eg,R);var Fg=function(a,b,c){Q.call(this,Of,{},c,"passwordChange");this.onSubmitClick_=a;this.onCancelClick_=b};t(Fg,Q);Fg.prototype.enterDocument=function(){this.initNewPasswordElement();this.initFormElement(this.onSubmitClick_,this.onCancelClick_);ig(this,this.getNewPasswordElement(),this.onSubmitClick_);this.getNewPasswordElement().focus();Fg.superClass_.enterDocument.call(this)};Fg.prototype.disposeInternal=function(){this.onCancelClick_=this.onSubmitClick_=null;Fg.superClass_.disposeInternal.call(this)}; r(Fg.prototype,{getNewPasswordElement:mf,getNewPasswordErrorElement:pf,getPasswordToggleElement:nf,initNewPasswordElement:qf,checkAndGetNewPassword:rf,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var Gg=function(a,b,c,d){Q.call(this,Cf,{email:a},d,"passwordLinking");this.onSubmitClick_=b;this.onForgotClick_=c};t(Gg,Q);Gg.prototype.enterDocument=function(){this.initPasswordElement();this.initFormElement(this.onSubmitClick_,this.onForgotClick_);ig(this,this.getPasswordElement(),this.onSubmitClick_);this.getPasswordElement().focus();Gg.superClass_.enterDocument.call(this)};Gg.prototype.disposeInternal=function(){this.onSubmitClick_=null;Gg.superClass_.disposeInternal.call(this)}; Gg.prototype.checkAndGetEmail=function(){return Da(C(this.getElementByClass("firebaseui-id-email")))};r(Gg.prototype,{getPasswordElement:sf,getPasswordErrorElement:tf,initPasswordElement:uf,checkAndGetPassword:vf,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var Hg=function(a,b,c,d){Q.call(this,zf,{email:c,allowCancel:!!b},d,"passwordRecovery");this.onSubmitClick_=a;this.onCancelClick_=b};t(Hg,Q);Hg.prototype.enterDocument=function(){this.initEmailElement();this.initFormElement(this.onSubmitClick_,this.onCancelClick_);C(this.getEmailElement())||this.getEmailElement().focus();ig(this,this.getEmailElement(),this.onSubmitClick_);Hg.superClass_.enterDocument.call(this)}; Hg.prototype.disposeInternal=function(){this.onCancelClick_=this.onSubmitClick_=null;Hg.superClass_.disposeInternal.call(this)};r(Hg.prototype,{getEmailElement:Ke,getEmailErrorElement:Oe,initEmailElement:Pe,getEmail:Qe,checkAndGetEmail:Re,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var Ig=function(a,b,c){Q.call(this,Ef,{email:a},c,"passwordReset");this.onSubmitClick_=b};t(Ig,Q);Ig.prototype.enterDocument=function(){this.initNewPasswordElement();this.initFormElement(this.onSubmitClick_);ig(this,this.getNewPasswordElement(),this.onSubmitClick_);this.getNewPasswordElement().focus();Ig.superClass_.enterDocument.call(this)};Ig.prototype.disposeInternal=function(){this.onSubmitClick_=null;Ig.superClass_.disposeInternal.call(this)}; r(Ig.prototype,{getNewPasswordElement:mf,getNewPasswordErrorElement:pf,getPasswordToggleElement:nf,initNewPasswordElement:qf,checkAndGetNewPassword:rf,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var Jg=function(a,b,c,d){Q.call(this,xf,{email:c},d,"passwordSignIn");this.onSubmitClick_=a;this.onForgotClick_=b};t(Jg,Q);Jg.prototype.enterDocument=function(){this.initEmailElement();this.initPasswordElement();this.initFormElement(this.onSubmitClick_,this.onForgotClick_);hg(this,this.getEmailElement(),this.getPasswordElement());ig(this,this.getPasswordElement(),this.onSubmitClick_);C(this.getEmailElement())?this.getPasswordElement().focus():this.getEmailElement().focus();Jg.superClass_.enterDocument.call(this)}; Jg.prototype.disposeInternal=function(){this.onForgotClick_=this.onSubmitClick_=null;Jg.superClass_.disposeInternal.call(this)};r(Jg.prototype,{getEmailElement:Ke,getEmailErrorElement:Oe,initEmailElement:Pe,getEmail:Qe,checkAndGetEmail:Re,getPasswordElement:sf,getPasswordErrorElement:tf,initPasswordElement:uf,checkAndGetPassword:vf,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var Kg=function(a,b,c,d,e,f){Q.call(this,yf,{email:d,name:e,tosUrl:a,allowCancel:!!c},f,"passwordSignUp");this.onSubmitClick_=b;this.onCancelClick_=c};t(Kg,Q); Kg.prototype.enterDocument=function(){this.initEmailElement();this.initNameElement();this.initNewPasswordElement();this.initFormElement(this.onSubmitClick_,this.onCancelClick_);hg(this,this.getEmailElement(),this.getNameElement());hg(this,this.getNameElement(),this.getNewPasswordElement());this.onSubmitClick_&&ig(this,this.getNewPasswordElement(),this.onSubmitClick_);C(this.getEmailElement())?C(this.getNameElement())?this.getNewPasswordElement().focus():this.getNameElement().focus():this.getEmailElement().focus(); Kg.superClass_.enterDocument.call(this)};Kg.prototype.disposeInternal=function(){this.onCancelClick_=this.onSubmitClick_=null;Kg.superClass_.disposeInternal.call(this)}; r(Kg.prototype,{getEmailElement:Ke,getEmailErrorElement:Oe,initEmailElement:Pe,getEmail:Qe,checkAndGetEmail:Re,getNameElement:kf,getNameErrorElement:lf,initNameElement:function(){var a=kf.call(this),b=lf.call(this);Pd(this,a,function(){Wd(b)&&(H(a,!0),Ud(b))})},checkAndGetName:function(){var a=kf.call(this),b;b=lf.call(this);var c=C(a),c=!/^[\s\xa0]*$/.test(null==c?"":String(c));H(a,c);c?(Ud(b),b=!0):(Vd(b,pe("Enter your account name").toString()),b=!1);return b?pa(v(C(a))):null},getNewPasswordElement:mf, getNewPasswordErrorElement:pf,getPasswordToggleElement:nf,initNewPasswordElement:qf,checkAndGetNewPassword:rf,getSubmitElement:N,getSecondaryLinkElement:Se,initFormElement:O});var Lg=function(a,b,c){Q.call(this,Vf,{providerIds:b},c,"providerSignIn");this.onIdpClick_=a};t(Lg,Q);Lg.prototype.enterDocument=function(){this.initIdpList(this.onIdpClick_);Lg.superClass_.enterDocument.call(this)};Lg.prototype.disposeInternal=function(){this.onIdpClick_=null;Lg.superClass_.disposeInternal.call(this)};r(Lg.prototype,{initIdpList:function(a){for(var b=this.getElementsByClass("firebaseui-id-idp-button"),c=function(b){a(b)},d=0;dd)return null;var e=a.indexOf("&",d);if(0>e||e>c)e=c;d+=b.length+1;return decodeURIComponent(a.substr(d,e-d).replace(/\+/g," "))},Sg=/[?&]($|#)/;var Tg=function(a,b){this.domain_=this.userInfo_=this.scheme_="";this.port_=null;this.fragment_=this.path_="";this.ignoreCase_=this.isReadOnly_=!1;var c;if(a instanceof Tg)this.ignoreCase_=aa(b)?b:a.ignoreCase_,Ug(this,a.scheme_),c=a.userInfo_,S(this),this.userInfo_=c,c=a.domain_,S(this),this.domain_=c,Vg(this,a.port_),c=a.path_,S(this),this.path_=c,Wg(this,a.queryData_.clone()),Xg(this,a.fragment_);else if(a&&(c=String(a).match(Ng))){this.ignoreCase_=!!b;Ug(this,c[1]||"",!0);var d=c[2]||"";S(this); this.userInfo_=Yg(d);d=c[3]||"";S(this);this.domain_=Yg(d,!0);Vg(this,c[4]);d=c[5]||"";S(this);this.path_=Yg(d,!0);Wg(this,c[6]||"",!0);Xg(this,c[7]||"",!0)}else this.ignoreCase_=!!b,this.queryData_=new Zg(null,0,this.ignoreCase_)}; Tg.prototype.toString=function(){var a=[],b=this.scheme_;b&&a.push($g(b,ah,!0),":");var c=this.domain_;if(c||"file"==b)a.push("//"),(b=this.userInfo_)&&a.push($g(b,ah,!0),"@"),a.push(encodeURIComponent(String(c)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),c=this.port_,null!=c&&a.push(":",String(c));if(c=this.path_)this.domain_&&"/"!=c.charAt(0)&&a.push("/"),a.push($g(c,"/"==c.charAt(0)?bh:ch,!0));(c=this.queryData_.toString())&&a.push("?",c);(c=this.fragment_)&&a.push("#",$g(c,dh));return a.join("")}; Tg.prototype.resolve=function(a){var b=this.clone(),c=!!a.scheme_;c?Ug(b,a.scheme_):c=!!a.userInfo_;if(c){var d=a.userInfo_;S(b);b.userInfo_=d}else c=!!a.domain_;c?(d=a.domain_,S(b),b.domain_=d):c=null!=a.port_;d=a.path_;if(c)Vg(b,a.port_);else if(c=!!a.path_){if("/"!=d.charAt(0))if(this.domain_&&!this.path_)d="/"+d;else{var e=b.path_.lastIndexOf("/");-1!=e&&(d=b.path_.substr(0,e+1)+d)}e=d;if(".."==e||"."==e)d="";else if(-1!=e.indexOf("./")||-1!=e.indexOf("/.")){for(var d=0==e.lastIndexOf("/",0), e=e.split("/"),f=[],g=0;gb)throw Error("Bad port number "+b);a.port_=b}else a.port_=null},Wg=function(a,b,c){S(a);b instanceof Zg?(a.queryData_=b,a.queryData_.setIgnoreCase(a.ignoreCase_)):(c||(b=$g(b,eh)),a.queryData_=new Zg(b,0,a.ignoreCase_));return a},Xg=function(a,b,c){S(a);a.fragment_=c?Yg(b):b;return a},S=function(a){if(a.isReadOnly_)throw Error("Tried to modify a read-only Uri"); };Tg.prototype.setIgnoreCase=function(a){this.ignoreCase_=a;this.queryData_&&this.queryData_.setIgnoreCase(a);return this}; var fh=function(a){return a instanceof Tg?a.clone():new Tg(a,void 0)},gh=function(a){var b=window.location.href;b instanceof Tg||(b=fh(b));a instanceof Tg||(a=fh(a));return b.resolve(a)},Yg=function(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""},$g=function(a,b,c){return m(a)?(a=encodeURI(a).replace(b,hh),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null},hh=function(a){a=a.charCodeAt(0);return"%"+(a>>4&15).toString(16)+(a&15).toString(16)},ah=/[#\/\?@]/g,ch=/[\#\?:]/g, bh=/[\#\?]/g,eh=/[\#\?@]/g,dh=/#/g,Zg=function(a,b,c){this.count_=this.keyMap_=null;this.encodedQuery_=a||null;this.ignoreCase_=!!c},ih=function(a){a.keyMap_||(a.keyMap_=new Yb,a.count_=0,a.encodedQuery_&&Og(a.encodedQuery_,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))};h=Zg.prototype;h.add=function(a,b){ih(this);this.encodedQuery_=null;a=jh(this,a);var c=this.keyMap_.get(a);c||this.keyMap_.set(a,c=[]);c.push(b);this.count_=Ca(this.count_)+1;return this}; h.remove=function(a){ih(this);a=jh(this,a);return this.keyMap_.containsKey(a)?(this.encodedQuery_=null,this.count_=Ca(this.count_)-this.keyMap_.get(a).length,this.keyMap_.remove(a)):!1};h.containsKey=function(a){ih(this);a=jh(this,a);return this.keyMap_.containsKey(a)};h.getKeys=function(){ih(this);for(var a=this.keyMap_.getValues(),b=this.keyMap_.getKeys(),c=[],d=0;d=Gh(this).value)for(p(b)&&(b=b()),a=new yh(a,String(b),this.name_),c&&(a.exception_=c),c="log:"+a.msg_,l.console&&(l.console.timeStamp?l.console.timeStamp(c):l.console.markTimeline&&l.console.markTimeline(c)),l.msWriteProfilerMark&&l.msWriteProfilerMark(c),c=this;c;){b=c;var d=a;if(b.handlers_)for(var e=0,f;f=b.handlers_[e];e++)f(d);c=c.getParent()}}; var Hh={},Ih=null,Jh=function(){Ih||(Ih=new Ah(""),Hh[""]=Ih,Ih.setLevel(Fh))},Kh=function(a){Jh();var b;if(!(b=Hh[a])){b=new Ah(a);var c=a.lastIndexOf("."),d=a.substr(c+1),c=Kh(a.substr(0,c));c.getChildren()[d]=b;b.parent_=c;Hh[a]=b}return b};var Lh=function(){this.relativeTimeStart_=la()},Mh=new Lh;Lh.prototype.set=function(a){this.relativeTimeStart_=a};Lh.prototype.reset=function(){this.set(la())};Lh.prototype.get=function(){return this.relativeTimeStart_};var Nh=function(a){this.prefix_=a||"";this.startTimeProvider_=Mh};h=Nh.prototype;h.appendNewline=!0;h.showAbsoluteTime=!0;h.showRelativeTime=!0;h.showLoggerName=!0;h.showExceptionText=!1;h.showSeverityLevel=!1;var Oh=function(a){return 10>a?"0"+a:String(a)},Ph=function(a,b){var c=(a.time_-b)/1E3,d=c.toFixed(3),e=0;if(1>c)e=2;else for(;100>c;)e++,c*=10;for(;0=c.length)throw Wb;var d=Da(c.key(b++));if(a)return d;d=c.getItem(d);if(!m(d))throw"Storage mechanism: Invalid value was encountered";return d};return d};h.key=function(a){return this.storage_.key(a)};var pi=function(){var a=null;try{a=window.localStorage||null}catch(b){}this.storage_=a};t(pi,ni);var qi=function(){var a=null;try{a=window.sessionStorage||null}catch(b){}this.storage_=a};t(qi,ni);var ri=function(a,b){this.mechanism_=a;this.prefix_=b+"::"};t(ri,mi);ri.prototype.set=function(a,b){this.mechanism_.set(this.prefix_+a,b)};ri.prototype.get=function(a){return this.mechanism_.get(this.prefix_+a)};ri.prototype.remove=function(a){this.mechanism_.remove(this.prefix_+a)}; ri.prototype.__iterator__=function(a){var b=this.mechanism_.__iterator__(!0),c=this,d=new Xb;d.next=function(){for(var d=b.next();d.substr(0,c.prefix_.length)!=c.prefix_;)d=b.next();return a?d.substr(c.prefix_.length):c.mechanism_.get(d)};return d};var si=function(a){a=String(a);if(/^\s*$/.test(a)?0:/^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g,"@").replace(/(?:"[^"\\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)[\s\u2028\u2029]*(?=:|,|]|}|$)/g,"]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g,"")))try{return eval("("+a+")")}catch(b){}throw Error("Invalid JSON string: "+a);},vi=function(a){var b=[];ti(new ui,a,b);return b.join("")},ui=function(){this.replacer_=void 0},ti=function(a,b, c){if(null==b)c.push("null");else{if("object"==typeof b){if(fa(b)){var d=b;b=d.length;c.push("[");for(var e="",f=0;f',Da(gb(f),"must provide justification"),v(!/^[\s\xa0]*$/.test(gb(f)),"must provide non-empty justification"),b.document.write(rb((new qb).initSecurityPrivateDoNotAccessOrElse_(c))),b.document.close())):b=b.open(ib(a),d,f);b&&b.focus()},Si=function(a){a=ha(a)&& 1==a.nodeType?a:document.querySelector(String(a));if(null==a)throw Error("Could not find the Firebase UI widget element on the page.");return a};var Ti=function(){this.config_=new th;uh(this.config_,"acUiConfig");uh(this.config_,"accountChooserEnabled",!0);uh(this.config_,"callbacks");uh(this.config_,"idpConfig");uh(this.config_,"popupMode",!1);uh(this.config_,"queryParameterForSignInSuccessUrl","signInSuccessUrl");uh(this.config_,"queryParameterForWidgetMode","mode");uh(this.config_,"signInOptions");uh(this.config_,"signInSuccessUrl");uh(this.config_,"siteName");uh(this.config_,"tosUrl");uh(this.config_,"widgetUrl")},Ui={AFTER_AC_STORE:"afterStore", CALLBACK:"callback",MANAGE_ACCOUNT:"manageAccount",MOBILE_LINK_ACCOUNT:"linkAccount",RECOVER_EMAIL:"recoverEmail",RECOVER_PASSWORD:"recoverPassword",RESET_PASSWORD:"resetPassword",SELECT:"select",VERIFY_EMAIL:"verifyEmail"},Wi=function(a,b){var c=vh(a.config_,"widgetUrl");return Vi(a,c,b)},Xi=function(a){var b=a.config_.get("widgetUrl");b||(b=Xg(fh(window.location.href),""),b=Wg(b,"",void 0).toString());return Vi(a,b,"select")},Vi=function(a,b,c){if(c){a=Yi(a);for(var d=b.search(Qg),e=0,f,g=[];0<= (f=Pg(b,e,a,d));)g.push(b.substring(e,f)),e=Math.min(b.indexOf("&",f)+1||d,d);g.push(b.substr(e));b=[g.join("").replace(Sg,"$1"),"&",a];null!=c&&b.push("=",encodeURIComponent(String(c)));b[1]&&(c=b[0],a=c.indexOf("#"),0<=a&&(b.push(c.substr(a)),b[0]=c=c.substr(0,a)),a=c.indexOf("?"),0>a?b[1]="?":a==c.length-1&&(b[1]=void 0));return b.join("")}return b},Zi=function(a,b){var c=a.config_.get("idpConfig")||{};return xh(b)&&c[b]?(c=c[b].scopes||null,fa(c)?c:[]):[]},Yi=function(a){return vh(a.config_,"queryParameterForWidgetMode")}, $i=function(a){return a.config_.get("callbacks")||{}},aj=function(a){return!!a.config_.get("accountChooserEnabled")};Ti.prototype.setConfig=function(a){for(var b in a)try{this.config_.update(b,a[b])}catch(c){Yh('Invalid config: "'+b+'"')}wb&&this.config_.update("popupMode",!1)};Ti.prototype.update=function(a,b){this.config_.update(a,b)};var W={},X=function(a,b,c,d){var e=W[a];Ea(e);e.apply(null,Array.prototype.slice.call(arguments,1))};/* Portions of this code are from MochiKit, received by The Closure Authors under the MIT license. All other code is Copyright 2005-2009 The Closure Authors. All Rights Reserved. */ var bj=function(a,b){this.sequence_=[];this.onCancelFunction_=a;this.defaultScope_=b||null;this.hadError_=this.fired_=!1;this.result_=void 0;this.silentlyCanceled_=this.blocking_=this.blocked_=!1;this.unhandledErrorId_=0;this.parent_=null;this.branches_=0}; bj.prototype.cancel=function(a){if(this.fired_)this.result_ instanceof bj&&this.result_.cancel();else{if(this.parent_){var b=this.parent_;delete this.parent_;a?b.cancel(a):(b.branches_--,0>=b.branches_&&b.cancel())}this.onCancelFunction_?this.onCancelFunction_.call(this.defaultScope_,this):this.silentlyCanceled_=!0;this.fired_||cj(this,new dj)}};bj.prototype.continue_=function(a,b){this.blocked_=!1;ej(this,a,b)}; var ej=function(a,b,c){a.fired_=!0;a.result_=c;a.hadError_=!b;fj(a)},hj=function(a){if(a.fired_){if(!a.silentlyCanceled_)throw new gj;a.silentlyCanceled_=!1}};bj.prototype.callback=function(a){hj(this);ij(a);ej(this,!0,a)};var cj=function(a,b){hj(a);ij(b);ej(a,!1,b)},ij=function(a){v(!(a instanceof bj),"An execution sequence may not be initiated with a blocking Deferred.")},jj=function(a,b,c,d){v(!a.blocking_,"Blocking Deferreds can not be re-used");a.sequence_.push([b,c,d]);a.fired_&&fj(a)}; bj.prototype.then=function(a,b,c){var d,e,f=new id(function(a,b){d=a;e=b});jj(this,d,function(a){a instanceof dj?f.cancel():e(a)});return f.then(a,b,c)};ed(bj); var kj=function(a){return La(a.sequence_,function(a){return p(a[1])})},fj=function(a){if(a.unhandledErrorId_&&a.fired_&&kj(a)){var b=a.unhandledErrorId_,c=lj[b];c&&(l.clearTimeout(c.id_),delete lj[b]);a.unhandledErrorId_=0}a.parent_&&(a.parent_.branches_--,delete a.parent_);for(var b=a.result_,d=c=!1;a.sequence_.length&&!a.blocked_;){var e=a.sequence_.shift(),f=e[0],g=e[1],e=e[2];if(f=a.hadError_?g:f)try{var k=f.call(e||a.defaultScope_,b);aa(k)&&(a.hadError_=a.hadError_&&(k==b||k instanceof Error), a.result_=b=k);if(fd(b)||"function"===typeof l.Promise&&b instanceof l.Promise)d=!0,a.blocked_=!0}catch(w){b=w,a.hadError_=!0,kj(a)||(c=!0)}}a.result_=b;d&&(k=q(a.continue_,a,!0),d=q(a.continue_,a,!1),b instanceof bj?(jj(b,k,d),b.blocking_=!0):b.then(k,d));c&&(b=new mj(b),lj[b.id_]=b,a.unhandledErrorId_=b.id_)},gj=function(){u.call(this)};t(gj,u);gj.prototype.message="Deferred has already fired";gj.prototype.name="AlreadyCalledError";var dj=function(){u.call(this)};t(dj,u);dj.prototype.message="Deferred was canceled"; dj.prototype.name="CanceledError";var mj=function(a){this.id_=l.setTimeout(q(this.throwError,this),0);this.error_=a};mj.prototype.throwError=function(){v(lj[this.id_],"Cannot throw an error that is not scheduled.");delete lj[this.id_];throw this.error_;};var lj={};var rj=function(){var a={},b=a.document||document,c=document.createElement("SCRIPT"),d={script_:c,timeout_:void 0},e=new bj(nj,d),f=null,g=null!=a.timeout?a.timeout:5E3;0=this.maxRows&&a.preventDefault()};a.prototype.onFocus_=function(){this.element_.classList.add(this.CssClasses_.IS_FOCUSED)};a.prototype.onBlur_=function(){this.element_.classList.remove(this.CssClasses_.IS_FOCUSED)};a.prototype.onReset_=function(){this.updateClasses_()};a.prototype.updateClasses_=function(){this.checkDisabled();this.checkValidity();this.checkDirty();this.checkFocus()};a.prototype.checkDisabled=function(){this.input_.disabled?this.element_.classList.add(this.CssClasses_.IS_DISABLED): this.element_.classList.remove(this.CssClasses_.IS_DISABLED)};a.prototype.checkDisabled=a.prototype.checkDisabled;a.prototype.checkFocus=function(){this.element_.querySelector(":focus")?this.element_.classList.add(this.CssClasses_.IS_FOCUSED):this.element_.classList.remove(this.CssClasses_.IS_FOCUSED)};a.prototype.checkFocus=a.prototype.checkFocus;a.prototype.checkValidity=function(){this.input_.validity&&(this.input_.validity.valid?this.element_.classList.remove(this.CssClasses_.IS_INVALID):this.element_.classList.add(this.CssClasses_.IS_INVALID))}; a.prototype.checkValidity=a.prototype.checkValidity;a.prototype.checkDirty=function(){this.input_.value&&0