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
================================================

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

## 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
================================================
It combines Pomodoro Technique with a team status share board
Features
Set Pomodoro Timer
Track energy level
Share task status
Give thumbs up
Show speech bubble
Analyze key metrics
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.
")};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+='";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+='";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='";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+='";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+'
')};
Nf.soyTemplateName="firebaseui.auth.soy2.page.passwordInfo";
var Of=function(a,b,c){c=c||{};a=""+('");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+='
',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='
';a.showTitle&&(b+='
Manage account
');return J(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+='";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=""+('");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